C# 解决串口接收数据不完整处理方法

2023-05-16

使用缓存机制完成。

首先通过定义一个成员变量List<byte> buffer = new List<byte> (4096);

用来存放所有的数据,

在接收函数里,通过buffer.AddRange()方法不断地将接收到的数据加入到buffer中,并同时对 buffer中的数据进行检验,

如果达到一定的长度并且校验结果正确(校验方法在发送方和接收方一致),再进行处理。

//针对数据协议:head + len + playload + check 类型
 private List<byte> buffer = new List<byte>(4096);

private void sp_DataReceived(objectsender, EventArgs e) //sp是串口控件
{
    int n = sp.BytesToRead;
    byte[] buf = new byte[n];
    sp.Read(buf, 0, n);

    //1.缓存数据
    buffer.AddRange(buf);

    //2.完整性判断
    while (buffer.Count >= 4) //至少包含帧头(2字节)、长度(1字节)、校验位(1字节);根据设计不同而不同
    {
        //2.1 查找数据头
        if (buffer[0] == 0x01) //传输数据有帧头,用于判断
        {
            int len = buffer[2];
            
            if (buffer.Count < len + 4) //数据区尚未接收完整
            {
                break;
            }

            //得到完整的数据,复制到ReceiveBytes中进行校验
            byte[] ReceiveBytes = new byte[len + 4];
            buffer.CopyTo(0, ReceiveBytes, 0, len + 4);

            byte jiaoyan; //开始校验---自定义实现
            jiaoyan = this.JY(ReceiveBytes);//
            if (jiaoyan != ReceiveBytes[len+3]) //校验失败,最后一个字节是校验位
            {
                buffer.RemoveRange(0, len + 4);
                MessageBox.Show("数据包不正确!");
                continue;
            }

            buffer.RemoveRange(0, len + 4);
              
            ///执行对数据进行处理操作RunReceiveDataCallback(ReceiveBytes);
        }
        else //帧头不正确时,记得清除
        {
            buffer.RemoveAt(0);
        }
    }
}
//针对协议类型: head + len +cmd + seq+ playload +check + tail; 

private List<byte> buffer = new List<byte>(4096);
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        { 
            try
            {
                try
                {
                    int nCount = serialPort1.BytesToRead;
                    if (nCount == 0)
                    {
                        return;
                    }
                 
                    byte[] btAryBuffer = new byte[nCount];
                    serialPort1.Read(btAryBuffer, 0, nCount);

                    //缓存数据
                    buffer.AddRange(btAryBuffer);

                    int index = 1;
                    while (buffer.Count>0x07)  //最短协议长度
                    {
                        if (buffer[0] == 0x01)   //协议头
                        {

                            if (buffer[index] != 0x03)  //查询协议尾
                            {

                                 index++;

                                if (index > buffer.Count)    //没有接受到帧尾 0x03
                                {
                                    break;              //退出继续接收

                                }

                            }
                            else  // 接收到协议尾 得到完整一帧数据
                            {
                                byte[] ReceiveBytes = new byte[index+1];
                                buffer.CopyTo(0, ReceiveBytes, 0, index+1);

                                RunReceiveDataCallback(ReceiveBytes);

                                buffer.RemoveRange(0, index);
                            }

                        }
                        else
                        {
                            buffer.RemoveAt(0);

                        }
                    }            
                }
                catch (System.Exception ex)
                {

                }
             
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                handerListening = false;
            }
        }

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 解决串口接收数据不完整处理方法 的相关文章

随机推荐

  • 开源HTTP解析器---http-parser和fast-http

    转载自 xff1a https www cnblogs com arnoldlu p 6497837 html 开源HTTP解析器 http parser和fast http 由于项目中遇到需要发送http请求 xff0c 然后再解析接收到
  • OpenBTS和硬件平台搭建

    OPENBTS安装 目标 项目使用OpenBTS进行GSM系统仿真 xff0c 用BladeRF进行硬件搭建收发平台 所用软硬件版本 Ubuntu 14 04 LTS OpenBTS v 4 0 0 xff1b BladeRF Gnu Ra
  • OpenBTS for bladeRF代码修改

    首先从https github com Nuand dev 上 git clone 下来下载打包的文件 xff0c 接着到本地dev目录下执行 clone sh下载OpenBTS以及它的其他依赖的安装包 这里在openbts文件夹Trasc
  • 通信协议/通讯协议 有哪些?包含哪些分类?

    通讯和通信的区别 xff1f 1 通信 与 通讯 傻傻分得清 传统意义上的 通讯 主要指电话 电报 电传 通讯的 讯 指消息 xff08 Message xff09 媒体讯息通过通讯网络从一端传递到另外一端 媒体讯息的内容主要是话音 文字
  • 增强现实入门实战,使用ArUco标记实现增强现实

    点击上方 AI算法修炼营 xff0c 选择加星标或 置顶 标题以下 xff0c 全是干货 在本文中 xff0c 我们将介绍ArUco标记以及如何使用OpenCV将其用于简单的增强现实任务 xff0c 具体形式如下图的视频所示 一 什么是Ar
  • 停车位检测新数据集、新方法,精准又快速(含视频解读)

    点击上方 AI算法修炼营 xff0c 选择 星标 公众号 精选作品 xff0c 第一时间送达 本文是一篇关于停车位检测的文章 xff0c 文章的视频有详细解读 xff0c 文章的创新点就是在圆形描述器来回归定点坐标 地址 xff1a htt
  • available()方法的使用总结

    先看看API的说明 xff1a public int available throws IOException 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取 xff08 或跳过 xff09 的估计字节数 下一个调用可能是同一个线程
  • simpleBGC32-软件代码开源

    simpleBGC32官方只提供了硬件开源 xff0c 导致市场上有大量的v1 3版的硬件电路板用于飞机云台 xff0c 通过烧录官方给的hex文件实现基本功能 但是由于针对simpleBGC32的软件代码没有开源 xff0c 所以很多需要
  • Gazebo环境下VIO SLAM系统实现

    Gazebo环境下VIO SLAM系统实现 Gazebo环境下VIO SLAM系统实现简介0 准备工作1 搭建gazebo环境1 1 相机1 2 IMU 2 VINS MONO2 1 安装及make2 2 参数修改2 3 外参标定2 3 1
  • 滤波学习理解----EKF(一)

    最近回到slam方向了 xff0c 所以有时间整理一下最近的收获 最复杂也是最简单的模块 滤波 引入 那么滤波是什么呢 xff1f 滤波就是由于观测observation xff08 OB xff09 天生具备的误差和噪声 当有多个信号源观
  • 在VMware里装Kali Linux选graphical install后黑屏解决方案

    我用的是VMware 16 xff0c 装Kali Linux 2020 xff0c 选graphical install后黑屏 其实不管选哪个都黑屏 一开始按照网上的netsh winsock reset xff0c 虚拟打印机 xff0
  • USB移动存储设备上安装Kali Linux(独立系统 非Live 非虚拟机)Standalone Kali Linux + grub2 + luks加密

    前言 本文分享的是在USB移动设备上安装Kali Linux独立系统 非Live版 xff01 非虚拟机版 xff01 非Live版 xff01 非虚拟机版 xff01 非Live版 xff01 非虚拟机版 xff01 这里的USB设备包括
  • 简单git多人协同

    git网上的资料非常多 xff0c 本文只希望能提供一个简单直观的使用教程 xff0c 可能不严谨 如果本文有任何问题 xff0c 请及时指正 git简介 本章介绍git的基本概念 xff0c 了解git就可以跳过 什么是git xff1f
  • Arch 安装 Visual Studio Code(支持Wayland)

    文章目录 安装vscode在Wayland下模糊的解决方法在Wayland下无法使用输入法的解决方法 安装vscode 虽然官网下载一般是首先 xff0c 但是比较复杂 xff0c 所以推荐使用AUR xff1a yay S visual
  • 安装并使用NoMachine

    1 进入NoMachine官网下载NoMachine安装包 2 安装NoMachine xff0c 一路到底 xff0c 不需更改其他设置 xff08 安装目录随意 xff09 3 下载IP扫描工具 xff1a Advanced IP Sc
  • Wayland环境下通过xwayland支持docker图形界面

    写在前面 在之前的文章里已经讲解了怎么直接在docker中使用wayland支持图形界面 xff08 docker内外都使用wayland xff09 xff0c 文章链接 xff1a 使用Docker安装ROS2 ros humble 并
  • ZigBee生产测试项说明

  • C#窗体缩放时窗体上控件同缩放比例变化

    1 定义2个全局float 变量X Y xff0c 用来记录窗体默认窗口时的宽度和高度 float X 默认窗口的宽度 float Y 默认窗口的高度 2 窗体Load的时候将窗体的宽度 高度赋值给X Y private void Form
  • C# winform存储配置文件之App.config文件读写

    有时候一些用户的配置需要写入在本地 xff0c 不能每次程序启动都让用户重新设置一下吧 下面先说基本用法 xff1a 1 创建winform项目之后自动会生成App config文件 xff0c 如果默认没有 就对项目右键 新建项 APP配
  • C# 解决串口接收数据不完整处理方法

    使用缓存机制完成 首先通过定义一个成员变量List lt byte gt buffer 61 new List lt byte gt 4096 用来存放所有的数据 xff0c 在接收函数里 xff0c 通过buffer AddRange 方