arduino串口读取数据十六进制少个0,导致结果有偏差。-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 638|回复: 6

[未解决] arduino串口读取数据十六进制少个0,导致结果有偏差。

[复制链接]
发表于 2022-6-1 15:55 | 显示全部楼层 |阅读模式
本帖最后由 lowkeydan 于 2022-6-1 15:57 编辑

各位大神好,小弟最近用arduino读取一个电量计量模块,遇到问题:当我尝试向模块发送命令帧并且得到了返回的数据时发现返回的帧有缺一个0的问题。问题描述如下:
首先是arduino代码:
  1. #include <SoftwareSerial.h>
  2. int vot;
  3. byte item[7] = {0x55, 0x55, 0x01, 0x01, 0x00, 0x00, 0xAC};  //16进制测温命令
  4. String data = "";  //接收到的16进制字符串
  5. SoftwareSerial RS485(3, 2);   //RX, TX

  6. void setup()
  7. {
  8.   RS485.begin(9600);
  9.   Serial.begin(115200);
  10. }

  11. void loop()
  12. {
  13.   delay(1000);   //放慢输出频率  
  14.   RS485.write(item, 7);
  15.   delay(1000);  // 等待测温数据返回
  16.   data = "";
  17.   while (RS485.available()) //从串口中读取数据
  18.   {
  19.     unsigned char in = (unsigned char)RS485.read();   //read读取
  20. //    Serial.print(in,HEX);
  21. //    Serial.print(',');
  22.     data += String(in, HEX);
  23.     data += ',';

  24.   }

  25.   if (data.length() > 0) //输出接收到的数据
  26.   {
  27.     Serial.print("data数据: ");
  28.     Serial.println(data);
  29.   }
  30. }
复制代码

模块成功返回了帧信息,如图: 微信截图_20220601154608.png

问题来了:
为什么返回的data数据没有前导0和后缀0,按理说返回的十六进制格式应该是类似:55,55,01,01,00,0C,00,30,之类的。而不是想我这样的:55,55,1,1,0,C,0,3。
少零会导致我把十六进制的数据转化成十进制的时候数据会出现偏差。
我这个是个电压模块,如果按照下图8后面少了一个零的数据去换算, 微信截图_20220601155100.png
电压直接从原来230v变成了14v。 微信截图_20220601155327.png 微信截图_20220601155253.png
本人arduino新手,百思不得其解,还望不灵赐教~在此谢过。
 楼主| 发表于 2022-6-1 15:56 | 显示全部楼层
不知为何,代码显示异常,重新贴一下:
#include <SoftwareSerial.h>
int vot;
byte item[7] = {0x55, 0x55, 0x01, 0x01, 0x00, 0x00, 0xAC};  //16进制测温命令
String data = "";  //接收到的16进制字符串
SoftwareSerial RS485(3, 2);   //RX, TX

void setup()
{
  RS485.begin(9600);
  Serial.begin(115200);
}

void loop()
{
  delay(1000);   //放慢输出频率  
  RS485.write(item, 7);
  delay(1000);  // 等待测温数据返回
  data = "";
  while (RS485.available()) //从串口中读取数据
  {
    unsigned char in = (unsigned char)RS485.read();   //read读取
//    Serial.print(in,HEX);
//    Serial.print(',');
    data += String(in, HEX);
    data += ',';

  }

  if (data.length() > 0) //输出接收到的数据
  {
    Serial.print("data数据: ");
    Serial.println(data);
  }
}
 楼主| 发表于 2022-6-1 17:10 | 显示全部楼层
在线等,有大神嘛
发表于 2022-6-1 21:31 | 显示全部楼层
在 串口读取里加个延时 delay(5)
  1. .......
  2. unsigned char in = (unsigned char)RS485.read();   //read读取
  3. delay(5)
  4. .......
复制代码
 楼主| 发表于 2022-6-1 22:12 | 显示全部楼层
好的好的,我试试谢谢~~
 楼主| 发表于 2022-6-2 09:51 | 显示全部楼层
王尼玛1 发表于 2022-6-1 21:31
在 串口读取里加个延时 delay(5)

还是不行呢帅哥
发表于 2022-6-2 11:10 | 显示全部楼层
那又不是%02X打印的,缺0不是很正常
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2025-1-1 20:29 , Processed in 0.079220 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表