OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5985|回复: 4

串口+modbus通信不成功

[复制链接]

31

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2013-5-30
在线时间
5 小时
发表于 2015-12-4 11:50:05 | 显示全部楼层 |阅读模式
5金钱
   连续好几天在调试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);
}
}
}
}
}
}
下面附件是我的工程




串口+modbus实验.zip

4.49 MB, 下载次数: 2344

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2013-5-30
在线时间
5 小时
 楼主| 发表于 2015-12-7 09:28:49 | 显示全部楼层
回复【3楼】yklstudent:
---------------------------------
谢谢,谢谢,我回去试了一下,我数据Length选择的是8,然后出现CRC校验错误,在保证每其他设置错误的时候,我就试着增加Length的长度,解果发现,当加到18的时候校验通过了,这就让我不太理解了,现在不太理解这个Length的值到底应该怎么计算了,能不能给解释一下啊
回复

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2015-10-21
在线时间
12 小时
发表于 2016-5-17 09:57:56 | 显示全部楼层
刚好要用modbus 控制伺服驱动器 看了这个历程受益匪浅
回复

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2015-10-21
在线时间
12 小时
发表于 2016-5-17 10:22:45 | 显示全部楼层
我只需要通过modbus控制伺服 这个例程里该怎么用呢
回复

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2016-8-22
在线时间
9 小时
发表于 2016-8-22 22:01:33 | 显示全部楼层
我的板子也是战舰f407的,为什么我用modbus POLL 一直显示超时。用的楼主的程序
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 04:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表