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

[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2020-05-04| 标题:QT5使用串口简单笔记分类:编程 / C && C++ / QT |标签:qt


QT5使用串口简单笔记

    • 项目引用:
    • 信息查询:
    • 串口读写:
    • 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】,代码非常简单:

#include<QSerialPortInfo>voidrefresh_serial(){QList<QSerialPortInfo>port_list=QSerialPortInfo::availablePorts();for(intindex=0;index<port_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#include<QSerialPort>classDemo_Serial_Port:publicQObject{Q_OBJECTpublic:Demo_Serial_Port();voidinit_uart(QString&port_name,intbaudrate);voidrelease_uart();/* block_time==0: 不阻塞 block_time>0: 阻塞时间:block_time毫秒 */boolwrite_data(constQString&data,unsignedintblock_time);/* read_timeout==0: 不阻塞 read_timeout>0: 阻塞时间: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 */#include"Demo_Serial_Port.h"Demo_Serial_Port::Demo_Serial_Port(){inited=false;}voidDemo_Serial_Port::init_uart(QString&port_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_bytes=0;inited=true;}voidDemo_Serial_Port::release_uart(){if(inited!=true)return;qDebug("Release Uart <%s>",qPrintable(serial_port.portName()));serial_port.close();written_bytes=0;}boolDemo_Serial_Port::write_data(constQString&data,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_bytes=0;written_data=data.toLocal8Bit();written_data.append(' ');qint64 bytesWritten=serial_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_time>0){if(serial_port.waitForBytesWritten(block_time)!=true){qCritical("<%s> write Timeout:%d data:%s",qPrintable(serial_port.portName()),bytesWritten,qPrintable(data));returnfalse;}else{written_bytes=0;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 readData=serial_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_bytes+=bytes;if(written_bytes==written_data.size()){// qDebug("<%s> write data:%s Finish", qPrintable(serial_port.portName()),written_data.data());written_bytes=0;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 】,里面有大量实例,进入入口如下: