Qt下實現多執行緒的串列埠通訊
阿新 • • 發佈:2018-12-10
簡述
Qt下無論是RS232、RS422、RS485的串列埠通訊都可以使用統一的編碼實現。本文把每路串列埠的通訊各放在一個執行緒中,使用movetoThread的方式實現。
程式碼之路
用SerialPort類實現串列埠功能,Widget類呼叫串列埠。
serialport.h如下
#include <QObject> #include <QSerialPort> #include <QString> #include <QByteArray> #include <QObject> #include <QDebug> #include <QObject> #include <QThread> class SerialPort : public QObject { Q_OBJECT public: explicit SerialPort(QObject *parent = NULL); ~SerialPort(); void init_port(); //初始化串列埠 QSerialPort *port; public slots: void handle_data(); //處理接收到的資料 void write_data(); //傳送資料 signals: //接收資料 void receive_data(QByteArray tmp); private: QThread *my_thread; };
serailport.cpp如下
#include "serialport.h" SerialPort::SerialPort(QObject *parent) : QObject(parent) { my_thread = new QThread(); port = new QSerialPort(); init_port(); this->moveToThread(my_thread); port->moveToThread(my_thread); my_thread->start(); //啟動執行緒 } SerialPort::~SerialPort() { port->close(); port->deleteLater(); my_thread->quit(); my_thread->wait(); my_thread->deleteLater(); } void SerialPort::init_port() { port->setPortName("/dev/ttyS1"); //串列埠名 windows下寫作COM1 port->setBaudRate(38400); //波特率 port->setDataBits(QSerialPort::Data8); //資料位 port->setStopBits(QSerialPort::OneStop); //停止位 port->setParity(QSerialPort::NoParity); //奇偶校驗 port->setFlowControl(QSerialPort::NoFlowControl); //流控制 if (port->open(QIODevice::ReadWrite)) { qDebug() << "Port have been opened"; } else { qDebug() << "open it failed"; } connect(port, SIGNAL(readyRead()), this, SLOT(handle_data()), Qt::QueuedConnection); //Qt::DirectConnection } void SerialPort::handle_data() { QByteArray data = port->readAll(); qDebug() << QStringLiteral("data received(收到的資料):") << data; qDebug() << "handing thread is:" << QThread::currentThreadId(); emit receive_data(data); } void SerialPort::write_data() { qDebug() << "write_id is:" << QThread::currentThreadId(); port->write("data", 4); //傳送“data”字元 }
widget.h的呼叫程式碼
#include "serialport.h"
public slots:
void on_receive(QByteArray tmpdata);
private:
SerialPort *local_serial;
widget.cpp呼叫程式碼
//建構函式中 local_serial = new QSerialPort(); connect(ui->pushButton, SIGNAL(clicked()), local_serial, SLOT(write_data())); connect(local_serial, SIGNAL(receive_data(QByteArray)), this, SLOT(on_receive(QByteArray)), Qt::QueuedConnection); //on_receive槽函式 void Widget::on_receive(QByteArray tmpdata) { ui->textEdit->append(tmpdata); }
寫在最後
本文例子實現的串列埠號是 /dev/ttyS1(對應windows系統是COM1口),波特率38400,資料位8,停止位1,無校驗位的串列埠通訊。