要求实现如下功能:

获取串口号:
    foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) {
        qDebug() << "Port: " << serialPortInfo.portName();  // e.g. "COM1"
        qDebug() << "Description: " << serialPortInfo.description();  // e.g. "USB Serial Port"
        qDebug() << "Manufacturer: " << serialPortInfo.manufacturer();  // e.g. "FTDI"
        // add combox box items
        ui->comboBox->addItem(serialPortInfo.portName());
    }设置串口属性:
void MainWindow::setSerialPort(QString portName, qint32 baudRate, QSerialPort::DataBits dataBits, QSerialPort::Parity parity, QSerialPort::StopBits stopBits, QSerialPort::FlowControl flowControl)
{
    // set serial port parameters
    serial.setPortName(portName);
    serial.setBaudRate(baudRate);
    serial.setDataBits(dataBits);
    serial.setParity(parity);
    serial.setStopBits(stopBits);
    serial.setFlowControl(flowControl);
}
,打开串口:
    //open serial port
    if(serial.open(QIODevice::ReadWrite)){
        qDebug() << "Serial port opened";}
    else{
        // if not opened, show message box
        QMessageBox::critical(this, "Error", serial.errorString());
    }串口助手当中,支持以hex方法发送数据,具体解释如下:
在串口助手工具中,发送模式中的Hex模式指的是以十六进制(Hexadecimal)形式发送数据。这种模式在处理串口通信时非常有用,特别是当需要发送或接收非文本形式的二进制数据时。以下是Hex模式发送数据的几个关键点:
-  数据表示:在Hex模式下,发送的数据以十六进制数的形式展示,例如 0x33、0x4A等。这些十六进制数直接对应着二进制数据中的字节值。
-  数据转换:当用户在串口助手中输入十六进制数时,工具会将这些数转换为对应的二进制数据,并通过串口发送出去。同样,接收到的二进制数据也会在Hex模式下以十六进制数的形式展示出来。 
-  应用场景:Hex模式特别适用于需要精确控制发送或接收数据字节的场景,比如嵌入式系统编程、硬件调试、网络通信协议测试等。在这些场景中,二进制数据的每一位都可能有特定的含义,因此使用Hex模式可以更方便地查看和修改这些数据。 
-  与文本模式的区别:与Hex模式相对应的是文本模式(Text Mode或ASCII Mode)。在文本模式下,发送的数据以ASCII码表中的字符形式展示,如字母、数字、标点符号等。当需要发送或接收文本信息时,文本模式更为直观和方便。然而,在处理非文本形式的二进制数据时,Hex模式则更具优势。 
-  使用注意事项:在使用Hex模式发送数据时,需要注意数据的完整性和正确性。由于十六进制数是以两位为一组表示的(00-FF),因此在输入数据时要确保每个数都是两位的,不足两位时需要在前面补零。此外,还需要注意串口通信的波特率、数据位、停止位等参数设置,以确保数据的正确传输。 
综上所述,串口助手工具中的Hex模式是一种用于以十六进制形式发送和接收二进制数据的模式,它在处理串口通信中的非文本数据时非常有用。
如果对这块感到陌生,可以同时打开二个现成的串口助手,测试一下传送格式与效果。
文本模式的发送接收,存在编码问题,要求支持UTF-8 、GBK 二种格式编码。
值得注意的是qt5、qt6 对编码的方法有变化。
这里我采取兼容qt5方式处理该问题:
1 安装兼容模块

2 pro文件中加一行说明:
greaterThan(QT_MAJOR_VERSION,5): QT += core5compat

3 使用QTextCodec 进行编码:
#include <QTextCodec>
.........
QByteArray MainWindow::encode(QString data, QString encode)
{
    // encode data
    QByteArray byteArray;
    if (encode == "gbk") {
        QTextCodec *codec = QTextCodec::codecForName("gbk");
        byteArray = codec->fromUnicode(data);
    } else if (encode == "utf-8") {
        QTextCodec *codec = QTextCodec::codecForName("utf-8");
        byteArray = codec->fromUnicode(data);
    }
    return byteArray;
}4 向串口写数据的时候,调用该方法:
    //read data from plainTextEdit  and encode data use gbk
    QByteArray byteArray = encode(ui->plainTextEdit->toPlainText(), "gbk");
    // write data to serial port  com2
    serial.write(byteArray);现在中文也能正确编码了:




















