2016-03-02 75 views
0

我試圖通過使用QSerialPort類的串行端口發送一些數據。每次發送來自同一父類的數據都很好。但是當我試圖使用另一個線程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線程)

+0

'QObject'派生的類只能與在'QThread'中運行的事件循環一起使用。幸運的是,'QThread'的默認'run()'實現已經爲你調整了一個事件循環。 –

回答

相關問題