Arduino串口通讯十六进制少前导零问题

2022-06-117793
AI 快速预览详细 收起
本文探讨了在使用Arduino进行串口通讯时遇到的一个常见问题:返回的十六进制数据缺少前导零。文章提供了具体的代码示例和解决方案,帮助用户解决这一问题。通过修改代码中的`String(buf[i], HEX)`为`String(buf[i], HEX, 2)`,可以确保每个字节都显示为两位十六进制数,从而避免数据偏差。


大家好,我在淘宝买了一个电量模块。可以通过串口命令帧调试获取参数。如图:
Arduino串口通讯十六进制少前导零问题图1
在我使用串口调试的时候,可以正常返回数据。
虽然我在使用Arduino串口获取数据的时候也返回了数据,代码如下:
  1. #include <SoftwareSerial.h>
  2. char item[7] = {0x55, 0x55, 0x01, 0x01, 0x00, 0x00, 0xAC};  //16进制命令
  3. unsigned long buf[20];  //接收到的16进制字符串
  4. String data = "";
  5. String data_to_hex = "";
  6. SoftwareSerial RS485(3, 2);   //RX, TX
  7. void setup() {
  8.   // put your setup code here, to run once:
  9.   RS485.begin(9600);
  10.   Serial.begin(115200);
  11. }
  12. void loop() {
  13.   // put your main code here, to run repeatedly:
  14.   delay(1000);
  15.   data = "";
  16.   RS485.write(item, 7);
  17.   while(RS485.available()>0){
  18.     int i = 0;
  19.     buf[i] = (unsigned char)RS485.read();
  20.     Serial.print(buf[i]);
  21.     Serial.print(",");
  22.     data += String(buf[i], HEX);
  23.     data += ",";
  24.     i++;
  25.   }
  26.   Serial.println("");
  27.   Serial.println(data);
  28. }
复制代码

但是有一个不完美的地方:把返回的数据转化成十六进制之后,格式并没有按照预期的显示:
Arduino串口通讯十六进制少前导零问题图2
我疑惑的点是:为什么转化后的十六进制不像普通的显示一样是两位的比如第一行中十进制:85,85,1,1,0,12,0,3,170,176,0,0,0,0,0,0,0,0,21,
转化成十六进制后应该为:55,55,01,01,00,0c,00,03,aa,b0,00,00,00,00,00,00,00,00,15,而不是像串口显示的一样是55,55,1,1,0,c,0,3,aa,b0,0,0,0,0,0,0,0,0,15,,每个字节只有一个数字。如果少了一个0,会导致我最终算出来的电压等参数会有偏差,所以这个零不能少
求解,万分感激~~~


创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(1)
R2D2
R2D2
16进制少个0 对最后的数字有什么影响? 不太理解。 00 就是对应10进制的0啊,
- 没有更多了 -