C#串口接收事件里面如何高效的解析协议

蓝色理想yg 2016-03-08 02:04:16
怎么做才能更加高效呢?
...全文
473 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanta 2016-03-09
  • 打赏
  • 举报
回复
这个算法有问题。在buf循环中,采取移除首字节的方式,这样是比较耗时间的。而且,你这程序,每次都要生成缓冲区,也是浪费时间。 建议: 1、建立一个缓冲区,每次将接受的数据拷贝进去即可。 2、buf循环采用移动指针的方式(数组的下标移动),缓冲区不要动。 3、进行大数据量测试,看耗时最大的是哪块,有针对性的进行修改
蓝色理想yg 2016-03-08
  • 打赏
  • 举报
回复
  private void deal_byte()
        { 
            switch (p[2])
            {
                case 0:
                    A[0] = (short)(p[3] + p[4] * 256);
                    break;
                case 1:
                    A[1] = (short)(p[3] + p[4] * 256);
                    break;
                case 2:
                    A[2] = (short)(p[3] + p[4] * 256);
                    break;
                case 3:
                    A[3] = (short)(p[3] + p[4] * 256);
                    break;
                case 4:
                    A[4] = (short)(p[3] + p[4] * 256);
                    break;
                case 5:
                    A[5] = (short)(p[3] + p[4] * 256);
                    break;
                case 6:
                    A[6] = (short)(p[3] + p[4] * 256);
                    break;
                case 7:
                    A[7] = (short)(p[3] + p[4] * 256);
                    break;
            }
        }
蓝色理想yg 2016-03-08
  • 打赏
  • 举报
回复
我贴一下我的代码吧,目前测试小数据 没什么堵塞,但是担心在数据量大了之后会出现堵塞
  private List<byte> buffer = new List<byte>(4096);
        private short[] A = new short[10];
        private byte[] p = new byte[6];     //6个数据作为一个协议包,头+len+命令+数据低字节+数据高字节+效验和         
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            { 
                int n = serialPort1.BytesToRead;                     //读取串口事件发生时的字节数
                byte[] buf = new byte[n];                           //申明数组保存一帧数据      
                serialPort1.Read(buf, 0, n);                         //读取缓冲数据                 
                bool dat_catch = false;
                buffer.AddRange(buf);                               //缓存到listbuffer里面去                 
                while (buffer.Count >= 4)                           //这里用while是因为里面有break 和continue
                {
                    if (buffer[0] == 0xfe)         //判断头
                    {
                        int len = buffer[1];                            //下位机发送的字节数
                        if (buffer.Count < len + 2) break;              //如果接受数据数小于字节数,继续接受 
                        byte checksum = 0;                              //异或效验变量
                        for (int i = 2; i < len + 3; i++)               //len=5           
                        { checksum += buffer[i]; }                      //得到效验值
                        //if (checksum != buffer[len + 3])                //如果效验失败,这个数据不要,继续接受下一个数据
                        //{ buffer.RemoveRange(0, len + 4); continue; }   //这里的continue是说while循环,不是if
                        buffer.CopyTo(0, p, 0, len + 3);    //复制一条完整数据到具体的数据缓存                                     
                        dat_catch = true;
                        buffer.RemoveRange(0, len + 3);                 //正确分析一条数据,从缓存中移除数据。
                        if (dat_catch)
                        {
                            deal_byte();                                    //用变量保存想要的数据
                        }    
                    }
                    else
                    { buffer.RemoveAt(0); }                             //如果包的第一个数据错误,则重新开始
                }
          

                
            }
            catch (System.Exception)
            {           
                return;
            }
            
        }
泡泡龙 2016-03-08
  • 打赏
  • 举报
回复
串口不会一直在发数据吧,可以做个大一点的缓存来处理。 实在不行,换C写吧
蓝色理想yg 2016-03-08
  • 打赏
  • 举报
回复
就是说在串口事件里面耗时比较长,
xdashewan 2016-03-08
  • 打赏
  • 举报
回复
不能及时显示,到底显示没显示?及时又是多少时间算及时
蓝色理想yg 2016-03-08
  • 打赏
  • 举报
回复
目前我用的是http://www.cnblogs.com/Sue_/articles/2012335.html 我发现这个程序在数据多了之后会出现有一些数据不能及时显示,敢问各位大大们有什么好办法实现高效的协议解析呢?

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧