Qt:支持波特率 250k 的串行库

Posted

技术标签:

【中文标题】Qt:支持波特率 250k 的串行库【英文标题】:Qt: Serial Library that supports Baud Rate 250k 【发布时间】:2013-10-17 19:48:29 【问题描述】:

QSerialPortQExtSerialPort 都试过了,但似乎都无法正确支持 250k。 QExtSerialPort 似乎确实支持它,因为它是列出的波特类型,但每当我使用它连接到板时,我得到的都是垃圾数据,例如波特率设置不正确。我已经验证了所有其他设置,并且我已经使用 miniterm 对其进行了测试,因此该板确实可以工作超过 250k。是否有任何其他库或者我应该尝试与QExtSerialPort 不同的东西?

【问题讨论】:

您确定您说的是 Miniterm,而不是 Minicom 或其他什么? Miniterm 是 OS/X 上的辅助应用程序,它本身并不能真正使用。如果你说的是Minicom,那我可以看看它的源码,和QSerialPort的比较一下。 对不起,我应该更准确,它是 miniterm.py。 你能告诉我你下载 miniterm.py 的确切位置吗?它是什么版本?那里似乎有很多副本。 【参考方案1】:

我认为您的平台必须是 Linux,因为在 Windows 上实际上只有一种设置波特率的方法,如果它不起作用,那么它对每个人都不起作用。

存在四舍五入的问题。 QSerialPort 代码只是将基本波特率发生器时钟除以您的波特率。这是一个整数除法,并通过截断来完成。如果硬件不完全支持您选择的任何波特率,则截断可能会将其移向无效的方向 - 可能有一个更大的除数,而不是更小的除数。您应该检查波特率发生器的基频并相应地选择您的波特率。

有many ways 在 Linux 上设置波特率。 QSerialPort 不支持引用答案中三种方法中的两种方法。因此,它不支持某些仅支持三种方法中的两种的驱动程序。我不知道有多少司机可能会遇到这个问题 - 毕竟这可能是一个红鲱鱼。

请分享您的设备在 Linux 上使用的确切驱动程序是什么,以及内核版本是什么。我可以看看这个驱动程序是否会导致当前QSerialPort 代码出现问题。

为避免舍入问题,作为临时解决方法,您可以通过以下 hack 提取基本波特率发生器频率:

// This must be at the very top of the .cpp file
#define private public
#include <QSerialPort>
#include "private/qserialport_p.h"
#include "private/qserialport_unix_p.h"
#undef private

QSerialPort * port;
...
// after the port was opened
int baudBase = port->d_ptr->currentSerialInfo.baud_base;

.pro 文件中,您需要QT += core-private,这适用于Qt 5。对于Qt 4,您需要Qt 有可用的源代码。

当然,真正的修复属于QSerialPort。我对QExtSerialPort一无所知。

【讨论】:

我今天就试一试。如果板子的波特率是 115k,它工作正常,但 200k 似乎不行,所以至少有一个备份选项。 我忘了提一件事,它是一个跨平台的应用程序,这就是为什么我尝试使用 Qt 的 QSerialPort 将其抽象出来的原因。目前在 OS X 上构建它。 在 OS X 上,QSerialPort 代码也只使用了两种设置自定义波特率的方法之一,实际上它跳过了可能被更多驱动程序支持的更简单的方法.它使用iosSIOSPEED ioctl,而不是在termios 结构中使用c_ispeedc_ospeed(可通过cfsetpspeed(...) 访问)。 是的,它使用 Miniterm 并连接超过 250k 可以正常工作。我认为这是一个 FTDI,硬件不是我的经验领域。 @Kuba Ober:你能提供如何用Qt5.5实现它,因为qserialport_unix_p.h在Mac下不可用。

以上是关于Qt:支持波特率 250k 的串行库的主要内容,如果未能解决你的问题,请参考以下文章

波特率串行 windows 端口

POSIX 串行编程,非标准波特率

RS-485 串行端口波特率性能效率

简述单片机串行口的工作方式

STC89C52RC单片机额外篇 | 02 - 认识串行通信波特率以及数据包

STM32串口USART1的使用方法