Unity 串口接收的报文不完整?处理方式在这

2023-11-02

串口通讯

Unity 中的串口通讯和C#的处理方式基本一致,

  1. Serial.Read(); 可以读取缓存区中的十六进制数
  2. Serial.ReadLine();可以以字符串的方式读取

Read()函数的处理

但是Read()函数有一个大坑,就是他不是一次性全读取,而是将缓存区中的数据分多次(一般是两次)读取,这个情况的产生不是因为对方以两次发送过来,而是一次发送过来会放在缓存区,通过Read()函数将缓存区的数据读多次,也就是这个函数会执行多次。
这样就导致了我们要是直接在Read()下面直接进行数据处理,会将第一次的未完成数据进行处理,这样处理结果显然是错误的。、

解决问题的过程

我在遇到问题后查找的资料基本倾向于规定一个指定的接收长度,在未完成长度时继续读,直到读满长度后开始对数据进行处理。
但是我这边需要实现的功能是对三种不同长度的报文进行分类处理,这样的情况显然不对。所以只能是规定三种长度

对Read()函数的应用

所以我对串口接收数据的入口进行了一点点更改,Serial.BytesToRead函数是去直接获取缓存区的数据位数,可以通过检查缓存区的数据,进行下一步操作来确保将缓存区的数据读完。

// sp为串口

    	int index = 0;                    //用于记录此时的数据次序
        int ReadToBytes = 0;              //记录长度
        byte[] readBuffer = new byte[20]; //接收数组初始化
 while (true)
        {
            if (sp != null && sp.IsOpen)
            {
                try
                {
                    int n = sp.BytesToRead;
                    if (n > 0)
                    {
                        readBuffer = new byte[sp.BytesToRead + 1];
                        ReadToBytes = sp.Read(readBuffer, 0, n);

                        if ((n == 7) || (n == 9) || (n == 13))    //是否符合接收长度
                        {
                            index = 0;

                            for (int i = 0; i < n; i++)
                            {
                                if (index >= n) index = n - 1;		 //理论上不应该会进入此判断,但是由于传输的误码,导致数据的丢失,使得标志位与数据个数出错
                                data[index] = readBuffer[i];         //将数据存入数据处理数组data中
                                index++;
                            }

                        }
               		}
               		DataProcessingFunction(index, data);  //数据处理
				}
				catch (Exception ex)
                {
                    if (ex.GetType() != typeof(ThreadAbortException))
                    {

                    }
                }
			}
			Thread.Sleep(100);
		}

这段代码实际上只是对入口进行了略微处理,在开始时新建一个接收线程,在每次接收完让这个线程休眠一段时间可以确保数据不会冲突。

弊端

这样的弊端也是有的,

  1. 干扰数据也是符合这几位的话也是会键入循环,不过可以加个校验,就可以不被处理直接忽略。
  2. 对偶然情况,比如发送端是分两次发送的正确数据无法处理,这样的情况这段代码无法排除。

结束

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

Unity 串口接收的报文不完整?处理方式在这 的相关文章

随机推荐

  • PC-Lint c/c++ 代码检查工具

    概述 PC Lint是GIMPEL SOFTWARE公司的一个产品 它是一个历史悠久 功能异常强劲的静态代码检测工具 它的使用历史可以追溯到计算机编程的远古时代 30多年以前 经过这么多年的发展 它不但能够监测出许多语法逻辑上的隐患 而且也
  • Linux - Ubuntu下安装node.js的方法

    1 Putty连接 安装Putty连接到Ubuntu 输入密码验证后进入Putty命令行控制台 1 1 查看Ubuntu版本 sudo uname m 如果显示i686 你安装了32位操作系统 如果显示 x86 64 你安装了64位操作系统
  • Redis的高级特性一览

    更多内容 欢迎关注微信公众号 全菜工程师小辉 公众号回复关键词 领取免费学习资料 应用场景 缓存系统 用于缓解数据库的高并发压力 计数器 使用Redis原子操作 用于社交网络的转发数 评论数 粉丝数 关注数等 排行榜 使用zset数据结构
  • ag-grid表格如何使用?

    1 自定义标题 tableHeaderCustom vue
  • 证件照片如何换背景底色,3个免费制作证件照的方法,简单易学

    在日常生活中 我们经常需要用到证件照 比如 找工作需要简历上附带有证件照 还有办理学生证 身份证也需要提交证件照 不同的平台有时候提交的要求 背景底色 大小等 也不一样 如果你不想每次都重拍 那么可以用一些工具 软件 在原来的照片上修改 也
  • smb协议详解和samba服务的配置

    理论部分 samba 基于smb协议使网络上的计算机能共享文件 samba的核心是smbd和nmbd两个守护进程 smbd 管理samba服务器上的共享目录 nmbd 进行netbios名解析 使客户端能浏览服务器的共享资源 协议端口 sm
  • 堆的用法总结

    堆 heaps 不是容器 而是一种特别的数据组织方式 堆一般用来保存序列容器 堆很重要 很多不同的计算机进程中都使用了它们 为了弄明白堆是什么 首先需要明白树是什么 因此首先说明树这种数据结构是什么 树是分层排列的元素或节点 每个节点有一个
  • Hive架构及基础知识

    1 用户接口 Client CLI hive shell JDBC ODBC java 访问 hive WEBUI 浏览器访问 hive 2 元数据 Metastore 元数据包括 表名 表所属的数据库 默认是 default 表的拥有者
  • C++多态学习(二)完整定义:什么是多态?

    多态分为静多态和动多态 1 静多态 函数重载 是一种多态现象 通过命名倾轧在编译阶段决定 故称为静多态 2 动多态 动多态 不是在编译器阶段决定 而是在运行阶段决定 故称为动多态 动多态形成的条件如下 1 父类中有虚函数 2 子类overr
  • SpringBoot使用@Async实现多线程异步

    SpringBoot使用 Async实现多线程异步 一 什么是异步 说明 在同步操作中 我们执行到添加数据库的时候 我们必须等待这个方法彻底执行完才能执行 修改数据 完成后 发送短信 完成后 发送消息 等操作 如果插入数据库这个动作执行时间
  • 全新防火墙6.0 单条PPPOE(ADSL)上网配置

    一 组网需求 外网接口使用ADSL拨号 内网为192 168 1 0 24网段 实现基本上网功能 二 网络拓扑 三 配置要点 1 配置接口 wan1口 接ADSL的接口 务必勾选 从服务器重新获得网关 这样ADSL拨号成功后设备会自动生成默
  • 软件工程面试——数据库

    数据库实体的关系 数据库中的实体关系指的是不同实体之间的相互依赖和联系 实体关系是数据库设计中非常重要的一个概念 它是用于描述不同实体之间的关系 连接和交互方式的 在数据库中 一个实体通常指的是一个对象或者一个概念 比如一个人 一个订单或者
  • powerdesigner如何生成数据库表

    1 建立逻辑数据模型 2 构建基础模板 3 转为PDM 4 生成sql文件 数据库设计的步骤是什么
  • C++11新关键字noexcept、override、final把我们的心意告诉编译器

    noexcept告诉编译器不抛异常 异常时一定要处理的 如果一个函数出现异常 它内部不对该异常做处理 异常会一直往上传递 给函数的调用者 到最后一直没有被处理 程序就会终止 调用std terminate 它默认调用std abort vo
  • 以太坊交易信息及event、input、logs、topics等概念机制

    文章目录 一 交易信息获取 1 1 合约事件例子定义 1 2 以太坊交易获取 二 input解析 2 1 input内容解析 2 2 input处理逻辑 三 logs解析 3 1 logs解析代码 四 topics 4 1 概念 4 2 i
  • C++拷贝构造函数

    目录 前言 一 拷贝构造函数 1 概念 2 笔试题 拷贝构造的次数 3 特征 1 拷贝构造函数是构造函数的一个重载形式 2 拷贝构造函数的参数只有一个且必须是类类型对象的引用 使用传值方式编译器直接报错 因为会引发无穷递归调用 那怎么理解无
  • CS294-112 homework2 环境配置 environment configuration

    先把结论 最终结果 放在最前面 结论就是 我没有在windows环境下配起来环境 主要是因为不知道怎么解决C 14的问题 最终是在ubuntu容器里配好了环境 失败经历 这一段是失败的经历 写在这里是为了尽量让有相同经历的人能找到这篇博客
  • java8 List<Map<String, Object>>求和,排序,过滤,分组

    List
  • 2023年第十五届华中杯赛题C 题 空气质量预测与预警

    2023年五一假期期间 数学建模竞赛就有四场 各种比赛各种需求应接不暇 因此 对于本次浅析有不足的地方欢迎大家指出 为了更好的帮助大家华中杯参赛 下面带来 C题详细版思路 由于C题的难度 注定选题人数将不可计数 因此对于每一问求解已经不再是
  • Unity 串口接收的报文不完整?处理方式在这

    Unity 串口通讯接收完整报文并处理 串口通讯 Read 函数的处理 解决问题的过程 对Read 函数的应用 弊端 结束 串口通讯 Unity 中的串口通讯和C 的处理方式基本一致 Serial Read 可以读取缓存区中的十六进制数 S