由于LW同志的白眼所以今晚决定搞一下基于RS485的modbus RTU 模式代码移植。
不同的是LW同志是自己实现,而我是使用现成的Modbus协议栈!
1、Modbus协议栈移植,
协议栈移植代码不算复杂,用了2个小时完成移植 for arm 上运行。移植完毕编译成功
注意端口内的操作函数,注释掉,然后在填充硬件相关部分

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

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

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

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

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

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

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

继续

很明显到这里已经完成了底层的帧截获,他上报给了应用层
也就是说他是利用字节超时作为帧结束的标志。这就RTU模式底层串口的接收处理。仅此而已。并不高深。
3、应用层
底层把数据投递后,应用层通过

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

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

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

然后就是用户针对这些填充的函数实体即可!!!OK
以上是理论分析,实际代码测试不日择机进行!!
有是LW同志!能不能老实点啊
比特电子
老王
|