OpenEdv-开源电子网

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

大神请留步,MODBUS问题

[复制链接]

21

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2018-6-6
在线时间
96 小时
发表于 2018-9-23 21:13:54 | 显示全部楼层 |阅读模式
20金钱
自己前面写了一个MODBUS的程序,现在从机正常了,但主机的接收不太正常,接收完一帧完整数据的标志无法置1,各位帮忙看一下。

MODBUS从机.zip

94.68 KB, 下载次数: 57

MODBUS主机.zip

99.28 KB, 下载次数: 48

最佳答案

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

使用道具 举报

21

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2018-6-6
在线时间
96 小时
 楼主| 发表于 2018-9-23 21:13:55 | 显示全部楼层
回复

使用道具 举报

21

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2018-6-6
在线时间
96 小时
 楼主| 发表于 2018-9-23 21:55:40 | 显示全部楼层
void TIM3_IRQHandler(void)
{
if((TIM3_SR&1)==1)
        {
                TIM3_SR=0;
                if(modbus.timrun!=0)  //定时器开始计时
                {
                        modbus.timout++;  //每一毫秒加一次(达到4毫秒就认为一帧数据已收到)
                        if(modbus.timout>=5)//间隔时间达到了时间
                        {
                                modbus.timrun=0;//关闭定时器--停止定时
                               
                                modbus.reflag=1;//收到一帧数据
                                /* 为什么这里的modbus.reflag一直置不了1*/
                        }
                               
                }
        }       

}
/*每收到一个字节触发一次中断*/
void USART2_IRQHandler(void)
{
        if((UART2_SR&1<<5)!=0)
        {
                flag=UART2_DR;
                if(modbus.reflag==1)//有数据包正在处理
                {
                        return;
                }
                modbus.rcbuf[modbus.recount++]=flag;
                modbus.timout=0;//每收到一个字节,数据断续时间就要清0
                if(modbus.recount==1)//收到主机发来的一帧数据的第一字节
                {
                        modbus.timrun=1;//启动定时
                }
        }
}
回复

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-9-24 10:42:13 | 显示全部楼层
测试下能否进入定时3的中断并且执行到所需语句。
不知道是否有其他因素,但从这段代码看似乎TIM3_SR的判断和赋值有逻辑上的问题。
从modbus的角度分析,用4ms来判断一帧接收结束好像太牵强了,不符合modbus协议的要求。
回复

使用道具 举报

3

主题

102

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2018-9-7
在线时间
22 小时
发表于 2018-9-24 11:09:23 | 显示全部楼层
从你的代码上看,如果从机可以的话,配置上应该是没有问题的。逻辑上似乎也没有出现问题,这样只能从硬件的角度分析了,你不妨可以仿真看一下,是否modbus.reflag是不是一开始就被设置了。
像屎壳螂一样做人,在粪斗中成长......
回复

使用道具 举报

21

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2018-6-6
在线时间
96 小时
 楼主| 发表于 2018-9-24 15:09:51 | 显示全部楼层
xiatianyun 发表于 2018-9-24 10:42
测试下能否进入定时3的中断并且执行到所需语句。
不知道是否有其他因素,但从这段代码看似乎TIM3_SR的判断 ...

从机就是这样配置的,就可以,主机就不行
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2018-9-25
在线时间
2 小时
发表于 2018-9-25 10:25:13 | 显示全部楼层
收到的时候数据接收时间延长200个毫秒
回复

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
发表于 2018-9-25 11:07:59 | 显示全部楼层
modbus协议下应该是3.5个字节的时间。4ms 有待测试 。还有这个启动定时变量,我认为接收一个字节后,直接让 modbus.timou = 0 就可以。完全不需要这个启动定时。
回复

使用道具 举报

21

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2018-6-6
在线时间
96 小时
 楼主| 发表于 2018-9-26 16:23:36 | 显示全部楼层
cicigood123 发表于 2018-9-25 10:25
收到的时候数据接收时间延长200个毫秒

在主函数里吗
回复

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-9-26 19:12:23 | 显示全部楼层
仔细看看Modbus协议,完全不是这么定时的。
7#楼靠谱。
看一帧数据是否接收完毕,然后延时,这个延时有何作用呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 00:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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