c#串口DataReceived触发时好时坏。该如何处理
c#串口DataReceived触发时好时坏。
private void serialPort_medGasAlm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] gasAlmRx = new byte[200] ;
System.Threading.Thread.Sleep(150); //最好是等过100ms等数据完整到达时再处理,如果数据实在是太大,就可以换另一种机制
try
{
serialPort_medGasAlm.Read(gasAlmRx, 0, serialPort_medGasAlm.BytesToRead );
// serialPort_medGasAlm.DiscardInBuffer();
gasCommFlag=0;
}
catch (Exception e1)
{
MessageBox.Show(e1.Message, "接收数据异常"); //处理错误
return;
}
接收的字节只有5个,每0.5秒发送一次。触发时有时断,有时5、6秒才触发一次,等一下又正常0.5触发一次,是哪出问题?
用串口精灵却能正常接收。
------解决思路----------------------
Sleep 可能会导致数据丢失,最好使用异步回调方式接受并处理 获取到的数据。
或者 使用队列 接受数据,开2个线程,一个线程接受数据;另一个处理队列中的数据。
------解决思路----------------------
DataReceived事件不能有延时,那怕是1ms都有可能造成数据丢失。
如果你想用接收数据的间隔拆分数据,可以使用多线程+读超时方案。
------解决思路----------------------
http://www.bmpj.net/article-1-1.html
[SuperIO概述]工业串口和网络软件通讯平台(SuperIO)
------解决思路----------------------
肯定是处理慢了,重开一个线程,与主线程分开,用一个while(true)循环接收数据和处理数据
private void serialPort_medGasAlm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] gasAlmRx = new byte[200] ;
System.Threading.Thread.Sleep(150); //最好是等过100ms等数据完整到达时再处理,如果数据实在是太大,就可以换另一种机制
try
{
serialPort_medGasAlm.Read(gasAlmRx, 0, serialPort_medGasAlm.BytesToRead );
// serialPort_medGasAlm.DiscardInBuffer();
gasCommFlag=0;
}
catch (Exception e1)
{
MessageBox.Show(e1.Message, "接收数据异常"); //处理错误
return;
}
接收的字节只有5个,每0.5秒发送一次。触发时有时断,有时5、6秒才触发一次,等一下又正常0.5触发一次,是哪出问题?
用串口精灵却能正常接收。
------解决思路----------------------
Sleep 可能会导致数据丢失,最好使用异步回调方式接受并处理 获取到的数据。
或者 使用队列 接受数据,开2个线程,一个线程接受数据;另一个处理队列中的数据。
------解决思路----------------------
DataReceived事件不能有延时,那怕是1ms都有可能造成数据丢失。
如果你想用接收数据的间隔拆分数据,可以使用多线程+读超时方案。
------解决思路----------------------
http://www.bmpj.net/article-1-1.html
[SuperIO概述]工业串口和网络软件通讯平台(SuperIO)
------解决思路----------------------
肯定是处理慢了,重开一个线程,与主线程分开,用一个while(true)循环接收数据和处理数据