【发布时间】:2020-08-10 15:46:31
【问题描述】:
我从 rs232 Tx RX 读取串行数据时遇到问题
我的代码是
uint8_t cc;
char rtx[MAX_LEN] = { 0 };
int ii, lenn = 0;
Serial.print("recv (HEX): ");
Serial.println();
while (mySerial.available())
{
cc = mySerial.read();
if (cc < 0x10) Serial.print("0");
Serial.print(cc, HEX);
rtx[lenn] = cc; lenn++;
Serial.print("");
}
Serial.println();
在这里我可以看到我的输出没有问题
输出例如
recv (HEX):
030039094C80703470326421A5713DFE01EA6B79AE8D9DBD94F523F95340217C739BCB3B75DE1D1EF09CF03D2F916AB390E92136074A41BBA4E95ACB
我想从外面打印 rtx 的问题
例如我用过这个代码
char buffer[MAX_LEN] = { 0 };
sprintf(buffer, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",rtx[0],rtx[1],rtx[2],rtx[3],rtx[4],rtx[5],rtx[6],rtx[7],rtx[8],rtx[9],rtx[10],rtx[11],rtx[12],rtx[13],rtx[14],rtx[15],rtx[16],rtx[17],rtx[18],rtx[19],rtx[20]);
Serial.println(buffer);
它只给出有限的错误数据
我明白了
0300FF39094FFFC807034FFF70326421A571
问题是在 out 中添加 FFF,我无法获取所有 rtx[21],rtx[22],rtx[23],rtx[23],rtx[24]......
【问题讨论】:
-
如果您有一个负数,您使用
sprintf的代码会在输出中添加额外的FF。您的缓冲区rtx包含char,默认情况下可以签名或未签名。在您的系统中,它似乎已签名。因此,当您将其传递给可变参数函数时,它会使用符号扩展名转换为int。您可以通过使用unsigned char或指定除intintsprintf之外的其他类型来避免这种情况。如果编译器支持inttypes.h,则可以使用"%02hhX"或"%02"PRIx8
标签: c arduino serial-port