modbus-rtu qt4-serialport3--------micro2440 as device
有了前两文的基础,当然还要加上更前面的一些知识。
1.设备源码不贴了。几点说明。
由于上文的串口类在linux下只能使用poll方式查询串口。所以需要准备一个定时器去polling,4ms(并且串口类的采集串口时间也设为4ms)
但又由于需要识别modbus的帧结束,所以又准备一个定时器,10ms(这样就设定modbus的帧间距时间10ms。而第一个定时器的超时时间定的比第二个定时器的超时时间10ms少一点并且保证2x<10ms,所以定了4ms)。
在第一个定时器读到数据的时候重置第二个定时器。没读到就什么也不做(意味着允许第二个定时器超时),然后在10ms之内,第一个定时器有机会可以再一次读取数据,如果仍然没有读到,那么第二个定时器肯定要超时了。
所以在第二个定时器里面就认为是整个modbus帧了,然后分析数据执行命令。
但是modbus规范上定的帧间距时间为3.5个字符(每个字符4bit)。按照115200b/s的波特率,每位的时间是1/115200=8.68e-6 s=8.68e-3 ms,帧间距应该是x3.5x4=1.22e-4 s=0.122 ms。尽管如此,由于大多数上位机采集数据即发送modbus帧的周期都在100ms以上,所以上面设定10ms的帧间距时间已经满足大多情况下的要求(所以micro2440上第二个定时器也可以省掉。直接使用第一个定时器(比如设为10 ms,串口类的周期也设为10)读取串口数据,读到的基本就是一帧的数据----如果有数据的话)
2.测试。
安装DASMBSerial,主题名配置为micro2440. 右键大图。采集周期默认1000ms就行.
![](http://hi.csdn.net/attachment/201111/29/0_13225318766pY3.gif)
如下是在excel使用管道(进程间通信)测试,
=DASMBSerial|micro2440!'6' =DASMBSerial|micro2440!'40012' =DASMBSerial|micro2440!'$SYS$UpdateInterval' =DASMBSerial|micro2440!'$SYS$ItemCount' =DASMBSerial|micro2440!'$SYS$ActiveItemCount' =DASMBSerial|micro2440!'$SYS$status'如图
![](http://hi.csdn.net/attachment/201111/29/0_1322534895ZLf0.gif)
然后到诊断页看看数据质量怎么样,
![](http://hi.csdn.net/attachment/201111/29/0_1322534826HkSJ.gif)
由于DASMBSerial也会占用串口,但在激活,如图,的时候
![](http://hi.csdn.net/attachment/201111/29/0_1322537579kC4Q.gif)
如果有别的程序已经占用了同相同的串口(或者根本不存在这个串口),DASMBSerial却不提示如打不开等出错信息(并还把当前标志置为绿色貌似已经打开)(一般串口程序在打开串口的时候如果发现被其他程序如DASMBSerial占用时会提示的)。--------这是由于DASMBSerial激活的时候并不执行打开操作,只有在有app如excel ,intouch向DASMBSerial索取数据时,DASMBSerial才会去打开对应的串口并去读数据。
此时需要关闭那个占用串口的程序,并且最好重新激活一次DASMBSerial,然后再打开各个app从DASMBSerial读数据。
所以测试的顺序是
1.确保串口存在并且可用(如果其他app在占用此串口,shut off)
2.激活DASMBSerial
(1,2可以交换一下)
3.打开对应app从DASMBSerial读取数据。
监视到的串口数据如下,显示的时间是10ms单位。write是DASMBSerial->micro2440,read是micro2440-->DASMBSerial。看来DASMBSerial基本是800ms采集一次数据,与配置的1000ms差不多。
![](http://hi.csdn.net/attachment/201111/29/0_1322535356Un60.gif)
或者使用intouch测试而不使用excel,建立访问名如下
![](http://hi.csdn.net/attachment/201111/29/0_1322535931bJ53.gif)