【问题标题】:SerialPort ReadLine() after Thread.Sleep() goes crazyThread.Sleep() 发疯后的 SerialPort ReadLine()
【发布时间】: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


【解决方案1】:

对于所有有类似问题的人。第一个问题是关于溢出缓冲区。我有 4096 大小的缓冲区,数据只是流过它,所以我正在阅读损坏的句子。现在我一次读取所有缓冲区并分析它。第一句话有时会损坏,但其余的都可以。
第二件事是设备问题。 Tom Tom MkII 有时会失去与设备的连接。我不得不重新启动 GPS 并在 Bt 设备列表中再次找到它。 问候

【讨论】:

    【解决方案2】:

    您的帖子中没有任何内容可以说明您的握手方式。

    通常您会使用软件 (XON/XOFF) 或硬件 (例如 RTS/CTS) 握手,以便串行端口在无法接收更多数据时通知传输停止。握手配置必须(当然)与发送设备的配置相匹配。

    如果您未能正确配置握手,只要您处理数据的速度足够快,您就可以侥幸逃脱 - 但是当您进入睡眠状态时,数据可能会丢失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      相关资源
      最近更新 更多