在单独的线程上使用QSerialPort

时间:2013-11-20 16:08:08

标签: multithreading qt serial-port

我正在尝试从单独的线程读取/写入数据。打开串口时没有显示错误,但我无法读取或写入任何内容。

这是我的 SerialThread.h 代码:

#include <QThread>

class SerialThread : public QThread
{
    Q_OBJECT
public:
    explicit SerialThread(QObject *parent = 0);
    ~SerialThread();

protected:
    void run();
private:
    bool _threadRunning;
};

我的 SerialThread :: run()实现:

void SerialThread::run()
{
    QSerialPort *_serial = NULL;
    foreach(QSerialPortInfo info, QSerialPortInfo::availablePorts())
    {
        QString name = info.portName();
        if(name.startsWith("usbserial-"))
        {
            _serial = new QSerialPort(info, this);

            qDebug() << "Opening " << name;
            if(_serial->open(QSerialPort::ReadWrite))
            {
                qDebug() << "ok";
                _threadRunning = true;
            }
        }
    }

    while(_threadRunning)
    {
        QByteArray array = _serial->read(10);
        for (int i = 0; i< array.length(); i++)
            qDebug() << QString::number(array[i], 16);
        msleep(1000);
    }

    if(_serial)
    {
        _serial->close();
        delete _serial;
    }
}

相同的代码无线程工作(连接 readyReady()信号)。

有什么想法吗?我可以滥用QThread对象吗?

1 个答案:

答案 0 :(得分:1)

read()实际上没有进行任何阅读,需要一个事件队列才能正常运行

在紧要关头,只要_serial->waitForReadyRead()为0

,您就可以致电_serial->bytesAvailable()