从串口解码数据(带整数的字符串)
Decoding data from serial port (string with integers)
我正在使用串行通信将字符串从 Arduino 发送到 PC。消息的格式包括字符、值和space(分隔数据)。示例消息:"H123 V2 L63 V2413 I23 CRC2a"
。
我在 Qt 中解码此消息时遇到问题,因为当我使用例如 Utf-8 解码时,它将整数转换为字符(以简化的方式)并且我收到类似的东西:"H&?? j\u0002I&\u001AICL?H"
。消息长度不是恒定的(例如 H12
和 H123
的大小不同)所以我不能使用预定的位置进行转换。你知道如何正确解码消息吗?
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";
}
问题是您使用 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";
}
我正在使用串行通信将字符串从 Arduino 发送到 PC。消息的格式包括字符、值和space(分隔数据)。示例消息:"H123 V2 L63 V2413 I23 CRC2a"
。
我在 Qt 中解码此消息时遇到问题,因为当我使用例如 Utf-8 解码时,它将整数转换为字符(以简化的方式)并且我收到类似的东西:"H&?? j\u0002I&\u001AICL?H"
。消息长度不是恒定的(例如 H12
和 H123
的大小不同)所以我不能使用预定的位置进行转换。你知道如何正确解码消息吗?
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";
}
问题是您使用 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";
}