Qt串口通信詳解

一、Qt串口通信代碼

Qt提供了QSerialPort類來實現串口通信。下面是實現串口的基本代碼:

QSerialPort serial;
serial.setPortName("COM1");
serial.setBaudRate(QSerialPort::Baud115200);
serial.setDataBits(QSerialPort::Data8);
serial.setParity(QSerialPort::NoParity);
serial.setStopBits(QSerialPort::OneStop);
serial.setFlowControl(QSerialPort::NoFlowControl);
serial.open(QIODevice::ReadWrite);

setPortName()設置串口名,setBaudRate()設置波特率,setDataBits()設置數據位,setParity()設置校驗位,setStopBits()設置停止位,setFlowControl()設置流控制,open()打開串口。

二、Qt串口通信轉換為二進制

在進行串口通信時,需要將數據轉換為二進制。下面是將字符串轉換為二進制的代碼:

QString str = "Hello, world!";
QByteArray data = str.toLocal8Bit();

函數toLocal8Bit()將字符串轉換為本地8位編碼格式,然後使用QByteArray類將數據存儲為二進制數據。

三、Qt串口通信多線程

串口通信過程中,需要實現多線程來避免UI界面卡頓問題。下面是多線程的示例:

class SerialThread : public QThread {
    Q_OBJECT
public:
    SerialThread(QSerialPort *port) : m_port(port) {}
protected:
    void run() {
        while(1) {
            if(m_port->waitForReadyRead()) {
                QByteArray data = m_port->readAll();
                emit newData(data);
            }
        }
    }
signals:
    void newData(QByteArray);
private:
    QSerialPort *m_port;
};

SerialThreadrun()函數中,使用waitForReadyRead()等待串口返回數據,在接收後使用emit newData()發送數據信號,UI界面可以通過連接這個信號獲得串口數據。

四、Qt串口通信源代碼

Qt提供了官方示例代碼,可以快速入門串口通信。下面是源代碼下載鏈接:

https://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz

下載並解壓後,打開Qt Serial Port Example工程即可查看源代碼。

五、Qt串口通信 秒脈衝

串口通信中,需要精確控制發送數據時間。下面是實現秒脈衝的代碼:

QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, [&]() {
    QByteArray data;
    //拼接二進制數據
    serial.write(data);
});
timer->start(1000); //1秒一次

使用定時器QTimer來實現1秒鐘發送一次數據。

六、Qt串口通信原理

串口通信過程中,先發送數據到串口緩衝區,串口將緩衝區數據發送出去並等待接收數據。當接收到數據後,串口通過readyRead()信號通知主程序有數據返回,主程序可以讀取緩衝區數據並處理。串口通信遵循RS232標準,可以實現短路保護、緩衝區、校驗等功能。

七、Qt實現串口通信

Qt實現串口通信需要使用QSerialPort類,封裝串口通信過程,使其可以在Qt UI界面進行調用。下面是實現串口通信的示例代碼:

class SerialPort : public QObject
{
    Q_OBJECT
public:
    SerialPort(QObject *parent = nullptr): QObject(parent)
    {
        m_serialPort = new QSerialPort;

        //配置串口參數
        m_serialPort->setPortName("COM1");
        m_serialPort->setBaudRate(QSerialPort::Baud115200);
        m_serialPort->setDataBits(QSerialPort::Data8);
        m_serialPort->setParity(QSerialPort::NoParity);
        m_serialPort->setStopBits(QSerialPort::OneStop);
        m_serialPort->setFlowControl(QSerialPort::NoFlowControl);

        //打開串口
        if(m_serialPort->open(QIODevice::ReadWrite)) {
            //連接信號和槽
            connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPort::readData);
        } else {
            qDebug() <readAll();
        emit newData(data);
    }

signals:
    void newData(QByteArray data);

private:
    QSerialPort *m_serialPort;
};

在上述代碼中,使用QSerialPort類實現串口通信,readData()函數中使用readAll()讀取串口緩衝區中的所有數據,然後通過newData()信號發送數據。

八、Qt串口助手

Qt提供了串口助手的例子工程,在Qt Creator中可以快速打開。串口助手提供了UI界面進行串口通信調試,包括發送和接收數據。下面是串口助手的截圖:

九、Qt多線程通信

Qt提供了多線程通信的支持,可以在不同的線程中傳遞數據。下面是在不同線程中傳遞數據的示例:

class MyThread: public QThread
{
    Q_OBJECT
public:
    MyThread(QObject *parent = nullptr) : QThread(parent) {}

protected:
    void run() {
        QByteArray data;
        //數據處理
        emit send(data); //發送數據到主線程
    }

signals:
    void send(QByteArray data);
};

MyThread中,處理數據後發送信號到主線程,主線程可以接收這個信號來獲取線程中發送的數據。

原創文章,作者:CTJJ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/134804.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CTJJ的頭像CTJJ
上一篇 2024-10-04 00:08
下一篇 2024-10-04 00:08

相關推薦

  • Qt雷達探測教程

    本文主要介紹如何使用Qt開發雷達探測程序,並展示一個簡單的雷達探測示例。 一、環境準備 在開始本教程之前,需要確保你的開發環境已經安裝Qt和Qt Creator。如果沒有安裝,可以…

    編程 2025-04-29
  • Qt State Machine與狀態機模式

    本文將介紹Qt State Machine和狀態機模式在Qt中的實現。Qt提供了QStateMachine和QState兩個類,可以方便地實現狀態機模式,並且能有效地處理複雜的、多…

    編程 2025-04-27
  • 跨域通信浮標——實現客戶端之間的跨域通信

    本文將介紹跨域通信浮標的使用方法,該浮標可以實現客戶端之間的跨域通信,解決了瀏覽器同源策略的限制,讓開發者能夠更加方便地進行跨域通信。 一、浮標的原理 跨域通信浮標的原理是基於浮動…

    編程 2025-04-27
  • 通信專業Python和Java的開發技巧

    本文旨在介紹通信專業Python和Java的開發技巧,為讀者提供實用且可操作的思路和方法。 一、Python在通信領域中的應用 Python是一種優秀的程序設計語言,因其易學易用、…

    編程 2025-04-27
  • Python中的Qt庫

    Qt庫是一個跨平台的C++圖形用戶界面(GUI)工具包。它提供了豐富的界面控件和處理系統事件的功能,可以輕鬆創建交互界面、圖形化應用和多媒體應用。而Python中的Qt庫則是Qt的…

    編程 2025-04-27
  • Python調用串口用法介紹

    本文將從以下幾個方面詳細闡述如何使用Python調用串口進行數據傳輸。 一、Python調用串口的基本知識 在使用Python調用串口之前,需要了解串口的相關知識。 串口是計算機與…

    編程 2025-04-27
  • xmake qt:構建Qt應用的全流程解決方案

    本文將會詳細闡述xmake qt的使用方法以及其能夠解決的問題。針對Qt應用開發中的各種困境,xmake提供了一整套的解決方案,包括自動構建、依賴管理、部署打包等,極大地提高了開發…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25

發表回復

登錄後才能評論