【2020-05-04】QT5使用串口简单笔记

📅 2026/7/21 23:34:21
【2020-05-04】QT5使用串口简单笔记
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2020-05-04 标题QT5使用串口简单笔记分类编程 / C C / QT 标签qtQT5使用串口简单笔记项目引用信息查询串口读写:QT官方实例最近重新拾起来了QT编程这里简单的笔记下如何使用QT的串口功能。QT除了可以跨平台之外它的文档和DEMO也写的非常优秀。串口的文档网址【 https://doc.qt.io/qt-5/qtserialport-index.html 】从文档中可以看到QT对于串口有2个操作类一个是信息查询类一个是串口读写类。这里分别简单笔记下项目引用参考文档可以看到使用串口需要增加module如下图信息查询API【 https://doc.qt.io/qt-5/qserialportinfo.html】代码非常简单#includeQSerialPortInfovoidrefresh_serial(){QListQSerialPortInfoport_listQSerialPortInfo::availablePorts();for(intindex0;indexport_list.size();index){qDebug(Find Port:%s %s %s %s %s %s,qPrintable(port_list.description()),qPrintable(port_list.manufacturer()),qPrintable(port_list.portName()),qPrintable(port_list.serialNumber()),qPrintable(port_list.systemLocation()));}}输出信息类似如下Find Port:Silicon Labs CP210x USB to UART Bridge Silicon Labs COM4 0001 \\.\COM4 H?????这里需要注意的是我们使用【portName】 来进行串口读写操作。串口读写:API【 https://doc.qt.io/qt-5/qserialport.html 】QT串口读写API非常简单支持同步/异步读写支持配置各种串口选项。这里只笔记一个最简单的DEMO/* demo_serial_port.h */#ifndefDEMO_SERIAL_PORT_H#defineDEMO_SERIAL_PORT_H#includeQSerialPortclassDemo_Serial_Port:publicQObject{Q_OBJECTpublic:Demo_Serial_Port();voidinit_uart(QStringport_name,intbaudrate);voidrelease_uart();/* block_time0: 不阻塞 block_time0: 阻塞时间block_time毫秒 */boolwrite_data(constQStringdata,unsignedintblock_time);/* read_timeout0: 不阻塞 read_timeout0: 阻塞时间read_timeout毫秒 */QStringread_data(unsignedintread_timeout);signals:voidon_write_finished(Demo_Serial_Port*port);voidon_read_ready(Demo_Serial_Port*port);privateslots:voidhandleReadyRead();voidhandleBytesWritten(qint64 bytes);voidhandleError(QSerialPort::SerialPortError error);private:QSerialPort serial_port;QByteArray written_data;qint64 written_bytes;boolinited;};#endif// DEMO_SERIAL_PORT_H///* demo_serial_port.cpp */#includeDemo_Serial_Port.hDemo_Serial_Port::Demo_Serial_Port(){initedfalse;}voidDemo_Serial_Port::init_uart(QStringport_name,intbaudrate){if(inited!false)return;qDebug(Init Uart %s:%d,qPrintable(port_name),baudrate);serial_port.setPortName(port_name);serial_port.setBaudRate(baudrate);serial_port.setDataBits(QSerialPort::Data8);serial_port.setStopBits(QSerialPort::OneStop);serial_port.setParity(QSerialPort::NoParity);serial_port.setFlowControl(QSerialPort::NoFlowControl);connect(serial_port,QSerialPort::readyRead,this,Demo_Serial_Port::handleReadyRead);connect(serial_port,QSerialPort::errorOccurred,this,Demo_Serial_Port::handleError);connect(serial_port,QSerialPort::bytesWritten,this,Demo_Serial_Port::handleBytesWritten);serial_port.open(QIODevice::ReadWrite);written_bytes0;initedtrue;}voidDemo_Serial_Port::release_uart(){if(inited!true)return;qDebug(Release Uart %s,qPrintable(serial_port.portName()));serial_port.close();written_bytes0;}boolDemo_Serial_Port::write_data(constQStringdata,unsignedintblock_time){if(inited!true)returnfalse;if(written_bytes!0){qCritical(%s last written not finish %d,qPrintable(serial_port.portName()),written_bytes);returnfalse;}written_bytes0;written_datadata.toLocal8Bit();written_data.append( );qint64 bytesWrittenserial_port.write(written_data);if((bytesWritten-1)||(bytesWritten!written_data.size())){qCritical(%s write Err:%d data:%s,qPrintable(serial_port.portName()),bytesWritten,qPrintable(data));returnfalse;}if(block_time0){if(serial_port.waitForBytesWritten(block_time)!true){qCritical(%s write Timeout:%d data:%s,qPrintable(serial_port.portName()),bytesWritten,qPrintable(data));returnfalse;}else{written_bytes0;qDebug(%s write data:%s Finish,qPrintable(serial_port.portName()),written_data.data());returntrue;}}else{returntrue;}}QStringDemo_Serial_Port::read_data(unsignedintread_timeout){if(inited!true)returnQString();QByteArray readDataserial_port.readAll();if(read_timeout!0){if(serial_port.waitForReadyRead(read_timeout)true){readData.append(serial_port.readAll());}else{qCritical(%s read Timeout:%d,qPrintable(serial_port.portName()),read_timeout);}}qDebug(%s read data:%s Success,qPrintable(serial_port.portName()),readData.data());returnQString(readData);}voidDemo_Serial_Port::handleReadyRead(){emiton_read_ready(this);}voidDemo_Serial_Port::handleBytesWritten(qint64 bytes){written_bytesbytes;if(written_byteswritten_data.size()){// qDebug(%s write data:%s Finish, qPrintable(serial_port.portName()),written_data.data());written_bytes0;emiton_write_finished(this);}}voidDemo_Serial_Port::handleError(QSerialPort::SerialPortError error){qCritical(%s err%d:%s,qPrintable(serial_port.portName()),error,qPrintable(serial_port.errorString()));}QT官方实例参考【 https://doc.qt.io/qt-5/qtserialport-examples.html 】里面有大量实例进入入口如下