最近利用Qt写上位机时遇到了一个设置波特率的问题,按照Qt官方文档的说法,参数只要是qint32
类型的正整数都可以,
但是实际使用发现超过大约3M的波特率就会修改波特率失败,如果是打开串口前修改也会因为波特率修改失败无法打开串口。找到的Qt返回的错误码是8:UnkownError
这让我摸不着头脑,于是一路顺着Qt源码找下去。
找到了qtserialport/src/serialport/qserialport.cpp文件中的设置波特率函数
bool QSerialPort::setBaudRate(qint32 baudRate, Directions directions)
{
Q_D(QSerialPort);
if (!isOpen() || d->setBaudRate(baudRate, directions)) {
if (directions & QSerialPort::Input) {
if (d->inputBaudRate != baudRate)
d->inputBaudRate = baudRate;
else
directions &= ~QSerialPort::Input;
}
if (directions & QSerialPort::Output) {
if (d->outputBaudRate != baudRate)
d->outputBaudRate = baudRate;
else
directions &= ~QSerialPort::Output;
}
if (directions)
emit baudRateChanged(baudRate, directions);
return true;
}
return false;
}
进一步地
bool QSerialPortPrivate::setBaudRate(qint32 baudRate, QSerialPort::Directions directions)
{
if (directions != QSerialPort::AllDirections) {
setError(QSerialPortErrorInfo(QSerialPort::UnsupportedOperationError, QSerialPort::tr("Custom baud rate direction is unsupported")));
return false;
}
DCB dcb;
if (!getDcb(&dcb))
return false;
qt_set_baudrate(&dcb, baudRate);
return setDcb(&dcb);
}
Qt文档诚不欺我,确实没有对于波特率大小的限制,而当前来看可能出现的Qt层面的问题都有对应的错误码而不是未知错误,问题只有可能来自Win的串口DCB配置过程。
那么问题就明晰了,既然底层还是使用的DCB,那肯定是驱动程序问题了,简单验证一下不出所料——我当前使用的是CH340 USB转ttl芯片,虽然它数据手册标称到2M波特率,但看样子驱动实际写到了3M(或者说限制到了3M),不支持更高,所以设置不了;而更换为支持6M波特率的CH343 USB转ttl芯片,并打上相应驱动后问题便迎刃而解了。
所以结论便是Qt在Windows系统上支持的最高波特率由使用的串口转换设备驱动支持的波特率上限决定。