求教通讯问题,关于结束符

[复制链接]
7014|25
 楼主| nixianmin 发表于 2011-8-3 23:14 | 显示全部楼层 |阅读模式
在串口通讯一般会用到格式像:        起始符 地址 功能码 数据 校验 结束符
想请教大家,如果在通讯过程中如果前面数据和结束符正好
相同呢,那么这串数据不就提前结束了,校验出错就会放弃掉。

本来想是用如果结束符之前如果有相同用替换的方法,可是问题
又出来了,如何判断数据是替代后还是替代前,晕

我看有些协议是带数据长度的,是不是根据收到的数据长度来判断呢,
有没有不用数据长度的呢,希望大家给我点思路。
受不了了 发表于 2011-8-3 23:41 | 显示全部楼层
用ASCII方式就不会出现这个问题的
DownCloud 发表于 2011-8-3 23:47 | 显示全部楼层
不要用结束符!!!用结束符最不科学的方法。用数据长度,放在最前面。最简单实用。
mohanwei 发表于 2011-8-3 23:52 | 显示全部楼层
加转义。
例如约定帧头为0xFF,帧尾为0xFE,转义为0xFD;帧数据如果出现上述3个字节,则分别用0xFD+0x00,0xFD+0x01,0xFD+0x02代替。接收的时候去掉帧头帧尾和转义,就得到原始的数据了
 楼主| nixianmin 发表于 2011-8-4 07:08 | 显示全部楼层
我是用0x68开始,0x16结束,我认为开始符可以不去管,
因为开始符总是第一个,我们只需判断一次,就可以接收数据,
如果中间出现开始符就是当数据直接接收的。
就是在结束的时候需要判断,像4楼说的如果这样用转义,那么就不存在
开始和结束符了,那样不是更不知道怎么判断开始和结束了,难道每碰到
0xfd都和后面的数据相加??:dizzy:
lixiaoxu2meng 发表于 2011-8-4 08:06 | 显示全部楼层
支持楼主 用ASCII 码传输
 楼主| nixianmin 发表于 2011-8-4 08:28 | 显示全部楼层
ascii码是不是0代表0x30啊
 楼主| nixianmin 发表于 2011-8-4 08:29 | 显示全部楼层
还有,校验我是用的和检验,是不是也有几率出现问题的
受不了了 发表于 2011-8-4 08:32 | 显示全部楼层
本帖最后由 受不了了 于 2011-8-4 08:33 编辑

7# nixianmin
是这样的,不过ASCII码方式的数据量会增倍,而且来回转换也会消耗点时间,用MODBUS RTU好了
 楼主| nixianmin 发表于 2011-8-4 08:47 | 显示全部楼层
我去看看,公司研发没网,悲剧,可能用长度计算也行,改了还要和写数据平台沟通,他那也改
joyme 发表于 2011-8-4 09:02 | 显示全部楼层
基本上用帧长就好了,再加帧头、帧尾可以更保险,和校验跟或检验应该差不多,比奇偶、CRC等校验肯定差一点,看应用场合吧,一般长度、帧头、帧尾及和校验没错,出错的就很小了
 楼主| nixianmin 发表于 2011-8-4 09:24 | 显示全部楼层
嗯,看来还是要加个长度
wzf3151 发表于 2011-8-4 16:24 | 显示全部楼层
最进我也在制定协议中,像楼上提到的用ASCII传输就不出现误判起始符结束符,要是不那样,就用空闲时间作判断。
MODBUS协议就把这两种都约定了,参考吧,我也正在参考!
cecwxf 发表于 2011-8-4 16:35 | 显示全部楼层
又学到一招
yewuyi 发表于 2011-8-4 16:37 | 显示全部楼层
用ASCII方式就不会出现这个问题的
受不了了 发表于 2011-8-3 23:41


愚钝,为何用ASCII就不会出现呢?

数据本身的取值是随机的,可以是任意数值,为何不会出现?

除了4楼的转义办法,不被影响恐怕是不可能的,除非你强行规定数据中永远不得出现那几个数值,但这样的协议就是瘸腿了。
lixiaoxu2meng 发表于 2011-8-4 16:45 | 显示全部楼层
15# yewuyi
我认为针对楼主的问题 用ASCII完全可以解决 除非是帧错误  不然不会出现结束符与数据相同的情况
joyme 发表于 2011-8-4 16:46 | 显示全部楼层
转义也一样可能出错呀,既然是随机数据就没法保证数据里不会出现FD 01两个连续的数据吧
只能是长度加帧头、帧尾一起判断
yewuyi 发表于 2011-8-4 16:59 | 显示全部楼层
转义也一样可能出错呀,既然是随机数据就没法保证数据里不会出现FD 01两个连续的数据吧
只能是长度加帧头、帧尾一起判断
joyme 发表于 2011-8-4 16:46


转义有一套规则,4楼只是简单的说了一点,显然不会这么简单。

我举一个大家常用的方法:
1、取一个关键数0X55,用0X55作为数据包的开始,中间可以有任意多的字节数据,最后也以0X55做为结束数据包的标志,关键数0X55不参与校验和运算。
2、如果传输的数据出现有0X55,则将其替换成0XAA+0X5A,和校验的时候依然按照一个0X55计算
3、如果传输的数据中出现有0XAA,则将其替换成0XAA+0XA5,校验和依然按照一个0XAA计算
yewuyi 发表于 2011-8-4 17:00 | 显示全部楼层
15# yewuyi  
我认为针对楼主的问题 用ASCII完全可以解决 除非是帧错误  不然不会出现结束符与数据相同的情况
lixiaoxu2meng 发表于 2011-8-4 16:45


协议没有如果,否则协议漏洞,而且也恐怕不是如你所说的
 楼主| nixianmin 发表于 2011-8-4 22:17 | 显示全部楼层
原来转义是这样的,看来我想错了,学到了
我想由于命令比较少,那么是不是可以根据功能码判断
哪条命令,而我定的命令长度是死的,那么就可以
用长度来判断了,起始结束也是要判断的,就是在判断
结束时加个长度判断:lol
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:电机控制,TI InstaSpin Foc交流群:335663930

40

主题

431

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部