c串口操作系列(3).docxVIP

  • 0
  • 0
  • 约9.3千字
  • 约 14页
  • 2021-04-12 发布于天津
  • 举报
C# 串口操作系列 (3) C# 串口操作系列 (3) -- 协议篇,二进制协议数据解析 转自 CSDN 转自 CSDN 作者 兔子党逍遥 我们的串口程序,除了 通用的,进行串口监听收发的简单工具,大多都和下位机有 关,这就需要关心我们的通讯协议如何缓存,分析,以及通 知界面。 我们先说一下通讯协议。通讯协议就是通讯双方共同遵 循的一套规则,定义协议的原则是尽可能的简单以提高传输 率,尽可能的具有安全性保证数据传输完整正确。基于这 点规则,我们一个通讯协议应该是这样的:头 +数据长度 +数 据正文 +校验 例如: AA 44 05 01 02 03 04 05 EA 这里我假设的一条数据,协议如下: 数据头:AA 44数据长度:05数据正文: 数据头: AA 44 数据长度: 05 数据正文: 01 02 03 04 05 EA校验: EA 般数据的校验,都会采用常用的方式, CRC16,CRC32,Xor 。 有的数据安全要求高的,不允许丢包的,可能还要加入 重发机制或是加入数据恢复算法,在校验后根据前面数据添 加恢复字节流以恢复数据。我这里采用的是简单的异或校验, 包含数据头的所有字节,依次异或得到的。 协议很简单,我也认为分析协议是很简单的事情,下面 我们就如何分析协议来实际的结合 c# 看一下。 er…再等等,在我们实际开始编码之前,还有一个规则 需要了解, 我们有了通讯协议, 如何结合串口的协议来分析, 需要关心什么呢?哦。一般就是 4 个问题:缓存收到的所有 数据,找到一条完整数据,分析数据,界面通知。 如果分的更详细一点,缓存收到的所有数据,我们想到 最高效的办法就是顺序表,也就是数组,但数组的操作比较 复杂,当你使用完一条数据后,用过的需要移除;新数据如 果过多的时候,缓存过大需要清理;数据搬移等等,很有可 能一个不小心就会丢数据导致软件出些莫名其妙的小问题。 个人建议,使用 Listlt;bytegt; ,内部是数组方式实现,每 次数据不足够的时候会扩容 1 倍,数据的增删改都已经做的 很完善了。不会出现什么小问题。 找到一条完整数据,如何找到完整数据呢?就我们例子 的这个协议, 首先在缓存的数据中找 AA 44,当我们找到后, 探测后面的字节, 发现是 05 ,然后看缓存剩下的数据是否足 够,不足够就不用判断, 减少时间消耗, 如果剩余数据 gt;=6 个(包含 1 个字节的校验) ,我们就算一个校验,看和最后 的校验是否一致。 分析数据:鉴于网络的开放性,我无法确定读者对c# 分析数据:鉴于网络的开放性,我无法确定读者对 c# 的了解程度, 介绍一下, 常用的方式就是 BitConvert.ToInt32 这一系列的方法,把连续的字节(和变量长度一样)读取并 转换为对应的变量。 c++ 下使用 memcpy ,或直接类型转换 后进行值拷贝, vb6 下使用 CopyMemory 这个 api 。 校验:前面说过了。 完整性判断的时候需要和校验对比, 大多系统都不太严格,不支持重发,所以数据错误就直接丢 弃。导致数据错误的原因很多,比如电磁干扰导致数据不完 整或错误、硬件驱动效率不够导致数据丢失、我们的软件缓 存出错等。这些软件因素数据系统错误,需要修改,但是电 磁干扰么,有这个可能的。虽然很少。 其实我知道,就算是我,看别人的博客也是,喜欢看图 片,看代码,文字性的东西,一看就头大。那我接下来贴出 基于上一篇文章的改进版本, 支持协议分析 (协议不能配置, 可配置的协议不是我们讨论的范畴。可以看看有 DFA( 确定 性有限状态机 )) 我们修改一下界面,以便能显示收到后分析的数据 红色部分是新增的代码如下: using[c-sharp] view plaincopyusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using usingSystem.Text; using System.Windows.Forms; using System.IO.Ports; using namespaceSystem.Text.RegularExpressions; namespace SerialportSample {public partial classSerialportSampleForm : FormprivateSerialPort comm = new SerialPort(); SerialportSample { public partial class Serialpo

文档评论(0)

1亿VIP精品文档

相关文档