C# 串口通信DataReceived事件触发时机

count初值为0,State初始值为false 且只要执行ClientPort_DataReceived(),State就会被设为true,执行 ClientPort.Write(bytevoltage, 0, 10)后另一程序回将该10个字节回发;但是下面的程序为什么会先执行SendVoltage(Int16[] voltagevalue)里的while循环5次之后再执行ClientPort_DataReceived()五次,不能动态改变State的值。
部分代码如下:

1、State 设置这个变量的作用是什么?
2、while 为什么要同时循环 5 次给 5 个通道发数据?
3、while循环的时候,程序此时处于死循环状态,等while循环结束后,程序才会苏醒;
程序苏醒后,才会进行串口接收。追问

其实是这样的,我总共有18帧数据,每发完一帧就让对方返回接收到的数据,然后发送程序根据校验结果来确定重发(重发5次还是错的就返回,报错)还是发送下一帧数据

追答

也就是说,你5次数据,是发送给同一台设备的?
那你就不敢使用 while 等循环执行的工程,你应该在你串口接收里面做处理;
每当发送数据后,发送处于等待状态,而不是连续发送,等到串口返回数据,接收后;

根据接收到的数据做分析,如果数据校验正确,接着发下一条指令数据,串口等待验证;
如果数据校验不正确,重发上次的指令数据,然后等待串口接收,验证是否正确。

能否将你的代码发给我(你现在代码的截图),我实际测一下

追问

根据你的提示我把逻辑改了,差不多快实现了,就是还有一点问题:前十几帧数据发送完全正常,但最后一帧发送出现问题,由于我用的是笔记本,没有串口,我虚拟了一对串口,要帮忙测试的话那真是非常感谢,请把邮箱发给我,我把工程连同虚拟软件一同发给你。

追答

我给你私信了!
最后一帧是什么问题?

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-07
正在学习中,我也帮你顶一下, mark

C# 串口接收事件是什么时候触发?
是一直监测串口接收缓冲区,只要满足条件就接收数据 触发条件是你自己设定的,至于接收多少数据触发你自己在软件中设定的,有参数设定的,具体参数是:ReceivedBytesThreshold 获取或设置 DataReceived 事件发生前内部输入缓冲区中的字节数。 具体情况参考serialport类中的详细说明 ...

C# serialport内datareceived事件接收串口数据,详细步骤。
byte[] data = new byte[serialPort1.BytesToRead]; \/\/定义缓冲区,因为串口事件触发时有可能收到不止一个字节 serialPort1.Read(data, 0, data.Length);\/\/读取指定长度 foreach (byte Member in data) \/\/遍历用法 { string str = Convert.ToString(Member, 16).ToUpper();textBox1.AppendText...

C#Datareceived问题
注意ReceivedBytesThreshold属性,默认值是1,表示接收缓冲区每有一个字节就促发 DataReceived事件。如果该属性数值过大,那边缓冲区的字节数需达到这个值才会促发DataReceived事件。如果串口打开并且确认另一端串口已发送数据。且ReceivedBytesThreshold为合理的值。就会促发DataReceived事件。如有疑问,继续追问。

...但数据接收不到,DataReceived事件总是不触发?
设置好串口和比特率点击open,然后编辑内容发送.用下面的方法接收.private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { try { if (serialPort1.IsOpen) { StringBuilder strb = new StringBuilder(); byte[] l_byte = new by...

C#串口接收数据如何做到完整,不丢字节包,串口超时处理
首先,我关注的是Port_DataReceived这个数据接收的触发函数。在处理串口数据时,我添加了自定义的超时处理逻辑,当接收数据超过预设的时间段仍未完成时,系统将自动停止等待并标记为接收失败。这样,可以避免因为串口通讯不稳定导致的数据包被分成两部分,从而保证了接收数据的完整性。经过实践,这种方法证明是...

...接收数据,每次都不能触发DataReceived。我知道DataReveived在辅助...
由于串口在不断的接收数据,DataReceived事件在不断的触发,所以数据处理放到委托里面,DataReceived只做数据接收,假如你把数据处理放在DataReceived事件中,可能会影响到数据的接收。如果你对委托不太了解,可以查阅MSDN文档:http:\/\/msdn.microsoft.com\/zh-cn\/library\/ms173171.aspx 另外,调试的话最好不...

c#缓冲数据为0还会触发DataReceived事件
DataReceived 时将引发事件在辅助线程上从接收数据 SerialPort 对象。 由于在次级线程上引发此事件,并且不主的线程尝试修改了主线程,例如用户界面元素中的某些元素可能会产生一个线程处理的异常。 如有必要修改元素在主Form 或 Control, 、 使用回发更改请求 Invoke, ,哪种将不正确的线程上的工作。

C# 串口如何一次性接收完数据?
c#是使用流来处理串口的,所以不是存在准确的间隔时间的。串口驱动并不一定能及时引发DataReceived事件。而且串口的不确定性也不能用时间间隔作为数据的分隔。下位机应使用特定的通信协议来传送数据。电脑则使用默认的每来一个字节触发一次DataReceived,但这个触发时机也是不准的,不可能真的每来一个字节...

C# 串口的DataReceived事件无法触发?
1.你可以在接收事件函数的开始位置延迟一段时间,根据数据长度的不同可以适当改变延迟的时间。2.根据你接收的数据格式可以使用不同的Read方法。ReadTo()方法是直到读到相应的字符为止,ReadLine()方法是读到一个新行,Read()读取缓冲区的字节数。希望对你有帮助。不懂的话可以继续问。

c# serialport.read(read,0,6)读取错误
if(serialport.ByteToRead>0){ serialport.read(read,0,serialport.ByteToRead)} 清没清自己看下读取前后 serialport.ByteToRead 这个属性就好了

相似回答