从串行端口解码数据(带整数的字符串)

时间:2019-05-11 15:03:08

标签: c++ qt arduino serial-port string-decoding

我正在使用串行通信将字符串从Arduino发送到PC。消息的格式包括字符,值和空格(分隔数据)。消息示例:"H123 V2 L63 V2413 I23 CRC2a"。 我在Qt中解码此消息时遇到问题,因为例如当我使用Utf-8解码时,将整数转换为char(以简化的方式),并且收到类似的信息:"H&?? j\u0002I&\u001AICL?H"。消息长度不是恒定的(例如H12H123的大小不同),因此我无法使用预定位置进行投射。您知道如何正确解码消息吗?

Arduino代码:

uint8_t H = 0, V = 0, L = 0, I = 0, CRC = 0;
String data;
void loop() {
  ++H; ++V; ++L; ++I;
  data = String("H");
  data += String(H, DEC);
  data += String(" V");
  data += String(V, DEC);
  data += String(" L");
  data += String(L, DEC);
  data += String(" I");
  data += String(I, DEC);
  CRC = CRC8(data.c_str(), strlen(data.c_str()));
  data += String(" CRC");
  data += String(CRC, HEX);
  Serial.println(data);
  delay(1000);
}

Qt代码:


while(serial.isOpen())
{
  QByteArray data;

  if (serial.waitForReadyRead(1000))
  {
    data = serial.readLine();
    while (serial.waitForReadyRead(100))
    {
        data += serial.readAll();
    }
    QString response = QString::fromUtf8(data);
    qDebug() << "Data " << response << endl;
  }
  else
    qDebug() << "Timeout";
}

1 个答案:

答案 0 :(得分:0)

问题是您使用UTF-8解码,而Arduino仅发送1字节ASCII字符。因此请使用fromLocal8Bit,如albert828

赞:

while(serial.isOpen())
{
  QByteArray data;

  if (serial.waitForReadyRead(1000))
  {
    data = serial.readLine();
    while (serial.waitForReadyRead(100))
    {
        data += serial.readAll();
    }
    QString response = QString::fromLocal8Bit(data);
    qDebug() << "Data " << response << endl;
  }
  else
    qDebug() << "Timeout";
}