使用定时器提高读/写串行端口的速度

Posted

技术标签:

【中文标题】使用定时器提高读/写串行端口的速度【英文标题】:Increase speed of Read/Write Serial Port using Timers 【发布时间】:2011-10-31 11:05:11 【问题描述】:

我的代码可以读取和写入用 MFC 编写的串行端口。这些程序运行良好,但有点慢,因为发生了许多操作(读取和写入)。我有一个计时器,可以在串行端口上进行操作。计时器如下:

Loop_Timer = SetTimer(1,50,0);

串口传输信息如下:

BaudRate = 57600;
ByteSize = 8;
Parity = NOPARITY;
StopBits = ONESTOPBIT;
fAbortOnError = false;

定时器启动时会发生以下读写操作:

Write(command);
Read(returned_message);
returned_message.Trim();
...   
//finds a value from the returned string
...

因此,对于给定的选定选项,此读写操作可能发生 1、2、3 或 4 次。

例如:选项 1 要求上述函数在给定的计时器中发生 4 次。 选项 2 要求上述功能发生 2 次。 (因为它只有两个带返回值的变量)。 ETC ...

现在,我试图做的是提高整体操作的速度,使其稳健并快速响应。我尝试更改计时器,但它仍然很慢。有什么改进建议吗?

【问题讨论】:

【参考方案1】:

您最好在单独的线程中运行实际的串行端口处理,并使用 WaitCommEvent 而不是计时器来接收传入数据。将新接收到的数据附加到该线程本地的存储缓冲区中。

如果您愿意,可以使用计时器从您的串口线程中检索数据,或者让您的串口线程与您的主应用程序通信。当收到完整的消息时。

当向串口线程发送数据时,您需要一种机制,从而将数据本地存储到串口代码并从那里传输。

要记住的是,与所有其他通信方式相比,串行端口的传输和接收速度很慢,通过访问主应用程序线程上的串行端口,您会大大降低速度,尤其是在传输数据时。

如果您发现使用 Win32 API 和串行端口直接编码很痛苦,那么this class here 我发现它非常有用。

【讨论】:

感谢克里斯的信息。会调查的。

以上是关于使用定时器提高读/写串行端口的速度的主要内容,如果未能解决你的问题,请参考以下文章

使用python在串行通信中读取输入缓冲区

使用 Qt 的 C++ 中的线程串行端口通信

我的计时器通过我的游戏单次游戏后提高速度为什么?

求51单片机中,用C语言写的五个中断源的中断函数的书写规则,就是进入中断函数时的那个函数名,并说明...

spring定时器任务多任务串行执行问题排查

怎么用定时器写延时函数