打印

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

[复制链接]
5025|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代替。接收的时候去掉帧头帧尾和转义,就得到原始的数据了

使用特权

评论回复
5
nixianmin|  楼主 | 2011-8-4 07:08 | 只看该作者
我是用0x68开始,0x16结束,我认为开始符可以不去管,
因为开始符总是第一个,我们只需判断一次,就可以接收数据,
如果中间出现开始符就是当数据直接接收的。
就是在结束的时候需要判断,像4楼说的如果这样用转义,那么就不存在
开始和结束符了,那样不是更不知道怎么判断开始和结束了,难道每碰到
0xfd都和后面的数据相加??:dizzy:

使用特权

评论回复
6
lixiaoxu2meng| | 2011-8-4 08:06 | 只看该作者
支持楼主 用ASCII 码传输

使用特权

评论回复
7
nixianmin|  楼主 | 2011-8-4 08:28 | 只看该作者
ascii码是不是0代表0x30啊

使用特权

评论回复
8
nixianmin|  楼主 | 2011-8-4 08:29 | 只看该作者
还有,校验我是用的和检验,是不是也有几率出现问题的

使用特权

评论回复
9
受不了了| | 2011-8-4 08:32 | 只看该作者
本帖最后由 受不了了 于 2011-8-4 08:33 编辑

7# nixianmin
是这样的,不过ASCII码方式的数据量会增倍,而且来回转换也会消耗点时间,用MODBUS RTU好了

使用特权

评论回复
10
nixianmin|  楼主 | 2011-8-4 08:47 | 只看该作者
我去看看,公司研发没网,悲剧,可能用长度计算也行,改了还要和写数据平台沟通,他那也改

使用特权

评论回复
11
joyme| | 2011-8-4 09:02 | 只看该作者
基本上用帧长就好了,再加帧头、帧尾可以更保险,和校验跟或检验应该差不多,比奇偶、CRC等校验肯定差一点,看应用场合吧,一般长度、帧头、帧尾及和校验没错,出错的就很小了

使用特权

评论回复
12
nixianmin|  楼主 | 2011-8-4 09:24 | 只看该作者
嗯,看来还是要加个长度

使用特权

评论回复
13
wzf3151| | 2011-8-4 16:24 | 只看该作者
最进我也在制定协议中,像楼上提到的用ASCII传输就不出现误判起始符结束符,要是不那样,就用空闲时间作判断。
MODBUS协议就把这两种都约定了,参考吧,我也正在参考!

使用特权

评论回复
14
cecwxf| | 2011-8-4 16:35 | 只看该作者
又学到一招

使用特权

评论回复
15
yewuyi| | 2011-8-4 16:37 | 只看该作者
用ASCII方式就不会出现这个问题的
受不了了 发表于 2011-8-3 23:41


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

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

除了4楼的转义办法,不被影响恐怕是不可能的,除非你强行规定数据中永远不得出现那几个数值,但这样的协议就是瘸腿了。

使用特权

评论回复
16
lixiaoxu2meng| | 2011-8-4 16:45 | 只看该作者
15# yewuyi
我认为针对楼主的问题 用ASCII完全可以解决 除非是帧错误  不然不会出现结束符与数据相同的情况

使用特权

评论回复
17
joyme| | 2011-8-4 16:46 | 只看该作者
转义也一样可能出错呀,既然是随机数据就没法保证数据里不会出现FD 01两个连续的数据吧
只能是长度加帧头、帧尾一起判断

使用特权

评论回复
18
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计算

使用特权

评论回复
19
yewuyi| | 2011-8-4 17:00 | 只看该作者
15# yewuyi  
我认为针对楼主的问题 用ASCII完全可以解决 除非是帧错误  不然不会出现结束符与数据相同的情况
lixiaoxu2meng 发表于 2011-8-4 16:45


协议没有如果,否则协议漏洞,而且也恐怕不是如你所说的

使用特权

评论回复
20
nixianmin|  楼主 | 2011-8-4 22:17 | 只看该作者
原来转义是这样的,看来我想错了,学到了
我想由于命令比较少,那么是不是可以根据功能码判断
哪条命令,而我定的命令长度是死的,那么就可以
用长度来判断了,起始结束也是要判断的,就是在判断
结束时加个长度判断:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

40

主题

431

帖子

6

粉丝