C# 串口通信datareceive事件的问题

问题描述

privatevoidserialPort1_DataReceived(objectsender,SerialDataReceivedEventArgse){if(checkBox1.Checked==true){intbytesize=serialPort1.BytesToRead;byte[]buffer=newbyte[bytesize];serialPort1.Read(buffer,0,bytesize);stringreadString=ByteArrayToHexString(buffer);stringcopstr=readString.TrimEnd('');string[]sarray=copstr.Split('');intresult=string.Compare("A7",sarray[1]);if(result==0){stringa_8="0FA83031037A4E9EF0FF";serialPort1.WriteLine(a_8);}this.Invoke(updateText,newstring[]{readString});}else{stringreadString=serialPort1.ReadExisting();this.Invoke(updateText,newstring[]{readString});}}运行的时候总是说sarray[1]数组索引出错,我设置断点,调试的时候没事,一运行的时候bytesize变量就变为0导致后面的数组索引出错

解决方案

解决方案二:
断点调试的时候看看数组里面的数据。string[]sarray=copstr.Split('');
解决方案三:
bytesize至少要等于2的时候才能使用sarray[1]intbytesize=serialPort1.BytesToRead;if(bytesize==0){return;}
解决方案四:
2楼+1
解决方案五:
通讯的基础是数据帧或叫数据包,你首先要保证的的数据的完整性,但数据传输是连续的,所以往往需要一个通讯协议,例如02/03,分别表示数据包的开始/结束,这样,你接收到数据才能正确还原出一个数据包。如果简单一点的话,那可以Sleep(1000)//适当加延时,保证对方的响应数据都收到后才处理。具体到你的代码里面,可以在serialPort1_DataReceived事件里面第一时间先等待一下,然后再读取数据。
解决方案六:
引用1楼zongbao516的回复:

断点调试的时候看看数组里面的数据。string[]sarray=copstr.Split('');

断点调试的时候数据没错的,所有变量都是正常,sarray数组里的确有数据,但是一运行就会提示数组索引出错,我查看变量值发现bytesize是0
解决方案七:
intbytesize=serialPort1.BytesToRead;bytesize>0才继续往下运行!或者设置SerialPort.ReceivedBytesThreshold
解决方案八:
我在serialPort1_DataReceived延时了再读取数据还是不行,几天都没解决到问题啊....求高人指点!
解决方案九:
我在serialPort1_DataReceived延时了再读取数据还是不行,几天都没解决到问题啊....求高人指点!

时间: 2024-09-14 15:23:51

C# 串口通信datareceive事件的问题的相关文章

在串口通信中,给设备发送命令,DataReceive为什么要分两次来接收数据

问题描述 在串口通信中,给设备发送命令不管我Send几次,DataReceive为什么要分两次来接收数据,而且每次接收数据的长度不一样,为什么?求大神指点,谢谢了privatevoidserialPort_DataReceived(objectsender,SerialDataReceivedEventArgse){try{byte[]buffer=newbyte[serialPort.BytesToRead];serialPort.Read(buffer,0,buffer.Length);st

C#的串口通信的datarecieved事件

问题描述 本人初学串口通信,要实现一个实时的轮询和控制系统.要求和我看过的某帖类似,就是1.上位机下发的命令比较密集,以200ms周期发送实时状态轮询命令.2.在状态实时轮询命令中间有操作命令插入.3.不同的命令,接收的应答格式也不同.然后我在不同的获取数据的命令中给datareceived订阅了不同的处理函数,这些处理函数结尾又都解除自身的订阅.想问如果处理函数在200ms内不能完成,上位机的命令又来,datareceived会自动触发吗?此时触发的处理函数又是哪个?是当前仍在运行的处理函数还

VisualBasic串口通信程序设计

1mscomm.vbx通信控件描述 mscomm.vbx通信控件可直接从vb的toolbox中加入窗体form,即可用其进行通信.若toolbox中无此控件,则用tools的customcontrols将mscomm.vbx从windows的system子目录中加入vb的toolbox中. 1.1通信方式 mscomm.vbx有2种不同的方式来处理和解决各类通信软件的开发和设计问题 1.事件驱动.它与c/c 写windows软件时的窗口回调函数类似,是1种功能强大的处理问题的方法.在实际工作中,

linux编程-linux串口通信问题,急急急!!!

问题描述 linux串口通信问题,急急急!!! 我在开发板上qt程序,开发板跟PC机的虚拟机通过USB转串口线连接,上面运行的是Ubuntu12.04系统,我在PC上发送字符串,然后在开发板上接收,接收的数据单个单个字符接收,为什么不是一整个字符串接收呢?并且接收不到第一个字符,而且差不多接收10秒之后就不在接收数据了!!!!.请各位大神赐教!!! int fd,num,rtn; struct termios options; fd = open("/dev/ttyUSB0", O_R

.NET 串口通信

原文:.NET 串口通信 这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通信. 串口通信,以前一直觉得神秘,没想到用起来却这么简单.当然,这样简单要归功于 .NET 对其操作的封装. .NET 里提供了专门操作串口的类 System.IO.Ports.SerialPort,可以操作串口收发数据.只需要 new 一个对象,简单配置一下相关属性,就可

java串口通信

java串口通信API说明 java串口通信 2008/09/22 20:24 java串口通信API说明 java串口通信    Java提供了 CommunicationAPI(包含于javax.comm包中)用于通过与机器无关的方式,控制各种外部设备.Communications API,是标准的Java的扩展部分,它在JavaAPI中是没有附带的.因此,必须先在SUN公司网站的Java站点(www.java.sun.com)上下载这个扩展类库. 1.1Communications API

串口通信内存泄露-C#串口通信高速向下位机发送数据出现内存不断增加

问题描述 C#串口通信高速向下位机发送数据出现内存不断增加 using System; using System.Linq; using System.Collections.Generic; using System.Text; using System.IO.Ports; using System.Windows.Forms; namespace MSPCS { /// /// 通讯端口,用于和上位机通讯 /// 上行与下行使用同一种格式: /// /* 同步头 6 Byte EB90EB9

《单片机串口通信及测控应用实战详解》——6.3 PC端程序设计

6.3 PC端程序设计 单片机串口通信及测控应用实战详解 6.3.1 采用Visual Basic实现 1.程序界面设计 运行VB 6.0,创建标准的工程项目文件,设计程序窗体. (1)添加1个MSComm控件用于实现PC与单片机串口通信. (2)添加2个按钮控件CommandButton,用于输出指令和关闭程序. (3)添加3个文本控件TextBox,用于输入单片机地址.继电器状态和返回数据. (4)添加5个标签控件Label,用于显示文本框功能等. 2.属性设置 程序窗体.控件对象的主要属性

VB串口通信出现实时错误8020

问题描述 本人VB新手,最近用USB转RS232用VB编写出现了8020的问题,操作系统是WIN764位.用串口调试助手测试是没有问题的,可以发送接受数据,驱动说明没有问题.程序是从CSDN论坛上下载的(VB串口通信程序(VB程序)).请问各位大神有什么办法解决吗?下面附上代码和一些串口调试助手,和端口截图.代码:PrivateSubCMDRe_Click()TRe.Text=TRe.Text&vbCrLf&CStr(MSComm1.Input)MsgBox"2222first&