关于串口通信丢失数据及多线程问题!!
我在网上看到一片文章“C#串口通信时丢失数据的一种解决方法”,
数据接收线程:
ReceiveThread() {
string str = ReceiveFormPort(); //从串口读取数据
queue. Enqueue( str ); //将数据存入队列
}
数据处理线程
DealData()
{
while( true ) //循环检测队列
{
if( queue.Count >= 1 ) //队列中有数据
{
string data = queue.Dequeue(); //将数据出队
DealWithReceiveData( data ); //处理数据
}
}
}
但是应用起来我有些问题:
我发送不同的命令到串口,接收的内容也不同比如:
//序列号
serialPort1.WriteLine("print,/par/rcv/sn");
rcvtemp = serialPort1.ReadLine().Split(ch);
if (rcvtemp[1] != "")
label33.Text = rcvtemp[1];
发送命令接收仪器序列号,显示在label上
还比如:
...........................
case 1:
#region 星图
try
{
serialPort1.DataReceived -= new
System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
serialPort1.DataReceived += new
System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived_1);
serialPort1.WriteLine("em,,nmea/{GGA,GSV,GSA}:1");
}
catch
{
MessageBox.Show("串口未打开!");
}
break;
#endregion
......................
//串口接收到数据(NMEA)
private void serialPort1_DataReceived_1(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string nmeaRead = this.serialPort1.ReadLine();
NmeaInterpreter nmea = new NmeaInterpreter();
nmea.SatelliteReceived += new NmeaInterpreter.SatelliteReceivedEventHandler(nmea_SatelliteReceived);
nmea.UTCTimeReceived += new NmeaInterpreter.UTCTimeReceivedHandler(nmea_UTCTimeReceived);
nmea.PositionReceived += new NmeaInterpreter.PositionReceivedEventHandler(nmea_PositionReceived);
nmea.Fixed += new NmeaInterpreter.FixedHandler(nmea_Fixed);
nmea.PDOPReceived += new NmeaInterpreter.PDOPReceivedEventHandler(nmea_PDOPReceived);
nmea.Parse(nmeaRead);
}
这里发送命令后,仪器不断返回数据,激活事件处理数据
我目前设计的程序连接设备经常出现连接不上,程序假死或者连接上后数据丢了,只有部分数据
我使用串口监控软件显示,ReadIntervalTimeout: -1, ReadTotalTimeoutMultiplier: -1, ReadTotalTimeoutConstant: -2,我怀疑这几个值有问题,但是SerialPort只有readtimeout,writetimeout两个属性可以设置,想用线程实现但是:
我不太明白怎么通过线程来实现数据接收线程与数据处理线程 ,期望您的解答,谢谢!!