gpt4 book ai didi

c++ - QString 数字在串行通信中保持不变

转载 作者:行者123 更新时间:2023-11-28 05:41:33 25 4
gpt4 key购买 nike

我在从 Arduino 读取串行数据并将其发送到 UI 时遇到问题。我发现将所有串行数据拆分为 3 个单独的变量很麻烦,因此使用 left 和 mid 来获取特定数字。现在的问题是我得到的数字保持不变,尽管我可以在 LCD 显示屏上看到它们发生了变化。
这是代码的一部分:

void Dolle::serialReceived(){
ba = serial->readAll();

serialBuffer += QString::fromStdString(ba.toStdString());

QString bufferSplit = serialBuffer;

QString hum = bufferSplit.left(2);
QString temp = bufferSplit.mid(2, 2);
QString gas = bufferSplit.mid(4, 4);

if((hum.size()==2) && (temp.size()==2) && (gas.size()==4)){
ui->humLabel->setText("Humidity: "+hum+" %");
ui->tempLabel->setText("Temperature: "+temp+(char(176))+ "C");
ui->gasLabel->setText("Gas level: "+gas);
qDebug() << hum << temp << gas;
}
}

最佳答案

有几个问题:

  1. 您正在追加到 serialBuffer,但您永远不会将其清空。 QIODevice 已经为您维护了一个内部的、可调整大小的循环缓冲区,因此不需要第二个。

  2. 您将通过 std::string 从二进制表示形式转换为 QString。这是完全没有必要的。

  3. 您没有明确说明二进制数据中使用的字符编码。

  4. UI 重复更新,而不是每个 readyRead 信号最多更新一次。

  5. 您正在使用魔法常量。您应该使用 UTF-8 编码您的源代码,或者使用命名的 QChar 常量。

  6. 您使用字符串运算符手动构建字符串,这会阻碍国际化和可维护性。

  7. 您正在使用空格作为一种机制来对齐 UI 中的显示。或许您应该以不同的方式设计您的 UI,这样就不需要这样的 hack。

我假设您的字符串以某种方式分开 - 也许每个字符串都在单独的一行中?在任何情况下,您都应该继续从设备读取完整的分隔字符串,只要它们可用。 QIODevice::readLine 方法使行分隔数据变得容易:

void Dolle::serialReceived() {
QString validLine;
while (serial->canReadLine()) {
auto binLine = serial->readLine();
auto line = QString::fromLatin1(binLine);
if (line.length() < 8)
continue;
validLine = line;
}
if (validLine.isEmpty()) return;
auto hum = line.left(2);
auto temp = line.mid(2, 2);
auto gas = line.mid(4, 4);
ui->humLabel->setText(QStringLiteral("Humidity: %1%").arg(hum));
ui->tempLabel->setText(QStringLiteral("Temperature: %1°C").arg(temp));
ui->gasLabel->setText(QStringLiteral("Gas level: %1").arg(gas));
}

假设您的数据不是以行分隔的数据,而是以固定大小的 block 形式到达。您将以类似的方式处理它们:

void Dolle::serialReceived() {
QString validPacket;
while (serial->bytesAvailable() >= 8) {
auto bin = serial->read(8);
auto packet = QString::fromLatin1(bin);
if (packet.length() < 8)
continue;
validPacket = packet;
}
...
}

关于c++ - QString 数字在串行通信中保持不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36982362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com