一、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;
};
在SerialThread的run()函數中,使用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
微信掃一掃
支付寶掃一掃