Qt 串口操作
引用串口
-
在
.pro
文件中添加QT += serialport
语句。 -
添加头文件
#include <QSerialPort>
#include <QSerialPortInfo>
创建串口对象
QSerialPort serial;
初始化串口
//设置串口名
serial.setPortName("COM7");
//设置波特率
serial.setBaudRate(QSerialPort::Baud1152000);
//设置数据位数
serial.setDataBits(QSerialPort::Data8);
//设置奇偶校验
serial.setParity(QSerialPort::NoParity);
//设置停止位
serial.setStopBits(QSerialPort::OneStop);
//设置流控制
serial.setFlowControl(QSerialPort::NoFlowControl);
//打开串口
serial.open(QIODevice::ReadWrite);
//清空缓存
serial.flush();
读写串口
//读串口
QByteArray buffer;
buffer = serial.readAll();
//写串口
serial.write(buffer);
关闭串口
serial.close();
读取随机数据
由串口设备主动发出数据,通讯时间是不明确时,可以使用信号槽绑定串口读就绪信号,当有数据就绪时自动调用槽函数读取和处理。
- 创建串口对象后,为串口的读就绪信号添加一个槽函数。
//连接信号和槽
QObject::connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPortReadyRead);
- 编写槽函数用于读取数据
void MainWindow::serialPortReadyRead()
{
//读取数据
QByteArray buffer = serial.readAll();
//处理数据
//……
}
读取响应数据
这类通讯逻辑通常是主机发送指令给设备,设备接收指令并完成动作后返回数据。这种情况可以通过等待超时的方式进行数据接收,等待指令回复的时间根据具体情况设定,当第一次读取到数据后可再等待短暂的时间来确定消息是否被接收完毕。
QByteArray MainWindow::serialPortRead(int ms)
{
QByteArray buffer;
if(serial.waitForReadyRead(ms))
{
for (;;)
{
buffer += serial.readAll();
if(!serial.waitForReadyRead(20))
{
return buffer;
}
}
}
return NULL;
}
获取可用串口
通过尝试以读写方式打开列表中的串口,如果能打开成功说明这个串口可用。
QStringList MainWindow::GetEnableCommPort()
{
QStringList CommPortList;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if (serial.open(QIODevice::ReadWrite))
{
CommPortList.append(serial.portName());
serial.close();
}
}
return CommPortList;
}