【发布时间】:2012-10-09 02:43:41
【问题描述】:
我已经与这个问题斗争了一天,但我找不到答案。 我正在尝试通过 Compact Framework C# 中的 COM 端口从 GPS 设备读取数据。我正在使用 SerialPort 类(实际上是我自己的 ComPort 类装箱 SerialPort,但它只添加了我需要的两个字段,没什么特别的)。
无论如何,我在一个单独的线程中运行 while 循环,该线程从端口读取行,分析 NMEA 数据,打印它们,捕获所有异常,然后我休眠(200)线程,因为我需要 CPU 用于其他线程.. . 没有睡眠它工作正常,但使用 100% CPU.. 几分钟后我不使用睡眠时,COM 端口的输出如下所示:
GPGSA,A,3,09,12,22,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,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 中,在读取之后。)
有没有人遇到过类似的问题?我真的不知道我做错了什么.. 获得它的唯一方法是删除最后一个睡眠。
【问题讨论】:
-
你考虑过异步操作而不是休眠吗?
标签: c# multithreading compact-framework serial-port