概述
最近进行QT串口开发时,115200波特率太慢满足不了需求,所以寻求高波特率实现方式。开发环境为Windows QT5.8(MinGW5.3)。QT5自带QtSerialPort类中,最高定义波特率为115200。尝试使用外部库qextserialport,但是缺乏维护,使用并不友好。
实现
在QT自带QtSerialPort中,在QtSerialPort.文件中有如下定义
enum BaudRate {
Baud1200 = 1200,
Baud2400 = 2400,
Baud4800 = 4800,
Baud9600 = 9600,
Baud19200 = 19200,
Baud38400 = 38400,
Baud57600 = 57600,
Baud115200 = 115200,
UnknownBaud = -1
};
并无所需要的波特率,但是经测试,在底层库中已经包含多种波特率定义,既要实现相应波特率在上述枚举中添加相应波特率定义即可。如下
enum BaudRate {
Baud1200 = 1200,
Baud2400 = 2400,
Baud4800 = 4800,
Baud9600 = 9600,
Baud19200 = 19200,
Baud38400 = 38400,
Baud57600 = 57600,
Baud115200 = 115200,
Baud256000 = 256000,
Baud1382400 = 1382400,
UnknownBaud = -1 //支持自定义
};
添加完成后即可调用相应波特率。实现高波率通信,实验程序如下。
QSerialPortInfo com;
QSerialPort *serial;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
com = info;
}
if(!com.isNull())
{
qDebug() << com.portName();
qDebug()<< com.description();
serial = new QSerialPort;
serial->setPortName("COM4");
if(serial->open(QIODevice::ReadWrite))
{
serial->setBaudRate(QSerialPort::Baud1382400);
serial->setDataBits(QSerialPort::Data8);
serial->setParity(QSerialPort::NoParity);
serial->setStopBits(QSerialPort::OneStop);
serial->setFlowControl(QSerialPort::NoFlowControl);
sendata.resize(3); sendata[0]=0xfe; sendata[1]=0x03; sendata[2]=0x0c;
serial->write(sendata);
while(serial->waitForBytesWritten());
qDebug()<<"sucess" ;
serial->close();
}
}
通过foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
扫描当前可用串口,在打开串口后设置相应参数。如上述代码中Baud1382400
已经足够高,经过测试常用高波特率均测试通过正常通信,但是同下位机通信不宜设置过高,以防干扰,数据不准确,上文Baud1382400仅作为测试使用。