Qt下的串口——QSerialPort
每个平台的串口操作接口都不相同,Qt帮我们解决了这些平台问题,并将内部实现包装起来只将接口暴露给开发者,让我们一起来认识一下QSerialPort。
获取现有可行的串口
[static] QList<QSerialPortInfo> QSerialPortInfo::availablePorts()
availablePorts
方法返回包含所有串口的相关信息,我们通过遍历这个列表即可获得所有串口的名称等信息,然后再依次用open
函数尝试依次打开并筛选出可行串口
QStringList Serial::findPort()
{
QStringList portBuff;
foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
portBuff.append(serial.portName());
serial.close();
}
}
return portBuff;
}
配置并打开端口
配置串口
- 创建QSerialPort对象
QSerialPort *serial = new QSerialPort;
- 设置设备名
// windows下为"COMx",linux为"ttyUSBx",x为数字
serial->setPortName("COM1");
- 设置波特率
// 选择所需波特率对应枚举量即可,此处波特率为115200
serial->setBaudRate(QSerialPort::Baud115200);
- 设置数据位
// 通常设置八位数据位
serial->setDataBits(QSerialPort::Data8);
- 设置奇偶校验
// 通常设置无奇偶校验
serial->setParity(QSerialPort::NoParity);
- 设置停止位
// 通常设置一位停止位
serial->setStopBits(QSerialPort::OneStop);
- 设置流控制模式
// 通常设置无流控制模式
serial->setFlowControl(QSerialPort::NoFlowControl);
- 打开串口
if(!serial->open(QIODevice::ReadWrite))
return false;
- 串口数据接收
connect(serial, &QSerialPort::readyRead, this, [=]()
{
QByteArray data = serial->readAll();
// 可以像这种处理,声明一个叫作haveReceive的带参信号,在串口类的外部处理数据
// 也可以直接在这个回调函数中处理数据
emit haveReceive(data);
});
- 串口数据发送
// 发送bytes
qint64 Serial::sendData(QByteArray data)
{
bool isOk = 0;
if(serial->write(data) > 0)
isOk = 1;
return isOk;
}
// 发送string
qint64 Serial::sendData(QString data)
{
bool isOk = 0;
if(serial->write(data.toLatin1()) > 0)
isOk = 1;
return isOk;
}