找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4984|回复: 0
打印 上一主题 下一主题
收起左侧

基于RS485 的Modbus RTU 接收机制

[复制链接]
跳转到指定楼层
楼主
ID:82781 发表于 2015-6-13 00:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


由于LW同志的白眼所以今晚决定搞一下基于RS485的modbus RTU 模式代码移植。

不同的是LW同志是自己实现,而我是使用现成的Modbus协议栈!

1、Modbus协议栈移植,
协议栈移植代码不算复杂,用了2个小时完成移植 for arm 上运行。移植完毕编译成功
注意端口内的操作函数,注释掉,然后在填充硬件相关部分

2、Modbus
接收层
机理其实就是一个串口中断,然后每接收一个字符都会启动一个定时器计时并且存入BUFF中,同时刷新定时器值,这样如果有字符接收那么定时器就不断的刷新而不会溢出,当一帧接收完毕后定时器由于得不到刷新而溢出,这就会导致定时器的溢出。定时器一旦溢出就会触发一次事件,通知应用层,我收到了一帧报文你可以来取走了。空口无平,要LW同志死心要上代码的,come on !

以上为串口接收到一个字节中断后调用,是一个指针函数,在协议栈初始化的时候他被定义为

也就是说我们只要找到这个函数即可找到串口的底层接收代码,OK继续

很不幸我们找到了,并且看到他从硬件中读了一字节继续
看他如何处理

哈哈到此已经可以看到了首先他状态为,所以先接受存进buff,然后开启定时器
接着如果再有数据中断就会这样

可见是一样的,和上面,那么有字节就会一直这样循环,当然不能大于
最后就是什么时候帧结束了呢?
首先帧结束了会停止中断,然后定时器就得不到刷新,然后定时器就会中断,然后,,,继续

不好意思又是一个函数指针,他也是初始化定义了如下

继续

很明显到这里已经完成了底层的帧截获,他上报给了应用层

也就是说他是利用字节超时作为帧结束的标志。这就RTU模式底层串口的接收处理。仅此而已。并不高深。

3、应用层
底层把数据投递后,应用层通过

函数进行轮训是否收到一帧数据
然后继续


比较孰了吧,这是判断是不是给我们的,或者是不是广播地址,因为广播首地址我们从机也是要接受滴!然后继续告诉上层进入

此处完了之后之各种的读写

然后就是用户针对这些填充的函数实体即可!!!OK


以上是理论分析,实际代码测试不日择机进行!!


有是LW同志!能不能老实点啊

比特电子
老王



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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