首页 > 解决方案 > QSerialPort 读写不工作

问题描述

当我运行下面的 Qt 代码以使用 Arduino 代码连接到 ESP32 时,我没有得到预期的结果,即 QDebug() 打印 QByteArray com -----> \xFF \xFC \xFE \xFC。

相反,我得到了 com 字节数组(\xFC 或 \xFF)中的最后一个或第一个值。

当我调用 connect() 函数“QIODevice::readyRead 不是信号”时,我也会收到警告。

我究竟做错了什么?

Dialog::Dialog(QWidget *parent)
    :QDialog(parent),
      ui(new Ui::Dialog),
      esp(new QSerialPort(this))

{

ui->setupUi(this);
esp_available = false;

void Dialog::on_connect_clicked()
{
    if(esp_available){
        esp->setPortName(espPortName);
        esp->open(QSerialPort::ReadWrite);
        esp->setBaudRate(500000);
        esp->setDataBits(QSerialPort::Data8);
        esp->setParity(QSerialPort::NoParity);
        esp->setStopBits(QSerialPort::OneStop);
        esp->setFlowControl(QSerialPort::NoFlowControl);

        connect(esp, &QSerialPort::readyRead, this, &Dialog::onDataReady);
        // line above gives warning: QIODevice::readyRead is not a signal

}

void Dialog::on_startStream_clicked()
{
    QByteArray com = QByteArray::fromHex({"ff fc fe fc"});
    if(esp->isOpen()){
        esp->write(com);
    }
}

void Dialog::onDataReady()
{
    QByteArray ba;
    do{
        ba += esp->readAll();
        int i = ba.indexOf('\r');
        if(i != -1){
            QByteArray ba1 = ba.mid(0, i);
            qDebug() << ba1;
            ba.remove(0, i);
        }
    } while(esp->bytesAvailable());
}

在 ESP32 上运行的 Arduino 代码:

bool packet_recevived = false;
const int max_packet_size = 10;
char incoming_packet[max_packet_size];  // the incoming packet size mat vary.
void parse_packet();

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

void loop() {
    if (Serial.available() > 0 && packet_recevived == false) {
        parse_packet();
    } else if (packet_recevived == true) {
        packet_recevived = false;
    }
}

void parse_packet() {
    int in_size = Serial.available();
    for (int i = 0; i <= in_size; i++) {
        incoming_packet[i] = Serial.read();
    }
    Serial.println(incoming_packet);
    packet_recevived = true;
}

修正案:

我修改了 onDatReady() 插槽如下:

void Dialog::onDataReady()
{
    QByteArray ba;

    if(esp->canReadLine()){
        ba = esp->readLine();
        qDebug() << ba;

    }
}

正如@eyllanesc 在评论中所建议的那样,我尝试降低波特率并尝试不同的波特率。9600 和 19200 似乎工作正常。Qt 不支持 500K 的自定义波特率吗?也许 connect() 函数或 readyRead() 信号不够快?有什么建议么?

标签: qtarduino

解决方案


问题是我修复的 Arduino 代码。

char incoming_buffer[11];
void process();
void execute(uint8_t com[], int size);
bool received = false;
String command;
bool executed = false;
uint8_t start_stream[] = "\x02\x00\x01\xFE\x01\x00\x01";

void setup() {
    Serial.begin(500000);
    Serial.println();
}

void loop() {
    if (Serial.available() > 0 && received == false) {
        process();
    } else if (executed == true) {
        executed = false;
        received = false;
    }
}
void process() {
    while (Serial.available() > 0) {
        Serial.readBytesUntil('\n', incoming_buffer, 11);
    }
    command = String(incoming_buffer);
    if (command == "start") {
        execute(start_stream, sizeof(start_stream));
        received = true;
    } else {
        Serial.println("no command");
        received = false;
    }
    memset(incoming_buffer, 0, sizeof(incoming_buffer));  // reset the buffer
}

void execute(uint8_t com[], int size) {
    for (int i = 0; i < size - 1; i++) {
        Serial.print(com[i]);
        Serial.print(" ");
    }
    Serial.println();
    executed = true;
}

推荐阅读