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

字节缓冲器处理类:

 /// <summary>
/// 字节缓冲器
/// </summary>
public class ByteQueue
{
private List<byte> m_buffer = new List<byte>();
public bool Find()
{
if (m_buffer.Count == )
return false;
int HeadIndex = m_buffer.FindIndex(o => o == 0xAA); if (HeadIndex == -)
{
m_buffer.Clear();
return false; //没找到AA
} else if (HeadIndex != ) //不为开头移掉之前的字节
{
if (HeadIndex > )
m_buffer.RemoveRange(, HeadIndex);
} int length= GetLength(); if (m_buffer.Count <length)
{
return false;
} int TailIndex = m_buffer.FindIndex(o => o == 0x55); //查找55的位置 if (TailIndex == -)
{
//这一步为防止连发一个AA开头的包后,没发55,而又发了一个AA
int head = m_buffer.FindLastIndex(o => o == 0xAA);
if (head > -)
{
m_buffer.RemoveRange(, head);
}
return false;
}
else if (TailIndex + != length) //计算包尾是否与包长度相等
{
m_buffer.RemoveRange(, TailIndex);
return false;
} return true;
} /// <summary>
/// 命令类型
/// </summary>
/// <returns></returns>
public byte Cmd()
{
if (m_buffer.Count >= )
{
return m_buffer[];
}
return ;
} /// <summary>
/// 序号
/// </summary>
/// <returns></returns>
public byte Number()
{
if (m_buffer.Count >= )
{
return m_buffer[];
}
return ;
} /// <summary>
/// 包长度
/// </summary>
/// <returns></returns>
public int GetLength()
{
int len = ;//AA 命令类型 序号 校验和 55
if (m_buffer.Count >= )
{
switch (m_buffer[]) //第三字节为序号
{
case 0x00: //序号
return len + ;
case 0x01: //序号
return len + ;
case 0x02: //序号
return len + ;
}
}
return ;
}
/// <summary>
/// 提取数据
/// </summary>
public void Dequeue(byte[] buffer, int offset,int size)
{
m_buffer.CopyTo(,buffer,offset,size);
m_buffer.RemoveRange(, size);
} /// <summary>
/// 队列数据
/// </summary>
/// <param name="buffer"></param>
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 > )
{
byte[] temp = new byte[len];
serialPort1.Read(temp, , len);
queue.Enqueue(temp);
while (queue.Find()) //while可处理同时接收到多个AA ... 55 ,AA...55的包
{
int length = queue.GetLength();
byte[] readBuffer = new byte[len];
queue.Dequeue(readBuffer, , length);
OnReceiveData(readBuffer); //<这里自己写一个委托吧就OK了
} } }

c# 串口编程的更多相关文章

  1. storysnail的Linux串口编程笔记

    storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...

  2. storysnail的Windows串口编程笔记

    storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...

  3. Linux下串口编程【转】

    本文转载自:http://blog.csdn.net/w282529350/article/details/7378388 /************声明:本人只是见到这篇文章对我帮助很大才转载的,但 ...

  4. c# 实现串口编程-操作LED屏幕

    串口编程主要用到SerialPort这个类,主要实现对串口发送字节数组然后点阵屏显示相关信息,其实这个功能很简单下面给大家把整体思路用流程图展现如下:. 其实整体思路就如流程图.下面是整个流程图的一个 ...

  5. PB串口编程资料(转)

    ----MSCOMM32参数基本介绍2008年03月29日 星期六 上午 11:37MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能.MSComm控件在串口编程时非常方便,程序 ...

  6. Linux串口编程(转载)

    在嵌入式Linux中,串口是一个字设备,访问具体的串行端口的编程与读/写文件 的操作类似,只需打开相应的设备文件即可操作.串口编程特殊在于串 口通信时相关参数与属性的设置.嵌入式Linux的串口编程时 ...

  7. Linux串口编程详解(转)

    串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...

  8. linux串口编程总结

    串口本身.标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口以前被广泛用于连接计算机和终端设备和各种外部设备.尽管以太网接口和USB接口也是以一个串行流进行数据传送的.可是串口连接 ...

  9. Qt中的串口编程之三

    QtSerialPort 今天我们来介绍一下QtSerialPort模块的源代码,学习一下该可移植的串口编程库是怎么实现的. 首先,我们下载好了源代码之后,使用QtCreator打开整个工程,可以看到 ...

  10. linux串口编程设置(转载)

    (转载)在嵌入式Linux中,串口是一个字设备,访问具体的串行端口的编程与读/写文件 的操作类似,只需打开相应的设备文件即可操作.串口编程特殊在于串 口通信时相关参数与属性的设置.嵌入式Linux的串 ...

随机推荐

  1. MySql指令集

    http://blog.csdn.net/cl05300629/article/details/9464007

  2. 在 Xcode 6 中使用矢量图( iPhone 6 置配 UI)

    在 Xcode 6 中使用矢量图( iPhone 6 置配 UI) (本文转载:http://iosdeveloper.diandian.com/post/2014-09-25/40063062789 ...

  3. framework各版本对比

    本对比只是粗略的让大家了解到大概有什么变化 .net 1.0 2002年2月.net 2.0 2006年1月.net 3.0 2006年11月 .net 3.5 2007年11月.net 3.5 sp ...

  4. [翻译]利用REDIS来搭建可靠分布式锁的提议

    本系列都是翻译REDIS作者的博文  另外加上我自己的一点点理解  希望有问题大家一起讨论 http://antirez.com/news/77 原文地址 在利用REDIS做分布式锁时基本持有2种观点 ...

  5. JQUERY添加、删除元素、eq()方法;

    一.jQuery - 添加元素 1.append() - 在被选元素内部的结尾插入指定内容 2.prepend() - 在被选元素内部的开头插入指定内容 3.after() - 在被选元素之后插入内容 ...

  6. JSBinding+SharpKit / 更新的原理

    首先,其实不是热更新,而是更新. 热更新意思是不重启游戏,但只要你脚本里有存储数据,就不可能.所以只能叫更新. 但大家都这么说,所以... 先举个具体的例子: 如果是C#:在 Prefab 的 Gam ...

  7. UML的类图、时序图表示方法以及惯例

    <UML类图图示样例>说明:http://wenku.baidu.com/link?url=DEaRFyVIAH4kZ7TolplfFhFhmAk3gFaNSOH7XPzfTnCWY4CB ...

  8. linux IO调度

    I/O 调度算法再各个进程竞争磁盘I/O的时候担当了裁判的角色.他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能.在linux下面列出4种调度算法CFQ (Completely ...

  9. mysql 启动 pid报错解决方法

    在安装好mysqld的时候 启动的时候报错如下: [root@ mysql]# service mysqld start Starting MySQL.The server quit without ...

  10. Delphi ActiveX Form的使用实例

    Delphi ActiveX Form的使用实例 By knityster 1. ActiveX控件简介 ActiveX控件也就是一般所说的OCX控件,它是ActiveX技术的一部分. ActiveX ...