zoukankan      html  css  js  c++  java
  • c# 串口编程

    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 == 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 <length)
                {
                    return false;
                }
    
                int TailIndex = m_buffer.FindIndex(o => 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;
            }
    
            /// <summary>
            /// 命令类型
            /// </summary>
            /// <returns></returns>
            public byte Cmd()
            {
                if (m_buffer.Count >= 2)
                {
                    return m_buffer[1];
                }
                return 0;
            }
    
            /// <summary>
            /// 序号
            /// </summary>
            /// <returns></returns>
            public byte Number()
            {
                if (m_buffer.Count >= 3)
                {
                    return m_buffer[2];
                }
                return 0;
            }
    
            /// <summary>
            /// 包长度
            /// </summary>
            /// <returns></returns>
            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;
            }
            /// <summary>
            /// 提取数据
            /// </summary>
            public void Dequeue(byte[] buffer, int offset,int size)
            {
                m_buffer.CopyTo(0,buffer,offset,size);
                m_buffer.RemoveRange(0, 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 > 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); //<这里自己写一个委托吧就OK了
                    }
    
                }
    
            }
  • 相关阅读:
    用户组
    Compose
    ubuntu下不同版本python安装pip及pip的使用
    rest-framework-@action()装饰器
    数据库数据导出CSV文件,浏览器下载
    爬取拉钩网信息
    CSV模块
    DOM对象之查找标签&属性操作
    Java内存模型 一
    SQL优化之一
  • 原文地址:https://www.cnblogs.com/jenney-qiu/p/4186357.html
Copyright © 2011-2022 走看看