C#串口读数据DataReceived监听不能快速反应

.Net技术 码拜 8年前 (2016-02-27) 4881次浏览
各位老师同仁大家好,本人是一个新手,今天学习C#串口时候碰到了一个问题,还望大家指导,先谢谢了。
具体问题本人在windowsForm中用一个Button控件点击一下发送数据,用TEXTBOX显示读取的下位机数据。但是问本人发现SerialPort中的监听事件DataReceived反应不够积极,有时候Button点一次TEXTBOX有数据,有时候点多次才有数据。跟踪了一下DataReceived发现有时候可以进到事件中,有时候进不去。
不知道本人描述的问题能否清楚,再一次感谢大家的指导,代码如下:
public static void Send_Data()
{
byte[] B = new byte[3] { 0x4d, 0x30, 0x0d };
Com_Port.Write(B, 0, 3);
}

private static void Com_Port_DataReceived(object sender ,SerialDataReceivedEventArgs e)
{
Thread _readThread;
_readThread=new Thread (str_Recive);
_readThread.Start();
}
public static void str_Recive()
{
if (Com_Port.IsOpen == true)
{
byte[] readByte = new byte[Com_Port.ReadBufferSize];
int count = Com_Port.Read(readByte, 0, Com_Port.ReadBufferSize);
strbuffer = System.Text.Encoding.ASCII.GetString(readByte, 0, count);

}
else
{
TimeSpan waitetime = new TimeSpan(0, 0, 0, 50);
Thread.Sleep(waitetime);
}
}

解决方案

5

假如你处理所收到的消息时需要异步子线程中处理,那么你可以在 Com_Port.Read 执行完毕之后才使用子线程来处理(建议你使用系统线程池,而不要 new Thead() 实例。虽然后者启动任务的速度快,但是它也不会优化系统)。
除了不要乱使用 Thread、不要动不动就 Encoding.GetString(你应该在确定收到完整的一个消息之后,再Encoding.GetString),写 Thead.Sleep(50) 也是匪夷所思的。既然你不应该接受,就什么都不干就好了,为什么要故意阻塞你的程序50毫秒?到底是哪根筋搭错了要写 Thread.Sleep(50)?
凡是在通讯接受代码中写 Sleep() 的,基本上都是坑爹的一些博客中看到的。我们在一些”示例“中也许为了测试模拟”耗时的操作“而写 Thread.Sleep(50),你的真实应用怎么能胡乱出现这种我们用来“模拟一个耗时操作”的代码?

5

个人感觉是数据接收和解析没有分离导致效率低下
解决方案2楼已经说过了,
把数据解析放到线程池中去

10

C#串口读数据DataReceived监听不能快速反应
串口组件需要接收一定 字节数才会触发DataReceived事件,检查一下这个属性值

5

先确认你的下位机能否是即使回复的,可以用串口调试助手发指令试试。
假如是即使得,你看看串口对象里面有个属性,好像叫什么threshold,专门用来指示串口缓冲收到几个字节触发事件,把它设置成最小。

25

引用 14 楼 gx404965618 的回复:

老师 if (e.EventType == System.IO.Ports.SerialData.Eof)这句话的含义是什么?这个List<byte> data = new List<byte>(); 为什么要全局变量?原因是是新手所以不懂,忘解答,谢谢!

System.IO.Ports.SerialData 枚举的说明
https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialdata(v=vs.100).aspx
SerialPort.DataReceived 事件的说明
https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport.datareceived(v=vs.100).aspx
这都是 MSDN 的资料,仔细看备注


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#串口读数据DataReceived监听不能快速反应
喜欢 (1)
[1034331897@qq.com]
分享 (0)