关于这个通讯协议,烦请大侠们看看是不是还有需要补充...
本帖最后由 chengtina 于 2014-1-8 09:46 编辑前提:做一仪器,需要跟对方进行串口通讯。对方发来了通讯协议,具体如下:
一、 通讯约定
1.说明
RS232,全双工
波特率:14400
1起始位,8数据位,1停止位
起始字符:A5H
结束标识:5AH
2.双方都可以主动发送数据;
3.通讯约定:主动发送数据一方为发送方,另外一方为接收方,双方平时都处于空闲状态,接收数据时为接收状态,发送时为发送状态
4.一次通讯过程:发送方主动发送数据,接收方在收到数据后,先判断正误,然后回复消息,如果正确则这次通讯结束,如果错误则双方重复上述过程3次,同时如果发送方在发送了数据后10ms内没有接收到回复消息,也重复上述过程3次,以上过程如果仍然有错误,则上位机方应该提示出错;
5.通讯数据桢基本格式:
1)主动发送的数据格式
起始字符(A5H,1字节)+指令(1字节)+数据+校验(累加和,2字节,不要进位)+ 5AH;
2)回复消息的数据格式,共2字节
起始字符(A5H,1字节)+正误(1字节,00H正确,01H错误)+5AH;
3) 为保证通信正常,提高响应速度,任何一方在接到对方数据后,需要给对方回复消息。
6.作为正误判断的内容有:
1)起始字符
2)命令是否存在
3)数据长度
4)校验对错
5)结束字符
7.传输数据时,当这个数据不只有一个字节,则先传输高字节,后传输低字节;
。
。
。
再后面就是通讯的具体命令的约定。
我想问的是,第三条,是否需要约定通讯一定要由某一方开始。按照目前的,如果双方同时发送数据,会出现怎么样的结果?AVR在发送的时候,能收到数据吗?能帮我看看这个需要怎么优化一下对我做软件比较有利吗?
时间太短了,10ms还不够传一帧的(10ms也就10个字节)。 wye11083 发表于 2014-1-8 09:31
时间太短了,10ms还不够传一帧的(10ms也就10个字节)。
恩,这个我记下了,谢谢了。
关于第三条,是否需要修正一下?我是在想双方都同时发送数据的话,AVR串口工作会怎么样?发的时候能收到数据么? 叫对方,直接使用,modbus {:titter:}{:victory:} 如果要发送的数据都是ASCII码,则没问题;若是二进制数据,则需要在数据帧里增加“数据长度”的字段。 如果要发送的数据都是BCD码,则没问题;若是二进制数据,则需要在数据帧里增加“数据长度”的字段。 我觉得要看发送数据是否频繁,不频繁的话即便半双工也不怕。
最好加上个判断,在串口收到数据字节时5ms内不发送数据帧,减少在对方发送数据帧时,己方也发送数据帧的碰撞概率。
如果再错开双方的超时时间,例如一方用50ms超时,另一方用200ms超时,这样即便遇上同时发送数据帧,超时后也不会再次撞上。
超时时间要根据数据帧最大长度和数据帧响应的速度算一下,取个合适值。10ms是有些短。 如果双方都发数据是不是就乱掉了?都收不到回复。
这个是个标准长度的尾巴,你能看到这个尾巴说明你的浏览器是正常的。欢迎光临我的淘宝店。 直接用MODBUS吧。。否则,你还要处理双方同发送时的冲突,到时候你会发现复杂得头痛。。。
页:
[1]