串口的协议协议问题

楼主是不是用两台电脑在调试

伱说“如果我再把他的软件接通。。前面我发的那些命令的回复突然一下过来了。。”什么意思因为同一个串口的协议,同一时刻不能被两个软件同时使用

你能确信你发得命令和别人的软件是一样的吗,你可以这样测试一下

(1)你用串口的协议监控精灵进行自發自收,你用钥匙或者1毛银币将串口的协议的2,3叫短路你发送出去的数据就会在串口的协议精灵上显示出来,看和别人软件发得是否一样

(2)你接受和发送的数据有没有可能十进制和十六进制搞错了。

    我们的串口的协议程序除了通鼡的,进行串口的协议监听收发的简单工具大多都和下位机有关,这就需要关心我们的通讯协议如何缓存分析,以及通知界面

我们先说一下通讯协议。通讯协议就是通讯双方共同遵循的一套规则定义协议的原则是尽可能的简单以提高传输率,尽可能的具有安全性保證数据传输完整正确基于这2点规则,我们一个通讯协议应该是这样的:+数据长度+数据正文+校验

    有的数据安全要求高的不允许丢包的,可能还要加入重发机制或是加入数据恢复算法在校验后根据前面数据添加恢复字节流以恢复数据。我这里采用的是简单的异或校验包含数据头的所有字节,依次异或得到的

    协议很简单,我也认为分析协议是很简单的事情下面我们就如何分析协议来实际的结合c#看一丅。

er…再等等在我们实际开始编码之前,还有一个规则需要了解我们有了通讯协议,如何结合串口的协议的协议来分析需要关心什麼呢?哦一般就是4个问题:缓存收到的所有数据找到一条完整数据分析数据界面通知

如果分的更详细一点,缓存收到的所有数據我们想到最高效的办法就是顺序表,也就是数组但数组的操作比较复杂,当你使用完一条数据后用过的需要移除;新数据如果过哆的时候,缓存过大需要清理;数据搬移等等很有可能一个不小心就会丢数据导致软件出些莫名其妙的小问题。个人建议使用List<byte>,内部昰数组方式实现每次数据不足够的时候会扩容1倍,数据的增删改都已经做的很完善了不会出现什么小问题。

    找到一条完整数据如何找到完整数据呢?就我们例子的这个协议首先在缓存的数据中找AA 44,当我们找到后探测后面的字节,发现是05然后看缓存剩下的数据是否足够,不足够就不用判断减少时间消耗,如果剩余数据>=6个(包含1个字节的校验)我们就算一个校验,看和最后的校验是否一致

至此,你只要按这个协议格式发送数据到软件打开的串口的协议就能在数据的data标签显示出你的数据内容,我们现在是直接显示为:

发送模擬数据的界面使用通用工具SSCOMM32.exe

我们在回顾一下,一般二进制格式数据就是这样分析分析数据长度是否足够,找到数据头数据长度,校驗然后分析。

分析方式很多结合各自实际情况操作,可以使用序列化方式但是wince不支持,也可以用BitConvert方式将连续的字节读取为某个类型嘚变量

希望看到这里,能给你带来帮助欢迎大家和我讨论,希望经验丰富的朋友不吝赐教上一篇中,有朋友说用BeginInvoke可以避免死锁问题我暂时没有线,没有测试成功改天测试后再公布结果。

DataReceived事件中最高效的做法是指缓存数据,然后异步的去分析数据但是,这样较複杂在效率要求不是很高的情况下(大多数情况),可以在DataReceived事件中缓存数据后立刻进行数据完整性检查,有效性检查分析数据,以忣更新界面但这么做有一个隐患,底层串口的协议操作的效率依赖于数据分析和界面更新任何一个环节频繁耗时过长,都会造成数据嘚堆积文章只假设都不拖时间的情况。

谢谢观赏通讯协议分析系列,未完待续……

我要回帖

更多关于 串口的协议 的文章

 

随机推荐