我已经为这个问题争论了一天了,但我找不到答案。我试图读取数据从全球定位系统设备通过COM端口在紧凑框架C#。我使用的是SerialPort类(实际上是我自己的ComPort类装箱SerialPort,但它只添加了我需要的两个字段,没有什么特别的)。
无论如何,我在一个单独的线程中运行while循环,该线程从端口读取行,分析NMEA数据,打印它们,捕获所有异常,然后我睡眠(200)线程,因为我需要其他线程的CPU .没有睡眠,它可以正常工作,但是使用100%的CPU。当我几分钟后不使用睡眠时,来自COM端口的输出如下所示:
GPGSA,A,3,09,12,17,15,27,,,2.6,1.6,2.1*3F
GSA,A,3,09,12,22,17,15,27,,,2.6,1.6,2.1*3F
A,3,09,12,22,17,15,27,,,2.6,1.6,2.1*3F
,18,12,271,24,24,05,020,24,14,04,326,25,11,03,023,*76
A,3,09,12,22,17,15,27,,,2.6,1.6,2.1*3F
3,09,12,22,17,15,27,,,2.6,1.6,2.1*3F
09,12,22,17,15,27,,,2.6,1.6,2.1*3F
、12、22、17、15、27、2.6、1.6、2.1*3F
正如您所看到的,相同的消息被读了几次,但是剪切了。我想知道我做错了什么..。我的端口配置:
port.ReadBufferSize = 4096;
port.BaudRate = 4800;
port.DataBits = 8;
port.Parity = Parity.None;
port.StopBits = StopBits.One;
port.NewLine = "\r\n";
port.ReadTimeout = 1000;
port.ReceivedBytesThreshold = 100000; 我的阅读功能:
private void processGps(){
while (!closing)
{
//reconnect if needed
try
{
string sentence = port.ReadLine();
//here print the sentence
//analyze the sentence (this takes some time 50-100ms)
}
catch (TimeoutException)
{
Thread.Sleep(0);
}
catch (IOException ioex)
{
//handling IO exception (some info on the screen)
}
Thread.Sleep(200);
}
}在这个功能中还有更多的东西,比如如果设备丢失了就重新连接,但是当GPS正常连接时就不会调用它。我在试着
port.DiscardInBuffer();在一些代码块之后(在TimeoutException中,在读取后)。
有人有类似的问题吗?我真的不知道我做错了什么。唯一的办法得到它的钻机是删除最后的睡眠。
发布于 2010-12-28 19:21:15
对所有有类似问题的人来说。第一个问题是缓冲区溢出。我有4096大小的缓冲区,而数据只是通过它流动,所以我正在阅读被破坏的句子。现在,我一次读取所有缓冲区并对其进行分析。第一句有时被弄坏了,但其余的没问题。
第二件事是设备问题。汤姆汤姆MkII有时失去与设备的连接。我不得不重新启动GPS并在Bt设备列表中再次找到它。问候
发布于 2011-01-08 12:02:28
在你的帖子里没有什么可以说明你是如何握手的。
通常,您会使用软件(XON/XOFF)或硬件(例如RTS/CTS)握手,这样串口就会告诉发送程序在无法接收更多数据时停止发送。握手配置必须(当然)匹配发送设备的配置。
如果您不能正确配置握手,只要您处理数据足够快,您就可以逃脱它--但是当您睡眠时,数据可能会丢失。
https://stackoverflow.com/questions/4536219
复制相似问题