我一直在争论这个问题一天,我找不到答案。 我试图通过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中,在读取之后。)
有没有人有类似的问题?我真的不知道我做错了什么..获得它的唯一方法是删除最后一次睡眠。
答案 0 :(得分:1)
对于所有有类似问题的人。第一个问题是关于溢出缓冲区。我有4096大小的缓冲区,数据刚刚流过它,所以我正在阅读损坏的句子。现在我立刻读取所有缓冲区并进行分析。第一句话有时会被破坏,但其余的都没问题 第二件事是设备问题。 Tom Tom MkII有时会失去与设备的连接。我不得不重启GPS并在Bt设备列表中再次找到它。 此致
答案 1 :(得分:0)
你的帖子中没有任何内容可以说明你是如何进行握手的。
通常你会使用软件(XON / XOFF)或硬件(例如RTS / CTS)握手,以便串口在无法接收更多数据时告诉发送停止。握手配置必须(当然)与发送设备的配置相匹配。
如果您无法正确配置握手,只要您足够快地处理数据,您就可以侥幸逃脱 - 但是当您有睡眠时,数据可能会丢失。