Qt 串口通信(QSerialPort)16進制收發實例代碼(QT實戰5)

Qt 串口通信(QSerialPort)16進制收發實例代碼

     首先在項目文件裏面添加一句  

   QT       += serialport

 

  1. 使用靜態函數生成QSerialPortInfo對象列表。列表中的每個QSerialPortInfo對象表示一個串行端口,可以查詢端口名稱、系統位置、描述和製造商。QSerialPortInfo類還可以用作QSerialPort類的setPort()方法的輸入參數。    
    m_ui->serialPortInfoListBox->clear();

    QString description;

    QString manufacturer;

    QString serialNumber;

    const auto infos = QSerialPortInfo::availablePorts();

    for (const QSerialPortInfo &info : infos) {

        QStringList list;

        description = info.description();

        manufacturer = info.manufacturer();

        serialNumber = info.serialNumber();

        list << info.portName()

             << (!description.isEmpty() ? description : blankString)

             << (!manufacturer.isEmpty() ? manufacturer : blankString)

             << (!serialNumber.isEmpty() ? serialNumber : blankString)

             << info.systemLocation()

             << (info.vendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : blankString)

             << (info.productIdentifier() ? QString::number(info.productIdentifier(), 16) : blankString);



        m_ui->serialPortInfoListBox->addItem(list.first(), list);

    }



    m_ui->serialPortInfoListBox->addItem(tr("Custom"));

 

 2、打開串口

        connect(m_serial, &QSerialPort::errorOccurred, this, &MainWindow::handleError);

         //連接信號槽 當下位機發送數據QSerialPortInfo 會發送個 readyRead 信號,我們定義個//槽void readData ()解析數據

        connect(m_serial, &QSerialPort::readyRead, this, &MainWindow::readData);     

    const SettingsDialog::Settings p = m_settings->settings();
    m_serial->setPortName(p.name);
    m_serial->setBaudRate(p.baudRate);
    m_serial->setDataBits(p.dataBits);
    m_serial->setParity(p.parity);
    m_serial->setStopBits(p.stopBits);
    m_serial->setFlowControl(p.flowControl);
    if (m_serial->open(QIODevice::ReadWrite)) {

        showStatusMessage(tr("Connected to %1 : %2, %3, %4, %5, %6")
                          .arg(p.name).arg(p.stringBaudRate).arg(p.stringDataBits)
                          .arg(p.stringParity).arg(p.stringStopBits).arg(p.stringFlowControl));
    } else {
        QMessageBox::critical(this, tr("Error"), m_serial->errorString());

        showStatusMessage(tr("Open error"));
    }

 

  

  3、發送數據,轉換輸入,並16進制發送

   

  QString info= ui->textEditsend->toPlainText();

    if (info.contains(" "))

    {

        info.replace(QString(" "),QString(""));//把空格去掉   

    }

    qDebug()<<"Write to serial: "<<info;
    //轉換成16進制發送

    QByteArray sendBuf = QByteArray::fromHex(info.toLatin1());

    m_serial->write(sendBuf);

 

4、接收數據並16進制顯示

  

void MainWindow::readData()
{
    const QByteArray info = m_serial->readAll();
    QByteArray hexData = info.toHex();
    QString string;
    string.prepend(hexData);// QByteArray轉QString方法2
    qDebug()<<"receive info:"<<info;
    ui->textEditrec->append(string);
}
5、實際界面顯示

 

 


備註:實戰示例,解疑答惑。

           --不間端地思考,實時地批判你的工作!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章