在C#中使用seiralport类接收串口数据时有的数据会错位

问题描述

其中第一行和第二行的数据是正确的。从图中的下划线部分应该在圈出来的那些0的位置这是给两个串口设备分别创建线程因为要定时接收数据,所以使用了timer来定时触发以下是上图中publicclassGetData{publicSerialPortCom;stringdeviceType;stringcomPort="";intbaudRate=0;stringcode="";RichTextBoxRTB;publicGetData(stringcomPort,intbaudRate,stringcode,RichTextBoxRTB,stringdeviceType){this.comPort=comPort;this.baudRate=baudRate;this.code=code;this.deviceType=deviceType;this.RTB=RTB;if(deviceType=="01"){Com=newSerialPort(comPort);Com.BaudRate=baudRate;Com.DataReceived+=newSerialDataReceivedEventHandler(Com_WaterDataReceived);Com.ReceivedBytesThreshold=16;Com.Open();//发送代码string[]cmd=("FB53FF0001010000000000000000FB54").Split('');List<byte>bytes=newList<byte>();for(inti=0;i<cmd.Length;i++){bytea=Convert.ToByte(cmd[i],16);bytes.Add(a);}byte[]buffer=bytes.ToArray();Com.Write(buffer,0,buffer.Count());}elseif(deviceType=="02"){Com=newSerialPort(comPort);//Com.BaudRate=baudRate;Com.DataReceived+=newSerialDataReceivedEventHandler(Com_leakageReceived);Com.ReceivedBytesThreshold=5;Com.Open();}}privatevoidCom_WaterDataReceived(objectsender,SerialDataReceivedEventArgse){System.IO.Ports.SerialPortcom=(System.IO.Ports.SerialPort)sender;byte[]buffer=newbyte[16];com.Read(buffer,0,16);stringss;ss=byteToHexStr(buffer);//用到函数byteToHexStrRTB.Text+="【微水】【"+DateTime.Now.ToString()+"】:"+ss+"n";cancelEvent("01");}privatevoidCom_leakageReceived(objectsender,SerialDataReceivedEventArgse){System.IO.Ports.SerialPortcom=(System.IO.Ports.SerialPort)sender;RTB.Text+="【泄露】【"+DateTime.Now.ToString()+"】:"+com.ReadExisting().ToString()+"n";com.DiscardInBuffer();com.DiscardOutBuffer();cancelEvent("02");}privatevoidcancelEvent(stringdeviceType){if(deviceType=="01"){Com.DataReceived-=newSerialDataReceivedEventHandler(Com_WaterDataReceived);}elseif(deviceType=="02"){Com.DataReceived-=newSerialDataReceivedEventHandler(Com_leakageReceived);}}publicvoidaddEvent(stringdeviceTpye){if(deviceTpye=="01"){Com.DataReceived+=newSerialDataReceivedEventHandler(Com_WaterDataReceived);string[]cmd=("FB53FF0001010000000000000000FB54").Split('');List<byte>bytes=newList<byte>();for(inti=0;i<cmd.Length;i++){bytea=Convert.ToByte(cmd[i],16);bytes.Add(a);}byte[]buffer=bytes.ToArray();Com.Write(buffer,0,buffer.Count());}elseif(deviceTpye=="02"){Com.DataReceived+=newSerialDataReceivedEventHandler(Com_leakageReceived);}}///<summary>///字节数组转16进制字符串///</summary>///<paramname="bytes"></param>///<returns></returns>publicstaticstringbyteToHexStr(byte[]bytes){stringreturnStr="";if(bytes!=null){for(inti=0;i<bytes.Length;i++){returnStr+=bytes[i].ToString("X2");}}returnreturnStr;}}}

那么问题来了1.最上面的图里面数据丢失位用0填充是因为多线程的关系还是什么?2.接收缓冲区的大小已经设置了,为什么有时会收到几倍设置的大小的数据?3.对多个串口设备的定时接收数据,像我这样为每个设备开个线程,再在线程里面用timer来接收数据的写法对吗?刚接触串口通信和线程,跪求大家指点指点

解决方案

解决方案二:
麻烦大家帮忙看一下吧
解决方案三:
用DataReceived+多线程就可以了。不用什么timer因为数据是一直发送的,再使用timer容易造成数据丢失。
解决方案四:
引用2楼SlowlyHeart的回复:

用DataReceived+多线程就可以了。不用什么timer因为数据是一直发送的,再使用timer容易造成数据丢失。

这样要定时的话是是直接用thread.sleep()吗?本来是这么写的,老师非叫用timer
解决方案五:
开个线程专门接收数据放到一个数据链表里,什么都不做!另起线程或timer,处理数据链表里的命令,这样不会出错!除非数据线有问题

时间: 2024-09-19 10:50:20

在C#中使用seiralport类接收串口数据时有的数据会错位的相关文章

求解接收串口发送过来的数据

问题描述 如图这样,数据验证就一个帧头.一个是01,一个是02.其余的44,30,24,08分开显示在4个TEXTBOX里面,求解怎么弄? 解决方案 解决方案二:用正则表达式解析数据.解决方案三:这个要进行粘包处理解决方案四:按数据长度分帧处理啊解决方案五:贴出你自己接收到的数据,不要只贴别人写的东西.你收到的就是那种分不清楚0210跟1020分隔符区别的连续数字吗?

串口-VS2010下MFC CSerialport类接收问题

问题描述 VS2010下MFC CSerialport类接收问题 在VS2010的MFC下,用CSerialPort类时遇到下位机发送命令后上位机接收不到(下位机发BBBB),但是用串口精灵可以收到,我采用的是龚建伟老师介绍的加消息响应方法接收,是收到一次处理一次,不知道为什么会这样,怎么解决?网上有说是存到缓存从缓存处理,窝子安在这种情况怎么更改呢?希望有系统的解决思路或方法,非常感谢! 解决方案 串口精灵可以收到,只能说明你的代码有问题.贴代码出来分析吧! 或者,自己分析:但所有用到的系统函

C#异步数据接收串口操作类

数据|异步 使用C#调用传统32位API实现串口操作,整个结构特别的简单.接收数据只需要定义数据接收事件即可. 上传源代码我不会,需要源代码的请与我(dyj057@gmail.com)联系.你也可以教我怎么上传源代码. using System;using System.Runtime.InteropServices; /// <summary>/// (C)2003-2005 C2217 Studio 保留所有权利/// /// 文件名称: IbmsSerialPort.cs/// 文件ID

请问各位大神,在c#串口通讯中,怎么把接收到的数据保存在Excel表格中?

问题描述 请问各位大神,在c#串口通讯中,怎么把接收到的数据保存在Excel表格中? 本人最近做一个项目时需要把串口接收到的数据进行分析,数据量较大,比如5秒钟保存一次,连续工作一天,本人刚接触c#,串口通讯协议已写好,现在的问题是怎么把数据保存在Excel表格中以便分析?各位大神有没有用C#做过项目,求指教,最好有源代码!本人刚进论坛,没分,如果满意的话以后再补给你!!!!!!!!!急!!!!!! 解决方案 C#操作Excel(创建.打开.读写.保存)几种方法的总结 C#基于微软EXCEL类库

串口通信-接受一段时间中断后出现不接收的情况

问题描述 接受一段时间中断后出现不接收的情况 最近写了一个下位机程序,惯导通过422口发送数据给下位机.波特率为38400,发送周期为1s但出现的问题是:有时候下位机运行一段时间后(有时候一小时,有时候一天),下位机不接收惯导的数据了,惯导对应的422口中断也完全不产生了,必须中控重启才行.后来我用串口调试助手调试,把惯导数据的发送周期改到500ms以下时,中控就会不到1min中就开始不接受数据.初步判定是由于程序效率较低的原因,请各位大神帮忙分析下,有什么好的解决方法. 解决方案 给你两点建议

qt-QT第三串口接收数据后对数据进行解析

问题描述 QT第三串口接收数据后对数据进行解析 运用第三方串口类进行接收数据后 将数据存在temp中 ,然后再对temp进行解析判断进行不同的操作,但在编译时候会报错,如何解决? 解决方案 temp=='A'改成temp==""A""

代码-【MFC,VS2013中使用Serialport类的问题???急】

问题描述 [MFC,VS2013中使用Serialport类的问题???急] 10C 上位机软件.1.在VC6.0中用SerialPort类,数据的传输完全没有问题.[我代码没有问题]2.使用串口精灵传输命令没有问题.[我机器没有问题]3.但是我现在将代码用在VS2013发送数据就完全没有反应.[同样的代码同样的机器用VS2013就有问题]VS2013中我把数据发送分为2个部分:①初始化串口+②发送数据命令.如果每次发送格式是:①初始化串口+②发送数据命令[没有问题]如果格式是:②发送数据命令[

Struts 2中通过Action自动接收参数

Struts2中Action接收参数的方法主要有以下三种: 1.使用Action的属性接收参数:(通过属性驱动式) a.定义:在Action类中定义属性,创建get和set方法: b.接收:通过属性接收参数,如:userName: c.发送:使用属性名传递参数,如:user1!add?userName=Magci: JSP: <form action="sys/login.action" method="post"> <input type=&qu

Java网络编程从入门到精通(13):使用Socket类接收和发送数据

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 1.连接服务器 2.发送和接收数据 3.关闭网络连接 一.连