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個步驟,後期再講解複雜一點串列埠通訊。