簡體   English   中英

從另一個線程向QSerialPort發送數據

[英]Sending data to QSerialPort from another thread

我正在嘗試使用QSerialPort類通過串行端口發送一些數據。 每次都從同一父類發送數據效果很好。 但是,當我嘗試使用另一個線程QSerialPort發送數據時,它沒有。 我使用串口監視器監視數據,但什么也沒顯示。 代碼如下所示:

#include <QSerialPort>
#include <QObject>
#include <QDebug>
#include <QCoreApplication>

#include <thread>
#include <mutex>
#include <list>
#include <memory>

class Message {
public:
    bool isSent;
    bool isProcessed;
    int data;

    Message(int d) :
        data(d),
        isSent(false),
        isProcessed(false) {

    }
};

class SerialClass : public QObject {
    Q_OBJECT

public:
    SerialClass(unsigned short portNumber, unsigned int baudrate, QObject *parent = 0) :
        _portNumber(portNumber),
        _baudrate(baudrate),
        _serialPort(new QSerialPort(this)),
        _messages(),
        _writeThread(nullptr),
        QObject(parent) {

        _serialPort->setPortName(QString("COM%1").arg(_portNumber));
        _serialPort->setBaudRate(baudrate);
        _serialPort->setDataBits(QSerialPort::DataBits::Data8);
        _serialPort->setParity(QSerialPort::Parity::NoParity);
        _serialPort->setStopBits(QSerialPort::StopBits::OneStop);
    }


    void start() {

        if (!_serialPort->open(QIODevice::ReadWrite)) {
            qDebug() << "Couldn't open serial port";
            return;
        }

        auto *m = &_messages;
        auto *p = &_enableProcessing;
        auto *port = _serialPort.get();
        auto *mutex = &_mutex;

        _serialPort->write(QString("Hello\r\n").toLocal8Bit());

        _writeThread = std::make_unique<std::thread>([m, p, port, mutex]() {
            qDebug() << "Work thread started";
            while (*p) {
                std::this_thread::sleep_for(std::chrono::milliseconds(15));
                auto inactiveMessage = std::find_if(m->begin(), m->end(), [](Message &item) {
                    return !item.isSent;
                });

                if (inactiveMessage != m->end()) {
                    mutex->lock();
                    qDebug() << "Written" << port->write(QString("data %1\r\n").arg(inactiveMessage->data).toLocal8Bit());
                    inactiveMessage->isSent = true;
                    mutex->unlock();
                }
            }
            qDebug() << "Work thread stopped";
        }); 
    }

    void wait() {
        if (!_writeThread) {
            return;
        }
        _writeThread->join();
    }


    void addMessage(Message& msg) {
        _mutex.lock();
        _messages.push_back(msg);
        _mutex.unlock();
    }

private:
    unsigned short _portNumber;
    unsigned int _baudrate;
    std::unique_ptr<QSerialPort> _serialPort;
    std::unique_ptr<std::thread> _writeThread;
    std::list<Message> _messages;
    bool _enableProcessing;
    std::mutex _mutex;
};


int main(int argc, char ** argv) {
    QCoreApplication application(argc, argv);
    SerialClass serialProcessor(2, 9600, &application);

    serialProcessor.addMessage(Message(228));
    serialProcessor.addMessage(Message(929));
    serialProcessor.addMessage(Message(221424));

    serialProcessor.start();

    return application.exec();
}

#include "main.moc"

這是否意味着QSerialPort類不能從另一個線程傳輸數據? (不是QSerialPort線程)

  1. 建議不要在同一項目中混用STL和Qt解決方案
  2. QSerialPort可以在任何線程中工作
  3. 您可以在此處看到正確使用QThread的示例: https : //stackoverflow.com/a/35673612/4149835

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM