OpenEdv-开源电子网

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

求更好的modbusRTU多串口解决方案

[复制链接]

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
发表于 2015-1-23 11:48:48 | 显示全部楼层 |阅读模式
5金钱

现在我要用3个串口同时进行MODBUS RTU,波特率,9600,19200,115200,怎样判断这个3.5个字符时间呢?
我是这样解决的:

使用一个timer,不停地进行1ms中断,优先级最低。
对于串口1,当他接收到数据时置一个标志 jishi1=1和时间计数器jishu1=0;在timer里一旦发现jishi1为1就对jishu1进行计时.
在主函数里判断jishu1是否大于4(对于9600),一旦大于4就说明接收完毕,并使jishi1=0,jishu1=0。串口2、3同理。

有没有更好的方法呢???(注意我是同时使用3个串口进行modbusRTU

另外对于类似这样的格式怎样判断数据包的开始和结束:0xFF 0x55 *****(数据)***** 0xFF 0xAA
在接收中断里接收到0X55时判断前面一个是不是0xFF,来证明开始新的包,一旦接收到0XAA就判断前面一个是不是0xFF,证明接收完成??
如果我用115200的波特率的话是不是中断时间就相对太长了,这一个接收中断好没有处理完,下一个数据已经到来?


谢谢大家了。

最佳答案

查看完整内容[请看2#楼]

在串口接收函数里加个变量,比如 usart1_count_time=5; 就是每接收一个字符就=5(类似于喂狗的思想)。然后在定时器里进行usart1_count_time--;也就是每10ms(或者1ms)减去1。等usart1_count!=0,而usart1_count_time==0就认为接收完成了。结合你的情况,你只需建立三个变量,开一个定时器就可以了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2015-1-23 11:48:49 | 显示全部楼层
在串口接收函数里加个变量,比如 usart1_count_time=5; 就是每接收一个字符就=5(类似于喂狗的思想)。然后在定时器里进行usart1_count_time--;也就是每10ms(或者1ms)减去1。等usart1_count!=0,而usart1_count_time==0就认为接收完成了。结合你的情况,你只需建立三个变量,开一个定时器就可以了。
原子哥是不是又要出黑科技了呀。^_^...
回复

使用道具 举报

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
 楼主| 发表于 2015-1-23 16:41:41 | 显示全部楼层
回复【2楼】fanghuiopenedv:
---------------------------------
谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-26 16:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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