如何使用Linux伪终端测试Qt QSerialPort应用?
嘿,我帮你把这段伪终端测试Qt串口应用的代码补全并梳理清楚,这样你就能顺利完成测试啦:
完整的伪终端测试实现代码
#include <QSerialPort> #include <unistd.h> #include <cstdio> int main() { // 打开主伪终端设备 QSerialPort master("/dev/ptmx"); if (!master.open(QSerialPort::ReadWrite)) { fprintf(stderr, "Failed to open master ptmx device\n"); return 1; } int master_fd = master.handle(); // 获取从伪终端的设备名称 constexpr size_t PTSNAME_BUFFER_LENGTH = 128; char ptsname_buffer[PTSNAME_BUFFER_LENGTH]; if (ptsname_r(master_fd, ptsname_buffer, PTSNAME_BUFFER_LENGTH) != 0) { fprintf(stderr, "Failed to get slave pts name\n"); master.close(); return 1; } printf("Slave pseudo terminal path: %s\n", ptsname_buffer); // 授予从设备访问权限并解锁(这两步是必须的,否则从设备无法被正常访问) if (grantpt(master_fd) != 0) { fprintf(stderr, "Failed to grant pt access\n"); master.close(); return 1; } if (unlockpt(master_fd) != 0) { fprintf(stderr, "Failed to unlock pt\n"); master.close(); return 1; } // 现在把输出的从设备路径(比如/dev/pts/12)填到你的Qt串口应用里打开串口 // 主设备端就能和串口应用双向收发数据了 // 举个例子:给串口应用发一条测试消息 master.write("Hello from pseudo terminal master!\n"); master.flush(); // 读取串口应用返回的消息 QByteArray response = master.readAll(); if (!response.isEmpty()) { printf("Received from serial app: %s", response.constData()); } // 用完别忘了关闭设备 master.close(); return 0; }
关键步骤说明
- 打开
/dev/ptmx:这是Linux系统中伪终端的主设备节点,所有伪终端的通信都是从这里发起的 ptsname_r:这是线程安全的获取从设备路径的方法,比非线程安全的ptsname更可靠grantpt+unlockpt:这两步必须执行,grantpt会设置从设备的权限,让普通用户也能访问;unlockpt则解锁从设备,允许它被打开
注意事项
- 编译时要记得链接Qt的SerialPort模块,在qmake项目文件里加上
QT += serialport - 如果运行时遇到权限问题,可以尝试用
sudo启动程序(不过正常情况下grantpt会处理好权限) - 测试流程:先运行这个伪终端主程序,复制输出的从设备路径,再启动你的Qt串口应用并选择这个路径打开串口,之后两边就能互相收发数据了
内容的提问来源于stack exchange,提问作者Dino
相关产品推荐
相关产品推荐

