如何从QT中的串口读取数据?

时间:2016-09-24 15:56:53

标签: c++ qt

我在QT中创建一个脚本,用于从串口读取格式包(AA),(BB)等。我打开串口,但是当我去检查QByteArray值时,回来说我看不懂任何值。

这是我的代码

...
QSerialPort *serialPort = new QSerialPort();
serialPort->setPortName("ttyUSB0");
serialPort->setParity(QSerialPort::NoParity);
serialPort->setBaudRate(QSerialPort::Baud9600, QSerialPort::AllDirections);
serialPort->setStopBits(QSerialPort::OneStop);
serialPort->setFlowControl(QSerialPort::NoFlowControl);
serialPort->open(QIODevice::ReadOnly);

if (serialPort->isOpen()) {
    qDebug() << "Serial port is open...";
    QByteArray datas = serialPort->readAll();
    if (datas.size() == 0) {
        qDebug() << "Arrived data: 0";
    } else {
        for (int i = 0; i < datas.size(); i++){
            if (datas.at(i)) {
                qDebug() << datas[i];
            }
        }
    }

} else {
    qDebug() << "OPEN ERROR: " << serialPort->errorString();
}

serialPort->close();
qDebug() << "...serial port is closed!";

return 0;
...

1 个答案:

答案 0 :(得分:2)

您在open()之后立即致电readLine()。计算机可能需要几纳秒才能从一台计算机到另一台计算机。

在9600波特率下,每个数据字节的传输时间略长于1毫秒。任何数据绝对不可能在那么短的间隔内到达,这就是为什么你没有数据的原因。

串口没有开始缓冲输入数据,直到你打开它们(如果没有程序打开端口,它们怎么能用于接收和缓冲的波特率和其他设置?)

使用某种阻塞读取函数(例如FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); )或在数据到达时对数据作出反应的事件循环。