首页 > 解决方案 > 如何从 Qt5 读取串行数据

问题描述

我正在制作一个 Qt5 应用程序,用于从 ESP32 微控制器读取数据,我正在使用 PlatformIO 使用 Arduino 框架对其进行编程。

我遇到的问题是我无法以统一的字节数接收数据。有时我收到 1 个字节,有时收到 2 个字节。这是正常的还是有办法每次都接收完整的缓冲区?

Qt代码:

void Dialog::on_connect_clicked()
{
    if(esp_available){
        esp->setPortName(espPortName);
        esp->open(QSerialPort::ReadWrite);
        esp->setBaudRate(9600);
        esp->setDataBits(QSerialPort::Data8);
        esp->setParity(QSerialPort::NoParity);
        esp->setStopBits(QSerialPort::OneStop);
        esp->setFlowControl(QSerialPort::NoFlowControl);
        connect(esp, SIGNAL(readyRead()), this, SLOT(on_startStream_clicked()));
    }

void Dialog::on_ledOn_clicked()
{
    if(esp->isOpen()){
        esp->write("1");
    }
}

void Dialog::on_startStream_clicked()
{
    QByteArray ba;
    if(esp->isOpen()){
        ba = esp->readAll();
        qDebug() << ba;
    }
}

Arduino代码:

#include <Arduino.h>

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  while (Serial.available() > 0)
  {
    int val = Serial.read() - '0';

    if (val == 1)
    {
      Serial.write("Hello");
    }
  }
  Serial.flush();
}

单击该按钮 3 次发送以下输出:

H
e
ll
o
H
e
l
lo
H
e
l
lo

我想在输出中看到的是单个字符,或者一行中的整个数据包/缓冲区,

有什么建议么?

标签: qtarduinoqt5qtserialport

解决方案


接收不同大小的字节是正常的,在这些情况下,找到分隔符的简单方法更好。例如,在您的情况下,最好使用 endline ("\n") 作为分隔符:

Serial.println("Hello");
// or
// Serial.write("Hello\n");
void Dialog::on_startStream_clicked()
{
    QByteArray ba;
    while(esp->canReadLine()){
        ba = esp->readLine();
        qDebug() << ba;
    }
}

推荐阅读