串口+modbus通信不成功

2019-07-20 20:38发布

   连续好几天在调试modbus,我用的是原子的战舰stm32f407的板子,里面串口的例程+modbus通信,程序写好了以后用原子提供的串口调试助手可以看到回传的数值,但是我用modbus精灵和modscan调试不通。
  实在找不到错误的原因了,工程打包如下,劳驾哪位大神能给看看啊
 #include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "modbus.h"
#include "timer.h"
extern u8 USART_RX_FLAG;
int main(void)

       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
       delay_init(168);      
       uart_init(19200);   
       LED_Init();         
       TIM3_Int_Init(182,839);
       LED0=!LED0;
      while(1)
      {
            if(USART_RX_FLAG == 0x01)
           {
                USART_RX_FLAG = 0x00;   
                arseRecieve();      
                USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
           }
      }
}
这个事串口的
void USART1_IRQHandler(void)                
{
#ifdef OS_TICKS_PER_SEC 
OSIntEnter();    
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
{
if(USART_RX_NUM < 106)
{
   USART_RX_BUF[USART_RX_NUM]=USART_ReceiveData(USART1);
USART_RX_NUM++;
usDataLen = USART_RX_NUM  - 2 ;
TIM_Cmd(TIM3,ENABLE);
TIM_SetCounter(TIM3, 0);
TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);
}
else
{
USART_RX_NUM  =0;
TIM_Cmd(TIM3,ENABLE);
TIM_SetCounter(TIM3, 0);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
}  
}
else
{
USART_ReceiveData(USART1);
}  
#ifdef OS_TICKS_PER_SEC
OSIntExit();    
#endif

#endif
下面是定时器的
void TIM3_IRQHandler(void)

   if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
   {
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);   
TIM_Cmd(TIM3, DISABLE);                  
if(USART_RX_NUM >= 8)
{
USART_RX_NUM = 0;
USART_RX_FLAG = 1;                          
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
}
else
{
USART_RX_NUM = 0;
}
}
}
下面是modbus数据解析回传的 void ParseRecieve(void) 
{
 
u8 crcDataHi; 
u8 crcDataLo; 
 u8 i=0;
if(USART_RX_BUF[0] == 0x02)
{

crcData = crc16(USART_RX_BUF,usDataLen);
crcDataLo = crcData/256;
crcDataHi = crcData%256; 
if(usDataLen == 6)  
{
if((crcDataHi == USART_RX_BUF[7])&&(crcDataLo == USART_RX_BUF[6]))
{
LED0=!LED0;
if(USART_RX_BUF[1] == 0x01)
{
USART_SX_BUF[0] = USART_RX_BUF[0];
USART_SX_BUF[1] = USART_RX_BUF[1];
USART_SX_BUF[2] = USART_RX_BUF[2];
USART_SX_BUF[3] = USART_RX_BUF[3];
USART_SX_BUF[4] = USART_RX_BUF[4];
USART_SX_BUF[5] = USART_RX_BUF[5];
crcData = crc16(USART_SX_BUF,usDataLen);
  crcDataLo = crcData/256; 
crcDataHi = crcData%256; 
USART_SX_BUF[6] = crcDataLo;
USART_SX_BUF[7] = crcDataHi;
for(i = 0;i < 8;i++)
{
USART_SendData(USART1,USART_SX_BUF);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
}
}
}
}
}
}
下面附件是我的工程



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
458081109
2019-07-21 01:05
回复【3楼】yklstudent:
---------------------------------
谢谢,谢谢,我回去试了一下,我数据Length选择的是8,然后出现CRC校验错误,在保证每其他设置错误的时候,我就试着增加Length的长度,解果发现,当加到18的时候校验通过了,这就让我不太理解了,现在不太理解这个Length的值到底应该怎么计算了,能不能给解释一下啊

一周热门 更多>