具体问题本人在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
除了不要乱使用 Thread、不要动不动就 Encoding.GetString(你应该在确定收到完整的一个消息之后,再Encoding.GetString),写 Thead.Sleep(50) 也是匪夷所思的。既然你不应该接受,就什么都不干就好了,为什么要故意阻塞你的程序50毫秒?到底是哪根筋搭错了要写 Thread.Sleep(50)?
凡是在通讯接受代码中写 Sleep() 的,基本上都是坑爹的一些博客中看到的。我们在一些”示例“中也许为了测试模拟”耗时的操作“而写 Thread.Sleep(50),你的真实应用怎么能胡乱出现这种我们用来“模拟一个耗时操作”的代码?
5
解决方案2楼已经说过了,
把数据解析放到线程池中去
10
串口组件需要接收一定 字节数才会触发DataReceived事件,检查一下这个属性值
5
假如是即使得,你看看串口对象里面有个属性,好像叫什么threshold,专门用来指示串口缓冲收到几个字节触发事件,把它设置成最小。
25
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 的资料,仔细看备注