1. 程式人生 > 實用技巧 >Qt之先用了再說系列-串列埠通訊(單串列埠單執行緒)

Qt之先用了再說系列-串列埠通訊(單串列埠單執行緒)

QT 串列埠通訊(單串列埠單執行緒)

串列埠通訊在我們寫程式的時候或多或少會用到,藉此在這記錄一下QT是如何使用串列埠來通訊的。本次先侃侃在單執行緒下使用1個串列埠來通訊過程。好了,廢話不多說,直接看步驟,我們的宗旨是先用了在說,記住步驟即可。

一共分為6步驟;

第1步(必須):在.pro 檔案下加入這句,不加入這句,會找不到標頭檔案哦(加入以後記得清理一下專案,然後再重新qmake一下專案)

QT       += serialport

第2步(必須):在標頭檔案.h中加入這個

#include <QSerialPort>
#include <QSerialPortInfo>

第3步(非必須):查詢一下可用的串列埠號,這步驟非必須的,有時候你想實現動態檢查熱插拔時可用得上,後面我再整理

QStringList allPort;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){

    allPort << info.portName(); //所有可用的串列埠號都在allPort裡面啦

}

第4步(必須):開啟串列埠,比如這裡開啟一個COM1,如果沒有開啟成功,那可能COM1被使用了,要不就是COM1不存在啦

QSerialPort *m_serial = new QSerialPort;
m_serial->setPortName("COM1");//串列埠名字
m_serial->setBaudRate(QSerialPort::Baud38400);            //波特率
m_serial->setDataBits(QSerialPort::Data8);               //8個數據位
m_serial->setStopBits(QSerialPort::OneStop);            //1個停止位
m_serial->setParity(QSerialPort::NoParity);            //無校驗
m_serial->setFlowControl(QSerialPort::NoFlowControl);  //不適用流控制
if(m_serial->open(QIODevice::ReadWrite)){
    qDebug()<<"串列埠開啟成功";
}

第5步(必須):收發資料,假設COM1已經被我們成功打開了,接下來我們就開始讀寫啦。

  1>首先是寫操作,寫操作比較簡單,只管傳送就行了。

QString str = "Hi';
m_serial->write(str.toUtf8().data());
m_serial->waitForBytesWritten(10);  //記得要加入這一句哦,等待資料寫入串列埠

  2>然後是讀操作。讀操作麻煩些,但也很簡單。

    串列埠類裡面有個訊號是檢測到串列埠有資料就會發出來,所以我們就採用訊號槽方式來做,當然也你也可以不用直接用while迴圈一 直檢測read()函式直到有資料為止。但是沒有訊號槽這麼方便;

   

connect(m_serial,&QSerialPort::readyRead,this,&ThreadSerialPort::onReadyData);

  *****onReadyData槽函式定義:

void ThreadSerialPort::onReadyData()
{
    QByteArray temp = m_serial->readAll();
    QString data = temp.toHex();
    qDebug() << "接受到資料:" << data;

}

  

*****這裡解釋一下第5步接受資料的過程:1.首先進行訊號槽連線,2只要串列埠檢測到有資料就會發出readyRead訊號,然後我們就開始呼叫readAll函式讀取串列埠的資料。這樣我們就接受到目標機通過串列埠給我們發來的資料啦

第6步(必須):關閉串列埠,清理物件資源

m_serial->close();
delete m_serial;

  

總結:好啦,這就是在QT環境下的一個串列埠通訊過程啦,總的來說還是比較簡單的,一共6個步驟,後期再講解複雜一點串列埠通訊。