串口协议匹配函数,避免串口数据接收时顺序换乱错误
2014-08-22 11:37
260 查看
按照协议匹配,避免串口数据接收时顺序换乱错误。
1,转移字符
a) 数据包基本格式中的数据长度、数据和校验和中如果出现关键字C0、
CF或CA则需要在其前端加上转义字符CA,即将数据C0、CF或CA发送成CAC0、CACF或CACA,将数据C0C0发送成CAC0CAC0。
b) 数据包基本格式中的数据长度length以有效数据的数量为准,即不
需要也不得将转义字符的数量累加上去。
c) 数据包校验和的计算从地址码开始累加到数据位的最后一位,只计
算有效数据,既不需要也不得将转义字符计算在内;
包头 | 长度 | 地址码 | 回复状态 | 校验和 | 包尾 | 备注 |
C0C0 | 02 | F5 | AA | YY | CF | 成功 |
a) 数据包基本格式中的数据长度、数据和校验和中如果出现关键字C0、
CF或CA则需要在其前端加上转义字符CA,即将数据C0、CF或CA发送成CAC0、CACF或CACA,将数据C0C0发送成CAC0CAC0。
b) 数据包基本格式中的数据长度length以有效数据的数量为准,即不
需要也不得将转义字符的数量累加上去。
c) 数据包校验和的计算从地址码开始累加到数据位的最后一位,只计
算有效数据,既不需要也不得将转义字符计算在内;
public static Frame ReadFrame(SerialPort port) { byte[] data = new byte[4096]; data[0] = 0xc0; data[1] = 0xc0; while (true) { if (port.ReadByte() != 0xc0) continue; if (port.ReadByte() != 0xc0) continue; int len = port.ReadByte(); if (len < 2) continue; data[2] = (byte)len; int chk = 0, index = 3; bool escaping = false; for (int i = 0; i < len; i++) { int n = port.ReadByte(); data[index++] = (byte)n; if (n == 0xca) { if (!escaping) { escaping = true; i--; continue; } } escaping = false; chk += n; } chk &= 0xff; if (port.ReadByte() != chk) continue; data[index++] = (byte)chk; if (port.ReadByte() != 0xcf) continue; data[index++] = 0xcf; byte[] rawData = new byte[index]; System.Array.Copy(data, 0, rawData, 0, index); return new Frame(rawData); } }
相关文章推荐
- Linux下串口编程遇 接收数据错误问题及原因
- 串口接收数据错误0D变0A问题
- C#中初始化串口的函数定义与数据接收代码片段
- 模拟器上面运行的应用程序能从串口接收PC发的数据吗
- 一个汇编写得GPS串口接收数据程序
- C#异步数据接收串口操作类
- 闪烁led来标志串口的接收与发送数据
- net2.0下实现串口接收GPS数据读写(-)
- [VB.NET]串口接收过程中怎样将末尾3位字符数据去掉?
- (数据获取)获取系统错误信息函数
- Delphi:TComPort封装在DLL中,通讯时无法接收串口数据的解决办法
- 使用UDP协议发送和接收数据
- C#异步数据接收串口操作类
- Linux系统下串口接收数据,部分特殊字符丢失的解决方法
- GPS数据串口接收的数据 是否在一个设定好的检测区内
- 串口接收数据c#
- 单片机C51串口中断接收和发送测试例程(含通信协议的实现)
- 单片机C51串口中断接收和发送测试例程(含通信协议的实现)
- 地磅称量系统之(59) 接收串口数据(串口控件的属性设置和超级终端的使用)
- C#异步数据接收串口操作类