C#解决串口通信中接收数据时延迟处理与缓存处理的方法

2023-05-16

C#解决串口通信中接收数据时延迟处理与缓存处理的方法
时间:2011-1-21 14:04:29 来源:www.cnblogs.com 作者:杨少宁 
-
-
利用串口进行通信,当发送方(A)将数据写入串口后,通过无线或有线方式将数据传送给接收方(B),B通过调用串口读方法comm.read(参数)即可将数据读出。原理十分简单,但最近在利用串口处理SM-42无线传输时,数据总是一段一段的传到B,并不能在comm_DataReceived方法中单纯使用read方法将数据接收完全。我知道用缓存机制,但由于经验少(正在实习),到网上找了找大牛们的方法,并结合自己的理解,发现有两种方法可以处理。
方法一:comm_DataReceived(Comm控件的数据接收方法,当有数据来临时会触发)会创建一个线程(悲哀,因为之前不知道它另辟线程,所以自己编写了一个线程处理函数),因此当串口在等待数据时,不影响主窗体或主线程的操作。所以当数据到来时,可以通过Thread.Sleep(100)让接收函数休息100毫秒,这100毫秒做什么用呢?就是让所有的数据都到达B时再读取,这样就逃避了分批到达的问题。很明显,这是在糊弄。因为万一100毫秒都不够呢?所以,方法二更合适。
 Code [http://www.xueit.com]1 private void comm_DataReceived(objectsender, EventArgs e)
2 {
3             Thread.Sleep(100); //等待100毫秒
4              int nReviceBytesNum =comm.BytesToRead; ///收到的字节数。
5              byte[] ReadBuf = new byte[nReviceBytesNum]; ///定义接收字节数组
6              comm.Read(ReadBuf, 0, nReviceBytesNum);  ///接收数据   
7  }
方法二:使用缓存机制完成。首先通过定义一个成员变量List<byte> buffer = new List<byte>(4096);用来存放所有的数据,在接收函数里,通过buffer.AddRange()方法不断地将接收到的数据加入到buffer中,并同时对buffer中的数据进行检验,如果达到一定的长度并且校验结果正确(校验方法在发送方和接收方一致),再进行处理。具体代码如下:
 
 Code [http://www.xueit.com]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中进行校验
                    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);
                    /执行其他代码,对数据进行处理。
                }
                else //帧头不正确时,记得清除
                {
                    buffer.RemoveAt(0);
                }
            }
        }在方法二中,有一句“执行其他代码,对数据进行处理”,如果这些代码涉及到主线程的控件比如Label,TextBox,就要涉及跨线程访问控件的问题。
标签:
100%(3) 0%(0)学IT精品素材下载 进入主页jQuery版自动滚动图片动画特效插件可处理图片JSON数据源JS+CSS仿腾讯QQ首页搜索框无刷新换肤效果代码不可多得漂亮的9款CSS竖向菜单美化样式打包下载打包10款仿Vista的CSS导航菜单(蓝绿风格、银灰风格等)推荐文章C#查找字符串截取函数(原创)C#开发ActiveX控件,.NET开发OCX控件案例深入了解C#系列:谈谈C#中垃圾回收与内存管理机制C#高手之路详解解析Hashtable、Dictionary、SortedDictionary、SortedList的比较应用推荐C#开发桌面自动更新程序(服务端与客户端) .NET程序员面试必备之c#经典面试题目答案解决C#中Thread.Sleep()的作用及用法详解C#打包应用程序图教程C#使用SOCKET编程实现服务器+客户端的聊天程序示例C#操作XML的类:xmlHelper例子好文推荐:C#程序如何脱离.net框架的运行多种方法与应用C#使用WebBrowser获取网页验证码图片实例详情学习C#中System.IO.File类和System.IO.FileInfo类的用法C#实现把WORD文档内容保存到数据库推荐详解HTTP协议及其POST与GET操作差异,还有C#使用POST、GET等介绍C#高级应用:使用C#获取网页验证码图片的内容
回复:C#解决串口通信中接收数据时延迟处理与缓存处理的方法
请大家保持房间整洁,爱护花花草草,文明发言

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

C#解决串口通信中接收数据时延迟处理与缓存处理的方法 的相关文章

  • python-异常

    https docs python org 3 library exceptions html 异常 程序在运行过程中 xff0c 不可避免的出现一些错误 没有赋值的变量使用了不存在的索引除0 这些错误在程序中 xff0c 称为异常程序运行
  • STM32CubeMX串口USART中断发送接收数据

    本文代码使用 HAL 库 文章目录 前言一 中断控制二 USART中断使用1 中断优先级设置 xff1a 2 使能中断3 使能UART的发送 接收中断4 中断收发函数5 中断处理函数6 中断收发回调函数 三 串口中断实验串口中断发送数据点亮
  • 关于gcc、make和CMake的区别

    CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLists txt文件 xff0c 然后用cmake命令将CMakeLists txt文件转化为make所需要的m
  • gcc与g++的区别

    一 编译的四个阶段 预处理 xff1a 编译处理宏定义等宏命令 xff08 eg define xff09 生成后缀为 i 的文件 编译 xff1a 将预处理后的文件转换成汇编语言 生成后缀为 s 的文件 汇编 xff1a 由汇编生成的文件
  • 网络编程第一篇之Select模式

    网络编程第一篇之Select模式 今天总结下Select模式下网络编程模型 xff0c 首先我们要知道一个高级的技术 xff0c 绝对不是凭空产生的 xff0c 它一定是在原来的技术上由于满足不了需求 xff0c 然后经过不断的打磨 xff
  • 佛学八正道

    八正道包括正见 正思惟 正语 正业 正命 正精进 正念 正定 大毘婆娑论 说 xff1a 由正见故 xff0c 起正思惟 xff1b 由正思惟故 xff0c 得正语 xff1b 由正语故 xff0c 复得正业 xff1b 由正业故 xff0
  • C语言疑难点汇总解析

    1 大小端知识点 1 1 大小端定义 1 Little Endian就是低位字节排放在内存的低地址端 xff0c 高位字节排放在内存的高地址端 2 Big Endian就是高位字节排放在内存的低地址端 xff0c 低位字节排放在内存的高地址
  • 常见硬件接口汇总(未完待续)

    1 UART 通用异步收发器 xff0c 用于收发数据的串并转换 2 I2C 双线串行接口 3 I3C 4 SCI SIM卡接口 xff0c 接在APB总线上 xff0c 用于与外部读卡器通信 实际也是串并转换的通信方式 5 CSI 6 P
  • 芯片的ATE测试简介

    ATE xff1a Automatic Test Equipment xff0c 即自动测试设备 xff0c 它用于芯片大规模生产测试 xff0c 保障稳健 xff08 质量 成本和进度 xff09 的供应 ATE测试基本的覆盖理念 xff
  • Android发展历程

    发展历程 2003年10月 xff0c Andy Rubin等人创建Android公司 xff0c 并组建Android团队 2005年8月17日 xff0c Google低调收购了成立仅22个月的高科技企业Android及其团队 安迪鲁宾
  • Android系统源码目录详解

    关于源码的阅读 xff0c 你可以访问 xff1a http androidxref com 我们要先了解Android系统源码目录 xff0c 为后期源码学习打下基础 当然 xff0c 最好是将源码下载下来 下载源码可以使用清华大学开源软
  • 使用Iperf工具测试WiFi的吞吐量

    1 windows 上测试网路吞吐量工具 对于window测试网络吞吐量的工具 http download csdn net download leekwen 3427386 iperf windows版测试软件 针对wifi性能进行测试
  • C++封装的HTTP和HTTPS的接口

    记录下http和https的post方法 在C 43 43 中实现 来源无从考究了 xff0c 这里记录一下 http 的post 方法 BOOL HttpPostToBusinessServer LPCTSTR serverAddr st
  • (*((volatile unsigned long *) 0xE0028000)) 作用小解

    define IO0PIN volatile unsigned long 0xE0028000 no in lpc210x 以此句为例 简述如下 与51单片机的头文件 lt reg51 h gt 类似 在ARM处理器中 也必须有自己的寄存器
  • (M052)利用PWM波实现LED灯亮度调节

    include lt stdio h gt include lt stdint h gt include 34 M051 h 34 include 34 Register Bit h 34 include 34 Common h 34 in
  • 网络调试助手TCP server不能成功连接

    正文 xff1a 在使用网络调试助手时 xff0c 想一个建立TCP server xff0c 一个建立TCP client xff0c 两者之间进行通信 xff0c 打开网络调试助手其默认读取本地IP地址 xff0c 而端口号默认为808
  • 单片机 GSM 模块应用

    如果你只要发送英文而已 xff0c 那你很幸运 xff0c 因为仅仅为了发送个字符而已是很简单的 TEXT模式满足你的要求 xff0c 但是不爽的是 xff0c 我的上司要求我要中文字符一起混发 xff0c 还好有unicode xff0c
  • OSInit()简介

    在uC OS II的学习中 xff0c OSInit 是一个重要的函数 xff0c 它在OS应用中的void main 函数中首先被调用 xff0c 是OS运行的第一个函数 如下程序 xff0c 它完成各初始变量的初始化 xff0c 建立任
  • OSStart()函数简介

    多任务的的启动是通过调用OSStart xff08 xff09 实现的 xff0c 而在启动uc os之前至少需要建立一个应用任务 OSStart xff08 xff09 函数源码 void OSStart void INT8U y INT

随机推荐

  • SMS编码之PDU – 接收短信篇

    上一篇文章简单介绍了下收发短信需要用到的AT指令 xff0c 这篇文章详细分析SMS编码中的PDU编码 首先我用测试手机向短信猫中的sim卡发送了两条短信 xff0c 内容分别为 xff1a Hello World Hello World
  • PDU短信发送与接收格式分析

    一 PDU发送和接收格式分析 PDU是大多数手机短信通讯的核心 xff0c 仅有少数手机只支持Text模式 PDU模式比起Text模式可以提供能为强大的功能 xff0c 但其编码较Text模式困难 无论哪种模式 xff0c 我们都可以通过A
  • ucos OSTimeDly

    来源 xff1a http blog sina com cn s blog 5f9b3de40100e182 html OSTimeDly 在Task中 xff0c 一般执行一段时间之后调用OSTimeDly推迟一段时间再继续运行 xff0
  • WinCE中断结构分析

    以前写的原创博文 xff0c 这里放一份 前一段时间研究了一下WinCE下的中断结构 xff0c 整理了一下 xff0c 希望与大家讨论 最下面有PDF版本下载 xff0c 便于保存 Windows Embedded CE 中断结构分析 关
  • Google chrome 中文版下载

    Google release了自己的浏览器Chrome xff0c 大家可以试试看 xff0c 我觉得还不错 xff0c 对Web2 0的支持还好 xff0c 不知道安全性如何 我发现看tudou和youku等视频有问题 内存占用太大了 x
  • (下载)WinCE注册表编辑器(PC端)

    可以在PC上通过ActiveSync来查看 xff0c 修改device端的注册表 xff0c 方便调试 http download csdn net source 749005 注 xff1a 本人提供的下载均不要资源点
  • (下载)WinCE镜像传输工具ESHELL

    WinCE镜像传输工具ESHELL 使用这个可以不用装PB也可以传输镜像 xff0c 其实就是一个TFTP的传输 xff0c 适用于CE5 xff0c CE6 http download csdn net source 835336 不用资
  • I/O的控制方式——查询,中断,dma

    早期 xff0c I O串行 xff0c 查询方式 发展 xff0c I O并行 xff0c 两种方式其一是中断方式 xff0c 其二是dma方式 xff0c 使得外部设备能直接与主存储器信息交换 xff0c 减轻了cpu的工作量 技术继续
  • 关于WinCE下MC55使用Unimodem进行GPRS拨号,拨上出现断开连接,检查波特率的问题的另一种可能情况

    http www armce com bbs thread 59 1 1 html
  • WinCE上BINFS实现详解

    作者 wwfiney 64 ARMCE 网上不少介绍三星24x0系列的BIN FS启动方式实现 xff0c 有些内容上描述的不是非常全面 下面就WinCE6上的BINFS实现 xff0c 从基本原理 到修改BSP xff0c 再到如何烧录启
  • i.MX27支持8GBSDHC卡驱动修改

    最近需要给mx27加上SDHC驱动 以支持SDHC的SD卡 网上许多关于2440支持SDHC的文章 xff0c 借鉴很多 xff0c 但是由于MX27驱动的特殊结构 xff0c 需要做更多改动 xff0c 详细如下 xff1a 平台 xff
  • /etc/init.d/rcS文件详解

    我使用的简单rcS文件内容如下 最后的IP地址设定非常重要 xff0c 一定要跟服务器的地址再同一个网段 xff0c 不然会出现无法连接错误 nfs server 192 168 0 102 not responding still try
  • CAN通讯的byte序和bit序

    听别人说起CAN通讯协议的时候总说到Intel格式和motorola格式的时候 Intel格式如何 xff0c Motorola格式又如何 xff1f 觉得很有必要搞懂这些知识 xff0c 也看了相关资料 xff0c 可直到今天还没明白 真
  • ROS学习笔记(一):创建工作空间和功能包

    所有的ROS程序 xff0c 包括我们自己开发的程序 xff0c 都被组织成功能包 xff0c 而ROS的功能包被存放在称之为工作空间的目录下 因此 xff0c 在我们写程序之前 xff0c 第一步是创建一个工作空间以容纳我们的功能包 其实
  • PHP活动报名小程序系统源码 带后台管理程序

    活动报名小程序源码 xff0c 基于thinkphp开发的报名小程序源码 xff0c 带有后台管理 xff0c 用户发布活动信息 报名可以后台管理 xff0c 基本都还是可以的 不过需要注意的是 xff0c 用户注册部分是发送手机短信 xf
  • NVIDIA Jetson Xavier NX部署VINS-fusion-GPU

    组内大佬师兄今天抽出时间总结了一篇博客 xff0c 主要内容是 xff1a 把在阿木P450无人机上 xff0c 对自带的NVIDIA Jetson Xavier NX边缘计算机部署VINS fusion GPU教程 xff0c 并进行实验
  • 接口策略路由配置(通过流策略技术实现)

    策略路由 xff1a xff08 先于路由表 xff0c 且不会生成路由表 xff09 策略路由和路由策略都可以影响数据包的转发过程 xff0c 但他们对数据包的影响方式是不同的 本地策略路由 xff1a 仅对本机 下发的报文进行处理 xf
  • Mac Xcode崩溃 (打开ios项目引起崩溃)

    bug xff1a 每次打开此工程都会导致Xcode崩溃 其他工程没有问题 解决办法 xff1a 1 确定本地跟服务器没有需要更新和提交的代码 2 把本地工程移到废纸篓 3 从新check out工程 4 新工程完美运行 xff08 这样没
  • Mac上VScode使用clang-format格式化c++代码

    一 安装 需要安装插件c c 43 43 xff0c 不推荐使用clang format这个插件 xff0c 毕竟c c 43 43 里面已经支持了clang format格式化操作 安装这个clang format插件也有一个好处 xff
  • C#解决串口通信中接收数据时延迟处理与缓存处理的方法

    C 解决串口通信中接收数据时延迟处理与缓存处理的方法 时间 2011 1 21 14 04 29 来源 www cnblogs com 作者 杨少宁 利用串口进行通信 xff0c 当发送方 xff08 A xff09 将数据写入串口后 xf