串口协议匹配函数,避免串口数据接收时顺序换乱错误

按照协议匹配,避免串口数据接收时顺序换乱错误。


包头


长度


地址码


回复状态


校验和


包尾


备注


C0C0


02


F5


AA


YY


CF


成功

1,转移字符

a)              数据包基本格式中的数据长度、数据和校验和中如果出现关键字C0、

CF或CA则需要在其前端加上转义字符CA,即将数据C0、CF或CA发送成CAC0、CACF或CACA,将数据C0C0发送成CAC0CAC0。

b)              数据包基本格式中的数据长度length以有效数据的数量为准,即不

需要也不得将转义字符的数量累加上去。

c)              数据包校验和的计算从地址码开始累加到数据位的最后一位,只计

算有效数据,既不需要也不得将转义字符计算在内;

 1  public static Frame ReadFrame(SerialPort port)
 2         {
 3             byte[] data = new byte[4096];
 4             data[0] = 0xc0;
 5             data[1] = 0xc0;
 6             while (true)
 7             {
 8                 if (port.ReadByte() != 0xc0)
 9                     continue;
10                 if (port.ReadByte() != 0xc0)
11                     continue;
12                 int len = port.ReadByte();
13                 if (len < 2)
14                     continue;
15                 data[2] = (byte)len;
16                 int chk = 0, index = 3;
17                 bool escaping = false;
18                 for (int i = 0; i < len; i++)
19                 {
20                     int n = port.ReadByte();
21                     data[index++] = (byte)n;
22                     if (n == 0xca)
23                     {
24                         if (!escaping)
25                         {
26                             escaping = true;
27                             i--;
28                             continue;
29                         }
30                     }
31                     escaping = false;
32                     chk += n;
33                 }
34                 chk &= 0xff;
35                 if (port.ReadByte() != chk)
36                     continue;
37                 data[index++] = (byte)chk;
38                 if (port.ReadByte() != 0xcf)
39                     continue;
40                 data[index++] = 0xcf;
41                 byte[] rawData = new byte[index];
42                 System.Array.Copy(data, 0, rawData, 0, index);
43                 return new Frame(rawData);
44             }
45         }

串口协议匹配函数,避免串口数据接收时顺序换乱错误

时间: 2024-10-10 13:57:38

串口协议匹配函数,避免串口数据接收时顺序换乱错误的相关文章

imx6 spi slave 数据接收时移位寄存器的工作机理

如上图, 移位寄存器(shift register)及 接收FIFO (RXDATA)对程序来说是透明的. 唯一可访问的 Receive Data Register (ECSPIx_RXDATA) 只能访问 接收FIFO的 top 字.如下: 当把 spi2 配置成为 slave 模式时,外部的主spi 端将数据发送到 spi 的 MOSI 线上,mosi线上的数据是按bit 传输的. 在 bpw 配置为 32时,移位寄存器中 每满 32bit 才可以向 接收FIFO 打一个字. 如果,mosi

UART串口协议基础1

Louis [email protected] 串口协议基础 1 串口概述 串口由收发器组成.发送器是通过TxD引脚发送串行数据,接收器是通过RxD引脚接收串行数据.发送器和接收器都利用了一个移位寄存器,这个移位寄存器可以将数据进行"并转串"和"串转并".虽然一个UART接口通常都包含了发送器和接收器,而实际上一个全双工串口UART控制器需要独立的发送和接收通道.这是因为每个控制通道只控制了一个pin(一个通道要么配置成发送器,要么配置成接收器,不能同时配置成接收器

VUE生命周期中的钩子函数及父子组件的执行顺序

先附一张官网上的vue实例的生命周期图,每个Vue实例在被创建的时候都需要经过一系列的初始化过程,例如需要设置数据监听,编译模板,将实例挂载到DOM并在数据变化时更新DOM等.同时在这个过程中也会运行一些叫做生命周期钩子的函数(回调函数),这给了用户在不同阶段添加自己代码的机会. 1.vue的生命周期图 在vue实例的整个生命周期的各个阶段,会提供不同的钩子函数以供我们进行不同的操作.先列出vue官网上对各个钩子函数的详细解析. 生命周期钩子 详细 beforeCreate 在实例初始化之后,数

用IO模拟串口协议发送数据

<pre name="code" class="cpp">//文件usend.h #ifndef _USEND_H_ #define _USEND_H_ //====红外接收相关定义============================= #define PuTx_High (P_uTx = 1) //数据高 #define PuTx_Low (P_uTx = 0) //数据低 #define V_SendDatNum 6//6 //发送数据字节数 /

C#异步数据接收串口操作类

C#异步数据接收串口操作类 使用C#调用传统32位API实现串口操作,整个结构特别的简单.接收数据只需要定义数据接收事件即可. 上传源代码我不会,需要源代码的请与我([email protected])联系.你也可以教我怎么上传源代码. using System; using System.Runtime.InteropServices; /// <summary> /// (C)2003-2005 C2217 Studio  保留所有权利 /// /// 文件名称:     IbmsSeri

[RK_2014_0910]串口编程中,串口数据接收不全的可能原因

[情形1] [ubuntu14.04-->Win8] [环境描述] PC1:Win8,运行串口调试工具:USR-TCP232-Test.exe:串口COM1的参数设置为“9600,8,1,N". PC2:Ubuntu14.04:串口/dev/ttyUSB0的参数设置为“9600,8,1,N". [代码描述] // 串口传输线程 处理函数 void* CTestEth::ThreadFuncHandleSerialPortTransfer(IN void* arg) { if ((

STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeMX配置外部时钟 注意在进行外部时钟配置时,即"High Speed Clock"和"Low Speed Clock"需配置成"Crytal/Ceramic Resonator(低温/陶瓷谐振器)"不能配置为"BYASS Clock Sour

2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题

本文用的是VS2013MFC写串口数据接收: 第一步:首先建立一个MFC工程,成功后会跳出一个对话框,直接在对话框上点击右键->点击插入ACTIVAE控件->选择MicrosoftCommunications Control, version 6.0 成功后会显示一个电话的图标在对话框上,运行起来不会显示的 不用担心这个美观问题.如果没有这个插件的话,可能是版本太低  可以自己下载一个补上 第二步:大概的窗体搞好:   那个显示图片的大框是PICTURE控件变量 然后就要项目->类向导中

C#----串口数据接收发送

虚拟串口驱动工具,创建俩个虚拟串口,如图: 创建两个Console模拟串口的发送接收数据 C#串口数据接收发送,类空间: using System.IO.Ports; C# 串行端口 接收数据,代码如下: //遍历串行端口名称数组 foreach (string port in System.IO.Ports.SerialPort.GetPortNames()) { Console.WriteLine(port); } byte[] b = new byte[32]; SerialPort sp