首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SerialPort ReadLine()在Thread.Sleep()疯狂之后

SerialPort ReadLine()在Thread.Sleep()疯狂之后
EN

Stack Overflow用户
提问于 2010-12-27 01:47:08
回答 2查看 1.7K关注 0票数 1

我已经为这个问题争论了一天了,但我找不到答案。我试图读取数据从全球定位系统设备通过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

正如您所看到的,相同的消息被读了几次,但是剪切了。我想知道我做错了什么..。我的端口配置:

代码语言:javascript
运行
复制
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; 

我的阅读功能:

代码语言:javascript
运行
复制
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正常连接时就不会调用它。我在试着

代码语言:javascript
运行
复制
port.DiscardInBuffer();

在一些代码块之后(在TimeoutException中,在读取后)。

有人有类似的问题吗?我真的不知道我做错了什么。唯一的办法得到它的钻机是删除最后的睡眠。

EN

回答 2

Stack Overflow用户

发布于 2010-12-28 19:21:15

对所有有类似问题的人来说。第一个问题是缓冲区溢出。我有4096大小的缓冲区,而数据只是通过它流动,所以我正在阅读被破坏的句子。现在,我一次读取所有缓冲区并对其进行分析。第一句有时被弄坏了,但其余的没问题。

第二件事是设备问题。汤姆汤姆MkII有时失去与设备的连接。我不得不重新启动GPS并在Bt设备列表中再次找到它。问候

票数 1
EN

Stack Overflow用户

发布于 2011-01-08 12:02:28

在你的帖子里没有什么可以说明你是如何握手的。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4536219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档