Qt 对串口的操作封装在了 QSerialPort 中,关于它的具体函数及使用方法参考 这篇文章;
1 读取串口
-
关于设备权限的问题
Qt 打开串口时可能会失败,因为操作驱动设备需要 root 权限,为此,解决方法有两种:
- 1 把对应的串口设备文件的所有权和组改成普通用户的,如:
sudo chown xxx:xxx /dev/ttyF0
- 2 把当前用户的组类别改成
dialout
(串口 tty 设备所在组为 dialout 组),命令:sudo gpasswd -a $USER dialout
- 1 把对应的串口设备文件的所有权和组改成普通用户的,如:
-
在.pro文件中进行声明
QT += serialport
- 头文件
#include <QSerialPort>
#include <QSerialPortInfo>
//#include <QDebug>
- 实例化 QSrerialPort
QSerialPort *serial=new QSerialPort
- 寻找显示目前的所有串口信息
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
qDebug() << "Name : " << info.portName();
qDebug() << "Description : " << info.description();
qDebug() << "Manufacturer: " << info.manufacturer();
qDebug() << "Serial Number: " << info.serialNumber();
qDebug() << "System Location: " << info.systemLocation();
}
- 打开(关闭)串口
serial->setPortName("ttyF1"); // 串口名称
serial->open(QIODevice::ReadOnly); // 打开失败会返回 false
// serial->clear(); //清除缓存区
// serial->close(); //关闭串口
- 配置参数
s->setBaudRate(QSerialPort::Baud4800);
s->setParity(QSerialPort::NoParity);
s->setStopBits(QSerialPort::OneStop);
//s->setFlowControl(QSerialPort::NoFlowControl);
s->setFlowControl(QSerialPort::HardwareControl);
s->setDataBits(QSerialPort::Data8);
- 使用信号与槽读取串口
/***** 在头文件中声明该槽函数
private slots:
void ReadData();
*******/
/***** 连接信号与槽
connect(s,&QSerialPort::readyRead,this,&MainWindow::ReadData);
******/
void MainWindow::ReadData()
{
QByteArray buf;
buf=s->readAll();
if(!buf.isEmpty()) {
QString str = buf;
//std::cout << str.toStdString() << std::endl;
std::cout << str.data() << std::endl;
//qDebug() << str;
}
buf.clear();
}
2 读取串口各管脚信号
串口的接头有两种,下图为“上公下母”:

以图中的“公头”为例,其各个管脚的含义:
管脚 | 简写 | 含义 | 输入/输出 |
---|---|---|---|
1 | DCD | 数据载波检测 | input |
2 | RxD | 接收数据 | input |
3 | TxD | 发送数据 | output |
4 | DTR | 数据终端准备 | output |
5 | GND | 地 | |
6 | DSR | 数据设备准备好 | input |
7 | RTS | 请求发送 | output |
8 | CTS | 清除发送 | input |
9 | RI | 震铃指示 | input |
如果要读取串口某个管脚的信号,可以使用 QSerialPort::PinoutSignals PinoutSignals()
,该函数以位图的格式返回引脚信号状态;具体的返回值请查看 QSerialPort::PinoutSignals 的枚举值;简单的使用例子:
QSerialPort::PinoutSignals m = s->pinoutSignals();
if (m & QSerialPort::ClearToSendSignal)
qDebug() << " CTS ";
if (m & QSerialPort::DataSetReadySignal)
qDebug() << " DSR ";
3 Ubuntu 串口调试助手
- 安装
sudo apt-get install cutecom
- 打开
cutecom