C# 解决串口接收数据不完整

摘要:
具体代码如下:code privateList<byte>buffer=newList<byte˃;privatevoidsp_DataReceived//sp是串行端口控制{intn=sp.BytesToRead;byte[]buff=newbyte[n];sp.Read;//1.缓存数据缓冲区。AddRange//获取完整数据并将其复制到ReceiveBytes以进行验证缓冲区。CopyTo;bytejiaoyan;//启动验证jiaoyan=this.JY;if(jiaoyan!

方法1:

使 用缓存机制完成。首先通过定义一个成员变量List<byte> buffer = new List<byte> (4096);用来存放所有的数据,在接收函数里,通过buffer.AddRange()方法不断地将接收到的数据加入到buffer中,并同时对 buffer中的数据进行检验,如果达到一定的长度并且校验结果正确(校验方法在发送方和接收方一致),再进行处理。具体代码如下:代码 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);
}
}
}

方法2:

接收数据的事件如下:
 void commPlc_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] buffer=new byte[commPlc.BytesToRead];
            commPlc.Read(buffer, 0, commPlc.BytesToRead);
            instr = "";
            foreach (byte b in buffer)
            {
                instr += b.ToString("X2");
            }
主程序中:
outbuf = new byte[6] { 0x10, 0x02, 0x00, 0x5C, 0x5E, 0x16 };
                commPlc.Write(outbuf, 0, outbuf.Length);
                System.Threading.Thread.Sleep(600);

                if (instr == "681212680002083203000000000002000100000501FF4716")
                {
                  ………………………………
                 }

解决办法有两种,
一个是在DataReceived事件里加入
System.Threading.Thread.Sleep(600); 
byte[] buffer=new byte[commPlc.BytesToRead];
这样可以等待缓冲区的数据缓冲好,一次接收数据,也就是只触发一次DataReceived事件

方法二:
将instr定义成全局变量,删除事件里的instr="";这样可以保证每次触发的时候不会清空instr

以上内容仅仅是便于自己随手查阅使用

免责声明:文章转载自《C# 解决串口接收数据不完整》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue之v-if和v-show关于防止表单多次提交~按钮多次点击~限制点击事件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HBase实践案例:车联网监控系统

项目背景 本项目为车联网监控系统,系统由车载硬件设备、云服务端构成。车载硬件设备会定时采集车辆的各种状态信息,并通过移动网络上传到服务器端。服务器端接收到硬件设备发送的数据首先需要将数据进行解析,校验,随后会将该消息转发到国家汽车监测平台和地方汽车监测平台,最后将解析后的明文数据和原始报文数据存储到系统中。车辆的数据和其他数据需要通过web页面或rest...

RabbitMQ、Kafka、RocketMQ的优劣势

今天我们一起来探讨:  全量的消息队列究竟有哪些?  Kafka、RocketMQ、RabbitMQ的优劣势比较  以及消息队列的选型 最全MQ消息队列有哪些 那么目前在业界有哪些比较知名的消息引擎呢?如下图所示 这里面几乎完全列举了当下比较知名的消息引擎,包括:  ZeroMQ  推特的Distributedlog  ActiveMQ:Apach...

MySQL数据库运维的五大指标

如何评价一个公司数据库运维水平的高低?用什么来进行横向与纵向对比?自动化平台建设的目标是什么?必须有相应的指标体系来指导,此指标体系必须满足以下条件:• 可以用数字来测算和衡量• 最终指标,而不是中间指标比如有时DBA会关注数据库的吞吐量,但吞吐量越高不能代表数据库提供的服务质量越好,开发人员关心这个指标的原因也是因为担心过高的吞吐量会影响响应时间或者造成...

PTA录入数据库题目流程

作为一名数据库萌新,为这个过程我奋斗了3天了,这是第四天。这一天我终于可以写这个流程了。 废话少说,进入正题。 第一步: 安装sql server服务器(因我这数据库文档是mdf和ldf文档,故需要先进行数据迁移)。安装sql server服务器流程:待会附上链接; 安装mysql5.7及其mysql workbench工具。安装教程:https://ww...

Oracle 12c 数据库中scott用户不存在的解决方法

-- 使用超级管理员登录CONN sys/change_on_install AS SYSDBA ;-- 创建c##scott用户CREATE USER c##scott IDENTIFIED BY tiger ;-- 为用户授权GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO c##scott CONTAINE...

alluxio2.0特性-预览

项目地址 https://github.com/Alluxio/alluxio/tree/branch-2.0-preview 2.0版本-构思和设计 支持超大规模数据工作负载 Alluxio作为计算和存储之间的数据编排层,使数据移动并且可以跨多个不同的存储系统访问:HDFS,对象存储,网络附加存储,随着时间的推移,Alluxio需要的元数据支持规模 提供...