读书人

modbus _RTU协议通信用vc++MSComm实

发布时间: 2013-11-25 13:22:27 作者: rapoo

modbus _RTU协议通信,用vc++MSComm实现
我在做基于Modbus通讯协议的串口通信,用vc++的MSComm控件做,用到Modbus_RTU模式,我有点疑惑,如下,想请各位解答一下:我是pc做主机,下面的下位机做从机。
1.我在向下位机发送数据时,是不是也要把该从机的地址也发送出去,发送数据时需要计算CRC校验码吗?需要把计算出来的CRC校验码一起发送出去吗?
2.校验码CRC需要对地址域,功能码也进行校验还是只对数据区进行校验??
3.数据的发送是先发送高字节还是低字节,还是由自己定义?
4.在接受数据时,接受的是消息帧(报文,是指地址域+功能码+数据区+校验码CRC??)需要判断地址和校验码CRC吗?(我的理解是要!)
5.在发送消息帧(消息帧是指地址域+功能码+数据区+校验码CRC??),需要连续发送,不得停顿大于1.5T;还有就是消息帧之间的间隔时间不得小于3.5T,这个T指字符时间,字符时间具体指什么?它是由什么决定的?
6.我每次从缓冲区接受的数据怎么才能知道它是一个完整消息帧了?是不是CRC就是实现这个功能的?

各位CSDN上的朋友,大家一起来给我看看好吗,能有具体的例子就好好了!! Modbus MSComm vc++6.0 TRU模式 串口通信
[解决办法]
串口本身是没有CRC校验的, 所以你要对数据的哪部分作CRC校验, 完全是自己控制.
一般来说CRC校验, 目的是检错, 所以除了CRC结果位,其它数据都要用CRC校验.

串口, 故明思意,就是串行发送数据, 都是按一字节一字节的, 所以不存在高字节还是低字节的问题. 你是什么顺序发送, 那边就是什么顺序接收.

因为数据帧都是你自己定义的, 一般要校验帧是否正确, 只需要作CRC校验就可以了, 你想对地址也作校验, 那也是可以的, 完全靠你自己决定.

波特率决定发送速度, 一般是由硬件缓冲自己调整速度的, 如果缓冲区满, 会阻塞发送的(同步方式下). 我以前做的时候都是循环发送, 并未控制其发送速度. 那个T我也不了解.

因为数据都是你自己定的, 一般来说是需要一个特征码. 如果你的帧是定长的, 也可以按长度, 如果不是定长, 那么最好是用一个特征码来标识一个帧. 比如在帧的头部加一个AB BA 这样, 只要发现AB BA就知道这是一个帧的开始. 这样在一定程度上也可以纠错.
[解决办法]
1、比如:01 03 00 00 00 05 CRCL CRCH,第一个字节01就是你要访问的从站地址,CRC校验:你把前六个字节放在一个数组里,再放到CRC校验的函数里得到CRC校验值,分别放到数组的第7字节位和第8字节位,再把包含校验的数组发出去。
3、好像CRC校验一般默认低字节在前,高字节在后
4、判断地址为了区分是哪个从站的报文,进行CRC校验是为了判断这一帧数据在传输过程中是否有丢失,你校验出来的值和报文中原带的校验位进行比较判断整个报文是否有误。
5、自己认为T就是一字节发送的时间,与波特率有关,如9600 bit/s 1s发送9600位,即1200字节。
6、报文种类少的话可以根据发送报文确定接收报文的种类和长度,再通过得到的长度得到报文,并进行功能码和校验进行判断一帧报文是否正确。modbus-RTU没有明显的起始或结束标志位,我暂时也只用这种方法。

读书人网 >C++

热点推荐