Qt5读取串口数据的方法
How to read serial data from Qt5
我正在制作一个 Qt5 应用程序来从 ESP32 微控制器读取数据,我正在使用 PlatformIO 使用 Arduino 框架对其进行编程。
我遇到的问题是我无法以统一的字节数接收数据。有时我收到 1 个字节,其他时候收到 2 个字节。这是正常的还是有办法每次都能接收到完整的buffer?
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
我希望在输出中看到的是单个字符,或者一行中的整个 packet/buffer,
有什么建议吗?
接收到不同大小的字节是正常的,在这些情况下,找到分隔符的简单方法会更好。例如,在您的情况下,最好使用结束符 ("\n") 作为分隔符:
Serial.println("Hello");
// or
// Serial.write("Hello\n");
void Dialog::on_startStream_clicked()
{
QByteArray ba;
while(esp->canReadLine()){
ba = esp->readLine();
qDebug() << ba;
}
}
我正在制作一个 Qt5 应用程序来从 ESP32 微控制器读取数据,我正在使用 PlatformIO 使用 Arduino 框架对其进行编程。
我遇到的问题是我无法以统一的字节数接收数据。有时我收到 1 个字节,其他时候收到 2 个字节。这是正常的还是有办法每次都能接收到完整的buffer?
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
我希望在输出中看到的是单个字符,或者一行中的整个 packet/buffer,
有什么建议吗?
接收到不同大小的字节是正常的,在这些情况下,找到分隔符的简单方法会更好。例如,在您的情况下,最好使用结束符 ("\n") 作为分隔符:
Serial.println("Hello");
// or
// Serial.write("Hello\n");
void Dialog::on_startStream_clicked()
{
QByteArray ba;
while(esp->canReadLine()){
ba = esp->readLine();
qDebug() << ba;
}
}