Qt串口通信全攻略:从配置到实战

串口通信基础

串口(Serial Port)是一种硬件接口,用于设备间的异步串行通信。在工业控制、嵌入式设备中广泛应用。Qt提供了QSerialPort类,支持跨平台串口操作,需包含头文件<QSerialPort><QSerialPortInfo>

环境配置

  1. Qt项目配置
    pro文件中添加串口模块依赖:
    QT += serialport
    
  2. 检查可用串口
    通过QSerialPortInfo获取系统串口列表:
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        qDebug() << "Port:" << info.portName();
        qDebug() << "Description:" << info.description();
    }
    

串口参数设置

关键参数包括波特率、数据位、停止位、校验位。示例配置:

QSerialPort serial;
serial.setPortName("COM1"); // Windows示例,Linux通常为"/dev/ttyS0"
serial.setBaudRate(QSerialPort::Baud9600);
serial.setDataBits(QSerialPort::Data8);
serial.setParity(QSerialPort::NoParity);
serial.setStopBits(QSerialPort::OneStop);
serial.setFlowControl(QSerialPort::NoFlowControl);
if (!serial.open(QIODevice::ReadWrite)) {
    qDebug() << "Failed to open port:" << serial.errorString();
}

数据读写操作

  1. 写入数据
    使用write()发送数据,需确保端口已打开:
    QByteArray sendData = "Hello Serial";
    qint64 bytesWritten = serial.write(sendData);
    if (bytesWritten == -1) {
        qDebug() << "Write error:" << serial.errorString();
    }
    
  2. 读取数据
    通过readyRead信号触发读取:
    QObject::connect(&serial, &QSerialPort::readyRead, [&]() {
        QByteArray data = serial.readAll();
        qDebug() << "Received:" << data;
    });
    

错误处理与调试

  • 错误信号:监听errorOccurred信号捕获异常:
    QObject::connect(&serial, &QSerialPort::errorOccurred, [&](QSerialPort::SerialPortError error) {
        if (error != QSerialPort::NoError) {
            qDebug() << "Error:" << serial.errorString();
        }
    });
    
  • 超时设置:通过setRequestToSendsetDataTerminalReady控制硬件流超时。

示例:完整收发流程

QSerialPort serial;
// 配置参数(略)
if (serial.open(QIODevice::ReadWrite)) {
    serial.write("Test Message");
    while (serial.waitForReadyRead(1000)) { // 等待1秒
        QByteArray response = serial.readAll();
        while (serial.waitForReadyRead(10))
            response += serial.readAll();
        qDebug() << "Response:" << response;
    }
} else {
    qDebug() << "Open failed:" << serial.errorString();
}
serial.close();

注意事项

  • 跨平台差异:Windows使用COMx,Linux/macOS使用/dev/ttyX
  • 权限问题:Linux需确保用户有串口设备访问权限(如加入dialout组)。
  • 资源释放:程序退出前调用close()释放端口。

通过以上步骤可实现Qt下的串口通信功能,适用于数据采集、设备调试等场景。

BbS.okapop061.sbs/PoSt/1122_742749.HtM
BbS.okapop062.sbs/PoSt/1122_886669.HtM
BbS.okapop063.sbs/PoSt/1122_418123.HtM
BbS.okapop065.sbs/PoSt/1122_766792.HtM
BbS.okapop066.sbs/PoSt/1122_395914.HtM
BbS.okapop067.sbs/PoSt/1122_871227.HtM
BbS.okapop068.sbs/PoSt/1122_069647.HtM
BbS.okapop069.sbs/PoSt/1122_668213.HtM
BbS.okapop070.sbs/PoSt/1122_890945.HtM
BbS.okapop071.sbs/PoSt/1122_563866.HtM
BbS.okapop061.sbs/PoSt/1122_603399.HtM
BbS.okapop062.sbs/PoSt/1122_068599.HtM
BbS.okapop063.sbs/PoSt/1122_671186.HtM
BbS.okapop065.sbs/PoSt/1122_716947.HtM
BbS.okapop066.sbs/PoSt/1122_521466.HtM
BbS.okapop067.sbs/PoSt/1122_870852.HtM
BbS.okapop068.sbs/PoSt/1122_402396.HtM
BbS.okapop069.sbs/PoSt/1122_798518.HtM
BbS.okapop070.sbs/PoSt/1122_542569.HtM
BbS.okapop071.sbs/PoSt/1122_034176.HtM
BbS.okapop061.sbs/PoSt/1122_403293.HtM
BbS.okapop062.sbs/PoSt/1122_980476.HtM
BbS.okapop063.sbs/PoSt/1122_269775.HtM
BbS.okapop065.sbs/PoSt/1122_796978.HtM
BbS.okapop066.sbs/PoSt/1122_646513.HtM
BbS.okapop067.sbs/PoSt/1122_678575.HtM
BbS.okapop068.sbs/PoSt/1122_602336.HtM
BbS.okapop069.sbs/PoSt/1122_474149.HtM
BbS.okapop070.sbs/PoSt/1122_162979.HtM
BbS.okapop071.sbs/PoSt/1122_356331.HtM
BbS.okapop061.sbs/PoSt/1122_228616.HtM
BbS.okapop062.sbs/PoSt/1122_989407.HtM
BbS.okapop063.sbs/PoSt/1122_306647.HtM
BbS.okapop065.sbs/PoSt/1122_161334.HtM
BbS.okapop066.sbs/PoSt/1122_615461.HtM
BbS.okapop067.sbs/PoSt/1122_834167.HtM
BbS.okapop068.sbs/PoSt/1122_796431.HtM
BbS.okapop069.sbs/PoSt/1122_537119.HtM
BbS.okapop070.sbs/PoSt/1122_505757.HtM
BbS.okapop071.sbs/PoSt/1122_834634.HtM
BbS.okapop061.sbs/PoSt/1122_773549.HtM
BbS.okapop062.sbs/PoSt/1122_790353.HtM
BbS.okapop063.sbs/PoSt/1122_605331.HtM
BbS.okapop065.sbs/PoSt/1122_520128.HtM
BbS.okapop066.sbs/PoSt/1122_779151.HtM
BbS.okapop067.sbs/PoSt/1122_610399.HtM
BbS.okapop068.sbs/PoSt/1122_253806.HtM
BbS.okapop069.sbs/PoSt/1122_814335.HtM
BbS.okapop070.sbs/PoSt/1122_923336.HtM
BbS.okapop071.sbs/PoSt/1122_226244.HtM
BbS.okapop061.sbs/PoSt/1122_138974.HtM
BbS.okapop062.sbs/PoSt/1122_494438.HtM
BbS.okapop063.sbs/PoSt/1122_217266.HtM
BbS.okapop065.sbs/PoSt/1122_134688.HtM
BbS.okapop066.sbs/PoSt/1122_847863.HtM
BbS.okapop067.sbs/PoSt/1122_731680.HtM
BbS.okapop068.sbs/PoSt/1122_825525.HtM
BbS.okapop069.sbs/PoSt/1122_273843.HtM
BbS.okapop070.sbs/PoSt/1122_603991.HtM
BbS.okapop071.sbs/PoSt/1122_707799.HtM
BbS.okapop072.sbs/PoSt/1122_232133.HtM
BbS.okapop073.sbs/PoSt/1122_384216.HtM
BbS.okapop074.sbs/PoSt/1122_212348.HtM
BbS.okapop075.sbs/PoSt/1122_976231.HtM
BbS.okapop076.sbs/PoSt/1122_200934.HtM
BbS.okapop077.sbs/PoSt/1122_286295.HtM
BbS.okapop078.sbs/PoSt/1122_585910.HtM
BbS.okapop079.sbs/PoSt/1122_307904.HtM
BbS.okapop080.sbs/PoSt/1122_064128.HtM
BbS.okapop081.sbs/PoSt/1122_011412.HtM
BbS.okapop072.sbs/PoSt/1122_549325.HtM
BbS.okapop073.sbs/PoSt/1122_642692.HtM
BbS.okapop074.sbs/PoSt/1122_739108.HtM
BbS.okapop075.sbs/PoSt/1122_978280.HtM
BbS.okapop076.sbs/PoSt/1122_308298.HtM
BbS.okapop077.sbs/PoSt/1122_686611.HtM
BbS.okapop078.sbs/PoSt/1122_723097.HtM
BbS.okapop079.sbs/PoSt/1122_559459.HtM
BbS.okapop080.sbs/PoSt/1122_981033.HtM
BbS.okapop081.sbs/PoSt/1122_246152.HtM

#牛客AI配图神器#

全部评论

相关推荐

10-01 09:50
门头沟学院 Java
肖先生~:这个人真的很好,点赞
点赞 评论 收藏
分享
头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器-&gt;这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题-&gt;后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务