串口的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 cemer815
  • 开始时间 开始时间
C

cemer815

Unregistered / Unconfirmed
GUEST, unregistred user!
上位机发:AAH + 地址 + C6H + 表号 + FCS + AAH
地址:抄表器的地址,2字节BCD码。表号:1字节BCD码
我在接收的时候怎么做好,可能有很多种异常情况的,怎么不正常的就不处理?
 
我觉得你们制定的协议有点问题诶,都没有指定一个包的长度。只用AAH开头和结尾。
还有,可能出现什么异常情况?不说别人怎么帮你?
 
通讯协议上就应该定义异常情况处理。

1、数据头标志,数据尾标志(或者数据头加长度);
2、加数据校验
 
地址 2个字节了 ,总共就7个字节了
就是说很多同时发上来,可能发了一半,再过1s后再上来另一半
 
加上校验位吧
免得到时候出了问题找不到
 
AA000AC60151AAAAAA0052AA000AC60151AA 发送
comport 为什么要两次收到
<成功收到>:收到字符串!字符串为:(HEX)>AA000AC60151AAAA<
<验测>:地址:(HEX)>000A<是本机.
<验测>:命令:(HEX)>C6<是读表.
<验测>:表号:(HEX)>01<
<验测>:校验和正确.
<成功返回>:发送成功。字符串为:>AA000A0000108913AA<
<成功收到>:收到字符串!字符串为:(HEX)>AA0052AA000AC60151AA52FF<
 
nicai_wgl 已经说的 很正确了
1、数据头标志,数据尾标志(头未标志要不一样);
2、加数据校验:就是每个字节的ASCII相加的总和 再除以128 取余 作为一个字节放在
结尾标志之前 以做验证

数据长度就不需要了,这样通讯的灵活性大一些
 
楼上的说的对,协议有问题,没数据长度,没有校验位,那里不行的,以上两都要才对
 
还是要对协议进行定义一下,一定要有校验,要不怎么知道数据是否正确.
 
严格说来,除了最起码的和校验(好一点可以考虑CRC),和数据长度的指定,还要有一个错误码的返回值。
才是一个较认真的协议。
 
还是定时接收把,开个缓冲,在校验,这样不容易出错误
 
个人认为数据长度不是必须的,但是一定要能区别数据什么时候结束.
比如Delphi中可以用"'"在字符串中表示为''';
 
协议头标志和尾标志不要一样
如果长度是可变的就要加上长度值
在数据尾加上CRC验
接收时只要符合要求的
其余的一律舍弃
 
后退
顶部