关于串口通信丢失数据及多线程问题!!

lxr2010bj 2013-06-24 07:23:23
我在网上看到一片文章“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两个属性可以设置,想用线程实现但是:
我不太明白怎么通过线程来实现数据接收线程与数据处理线程 ,期望您的解答,谢谢!!
...全文
421 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxr2010bj 2013-07-03
  • 打赏
  • 举报
回复
也是正在想多线程,队列加锁
bhx_8687 2013-07-03
  • 打赏
  • 举报
回复
查看设备关于串口数据的设置问题,波特率,奇偶校验,停止位是否与程序一直,设备上的发送方式要设置为连续发送。PC端与设备端,设置必须一致
huanglovesun3 2013-07-02
  • 打赏
  • 举报
回复
多线程,队列加锁
石灰石石英石 2013-07-02
  • 打赏
  • 举报
回复
一个生产者和一个读者的问题,就在队列上加一把锁就好了,去看什么生产者消费者反而复杂
烙饼 2013-07-02
  • 打赏
  • 举报
回复
我也是经常做串口通信的,接收数据函数就做一个,在这一个里面进行判断是哪个源的数据,然后分别处理
  • 打赏
  • 举报
回复
引用 楼主 lxr2010bj 的回复:
我在网上看到一片文章“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两个属性可以设置,想用线程实现但是: 我不太明白怎么通过线程来实现数据接收线程与数据处理线程 ,期望您的解答,谢谢!!
这个数据接收的思路应该没有问题,不过你这个涉及到通信协议,所以你要研究下你的通信协议! 串口接收数据,好比生产者,数据处理好比消费者,你的队列就是缓存。 你这个需求不简单是生成与消费,当接收到指定命令,你得回复响应,所以你要研究写通信协议。也就是数据处理部分的case,针对不同情况指令,做出不同动作。
linuxca 2013-06-25
  • 打赏
  • 举报
回复
是否是串口的参数设置问题,两边速度要一致.设备是什么设备,串口通讯也是自己设计的吗?
本拉灯 2013-06-25
  • 打赏
  • 举报
回复
引用 楼主 lxr2010bj 的回复:
我在网上看到一片文章“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两个属性可以设置,想用线程实现但是: 我不太明白怎么通过线程来实现数据接收线程与数据处理线程 ,期望您的解答,谢谢!!
请百度生成产与消费者。
lxr2010bj 2013-06-25
  • 打赏
  • 举报
回复
没人来解答么???
huanglovesun3 2013-06-25
  • 打赏
  • 举报
回复
我也正在学习编写串口的程序,可以多交流
Fox1536 2013-06-24
  • 打赏
  • 举报
回复
同问! mark

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧