chengtina 发表于 2014-1-8 09:16:16

关于这个通讯协议,烦请大侠们看看是不是还有需要补充...

本帖最后由 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在发送的时候,能收到数据吗?能帮我看看这个需要怎么优化一下对我做软件比较有利吗?

wye11083 发表于 2014-1-8 09:31:47

时间太短了,10ms还不够传一帧的(10ms也就10个字节)。

chengtina 发表于 2014-1-8 09:49:28

wye11083 发表于 2014-1-8 09:31
时间太短了,10ms还不够传一帧的(10ms也就10个字节)。

恩,这个我记下了,谢谢了。
关于第三条,是否需要修正一下?我是在想双方都同时发送数据的话,AVR串口工作会怎么样?发的时候能收到数据么?

wkman 发表于 2014-1-8 10:05:19

叫对方,直接使用,modbus   {:titter:}{:victory:}

michael.yang 发表于 2014-1-8 10:07:23

如果要发送的数据都是ASCII码,则没问题;若是二进制数据,则需要在数据帧里增加“数据长度”的字段。

Halley 发表于 2014-1-8 10:11:19

如果要发送的数据都是BCD码,则没问题;若是二进制数据,则需要在数据帧里增加“数据长度”的字段。

dalarang 发表于 2014-1-8 10:18:30

我觉得要看发送数据是否频繁,不频繁的话即便半双工也不怕。
最好加上个判断,在串口收到数据字节时5ms内不发送数据帧,减少在对方发送数据帧时,己方也发送数据帧的碰撞概率。
如果再错开双方的超时时间,例如一方用50ms超时,另一方用200ms超时,这样即便遇上同时发送数据帧,超时后也不会再次撞上。
超时时间要根据数据帧最大长度和数据帧响应的速度算一下,取个合适值。10ms是有些短。

ahuang227 发表于 2014-1-8 10:44:54

如果双方都发数据是不是就乱掉了?都收不到回复。

这个是个标准长度的尾巴,你能看到这个尾巴说明你的浏览器是正常的。欢迎光临我的淘宝店。

duanll 发表于 2014-1-8 11:31:49

直接用MODBUS吧。。否则,你还要处理双方同发送时的冲突,到时候你会发现复杂得头痛。。。
页: [1]
查看完整版本: 关于这个通讯协议,烦请大侠们看看是不是还有需要补充...