博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# 串口编程
阅读量:6982 次
发布时间:2019-06-27

本文共 3392 字,大约阅读时间需要 11 分钟。

http://news.ccidnet.com/art/32859/20100524/2067861_4.html

字节缓冲器处理类:

///     /// 字节缓冲器    ///     public class ByteQueue    {        private List
m_buffer = new List
(); public bool Find() { if (m_buffer.Count == 0) return false; int HeadIndex = m_buffer.FindIndex(o => o == 0xAA); if (HeadIndex == -1) { m_buffer.Clear(); return false; //没找到AA } else if (HeadIndex != 0) //不为开头移掉之前的字节 { if (HeadIndex > 1) m_buffer.RemoveRange(0, HeadIndex); } int length= GetLength(); if (m_buffer.Count
o == 0x55); //查找55的位置 if (TailIndex == -1) { //这一步为防止连发一个AA开头的包后,没发55,而又发了一个AA int head = m_buffer.FindLastIndex(o => o == 0xAA); if (head > -1) { m_buffer.RemoveRange(0, head); } return false; } else if (TailIndex + 1 != length) //计算包尾是否与包长度相等 { m_buffer.RemoveRange(0, TailIndex); return false; } return true; } ///
/// 命令类型 /// ///
public byte Cmd() { if (m_buffer.Count >= 2) { return m_buffer[1]; } return 0; } ///
/// 序号 /// ///
public byte Number() { if (m_buffer.Count >= 3) { return m_buffer[2]; } return 0; } ///
/// 包长度 /// ///
public int GetLength() { int len = 5;//AA 命令类型 序号 校验和 55 if (m_buffer.Count >= 3) { switch (m_buffer[2]) //第三字节为序号 { case 0x00: //序号 return len + 16; case 0x01: //序号 return len + 10; case 0x02: //序号 return len + 12; } } return 0; } ///
/// 提取数据 /// public void Dequeue(byte[] buffer, int offset,int size) { m_buffer.CopyTo(0,buffer,offset,size); m_buffer.RemoveRange(0, size); } ///
/// 队列数据 /// ///
public void Enqueue(byte[] buffer) { m_buffer.AddRange(buffer); } }

调用示例:

private ByteQueue queue = new ByteQueue(); private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)        {            int len = serialPort1.BytesToRead;            if (len > 0)            {                byte[] temp = new byte[len];                serialPort1.Read(temp, 0, len);                queue.Enqueue(temp);                while (queue.Find()) //while可处理同时接收到多个AA ... 55 ,AA...55的包                {                    int length = queue.GetLength();                    byte[] readBuffer = new byte[len];                    queue.Dequeue(readBuffer, 0, length);                    OnReceiveData(readBuffer); //

转载于:https://www.cnblogs.com/jenney-qiu/p/4186357.html

你可能感兴趣的文章
ORA-06502 when awr report produce
查看>>
check_partition_aft_merge.sql
查看>>
record-09 ATM 过程思想 综合练习
查看>>
北京中天荣泰视觉检测 仿真
查看>>
C++复制控制:拷贝构造函数
查看>>
郭博演示git
查看>>
共享程序集和强命名程序集(3):强命名程序集的一些作用
查看>>
智能POS常见问题整理
查看>>
新浪微博推广网站的一些实践体会
查看>>
Deep Learning
查看>>
How Tomcat works — 四、tomcat启动(3)
查看>>
Java 集合 — HashMap
查看>>
[python]目录及文件操作
查看>>
Linux系统之路——如何在CentOS7.2安装MySQL
查看>>
支付宝接口使用文档说明 支付宝异步通知
查看>>
百度地图设置div样式宽高为百分比不显示地图
查看>>
辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)
查看>>
Spring《五》集合的注入方式
查看>>
centos7 install 安装mysql
查看>>
Odoo 学习 【二】Environment 概览
查看>>