Thread.Sleep()发疯后,SerialPort ReadLine()

时间:2010-12-27 01:47:08

标签: c# multithreading compact-framework serial-port

我一直在争论这个问题一天,我找不到答案。 我试图通过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中,在读取之后。)

有没有人有类似的问题?我真的不知道我做错了什么..获得它的唯一方法是删除最后一次睡眠。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你的帖子中没有任何内容可以说明你是如何进行握手的。

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

如果您无法正确配置握手,只要您足够快地处理数据,您就可以侥幸逃脱 - 但是当您有睡眠时,数据可能会丢失。