modbus通讯失败_STM32 MODBUS通讯失败
本帖最后由 njzt 于 2015-3-23 17:23 編輯
收到的數據只有一個字節 00,求解
硬件:STM32L152??MAX3485
MAX3485的A和B之間連接120歐電阻,儀表485也有120歐電阻
PB5 做485的控制端
串口1接485的RX和TX,接收中斷
串口3輸出MODBUS接收到的數據
程序:
/***********************************************************************
* @brief ? ? ? ? ? ? ? ? 串口1初始化
*
* @param??? ? ? ? None
*
* @retval ? ? ? ? None
*
**********************************************************************/
void usart1_config()
{
USART_InitTypeDef? ? ? ? USART_InitStructure;
GPIO_InitTypeDef ? ? ? ? GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);??? ? ? ? ? ? ? ? //----1??串口時鐘使能
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);? ?? ? ? ? ? ? ? ? ? ? ? ???//---2??IO時鐘使能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);? ?//--------3 (1) 配置串口管腳
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;? ???//-------------------? ?(2)??配置管腳 AF 模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; //--------------? ?(3)??配置管腳其他參數
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure); //-----------------------------? ?(4)??調用GPIO初始化函數
USART_InitStructure.USART_BaudRate = 9600;? ?//---------------------4? ? ? ? 設置波特率等參數
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init(USART1,&USART_InitStructure);// ---------------------------5 調用串口初始化函數
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 接收中斷
USART_Cmd(USART1, ENABLE);??//----------------------------------------6 開啟串口
}
void NVIC_Config(void)
{
NVIC_InitTypeDef? ? ? ? NVIC_InitStructure;
/************ 配置 USART1 中斷向量*************/
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中斷入口函數:
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
USART_SendData(USART3,USART_ReceiveData(USART1));
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE) == RESET);
}
}
485控制IO配置:
void MODBUS_GPIO()
{
GPIO_InitTypeDef? ?? ???GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //GPIO CLOCK Enable
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
主函數:
uint8_t msg[8] = {0x01,0x04,0x00,0x00,0x00,0x05,0x30,0x09};
int main(void)
{
uint8_t i;
usart3_config();
usart1_config();
NVIC_Config();
MODBUS_GPIO();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5); //485發送
delay_ms(1);
for(i=0;i<8;i++)
{
USART_SendData(USART1,msg);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
//? ? ? ? delay_ms(10);
}
delay_ms(1);
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //485接收
delay_ms(100);
}
}
問題補充:
問題感覺比較奇葩,不接485轉232模塊,串口收不到數據,接上485轉232模塊并接上電腦,數據收發正常
總結
以上是生活随笔為你收集整理的modbus通讯失败_STM32 MODBUS通讯失败的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HCIE-12.9 杭州战报
- 下一篇: 2020电脑蓝屏代码大全