Arduino串口接收16进制,如何转换成10进制?-Arduino中文社区 - Powered by Discuz!
查看: 573|回复: 7

[未解决] Arduino串口接收16进制,如何转换成10进制?

[复制链接]

该用户从未签到

发表于 2021-7-29 16:27 | 显示全部楼层 |阅读模式
我这里有个燃气传感器,输出信号是0xFF,0x01,0x03,0x00,0x00,0x00,0x30,0xD4,0xF8,气体浓度=第四位的第五位*256+第五位。我有参考之前以为大佬的帖子,出结果了也没完全出,希望各位大佬可以帮我看看,附上我的程序
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
String comdata="";
unsigned char DEC1,DEC2;float o3Val;
int CheckSum;
byte Command[]={0xFF,0x01,0x03,0x00,0x00,0x00,0x30,0xD4,0xF8};//主动上传

void setup() {
Serial.begin(9600);
mySerial.begin(9600);
delay(1000);
mySerial.write(Command,9);
}

void loop() {
while(mySerial.available()>0){
    comdata+=char(mySerial.read());
     delay(2);
  }
if(comdata.length()>0){
  CheckSum=0x00;
  for(int x=0;x<comdata.length();x++){
  if(x<8)CheckSum+=comdata[x];   //计算校验和
  myPtHex(comdata[x]);  //16进制串口输出。接收的是什么代码。
  }   
  CheckSum=~(CheckSum&&0xFF);  //取反
  if(comdata[8]==CheckSum){
   DEC1=comdata[4]&&0x37;
   DEC2=comdata[5];
   int o3val=DEC1*256+DEC2;
   o3Val=o3val/1000.0;  
  }
  Serial.println(o3Val,2);
  comdata="";
}   
}

void myPtHex(int g){ // 把 g 最右边 byte 印成 Hex 两位
  int a = g& 0xf0;  // 左边 4 bits
  a = a >> 4;  // 右移 4 bits
  int b = g& 0x0f;  // 右边 4 bits
  char c = a < 10 ? a + '0' : a + 'A' - 10;
  Serial.write(c);
  c = b < 10 ? b + '0' : b + 'A' - 10;
  Serial.write(c);
}

最后悄悄的问一下大佬们什么叫问答式啊,可以的话给个传送门也行麻烦大家了

屏幕截图 2021-07-29 160429.png

该用户从未签到

 楼主| 发表于 2021-7-30 09:36 | 显示全部楼层
气体浓度 = 第四位的高字节低五位*256+第五位,说错了

签到天数: 17 天

[LV.4]偶尔看看III

发表于 2021-7-30 12:32 | 显示全部楼层
你应该定义一个数组来接收传感器发来的数据,
一个 & 表示按位与  两个 &&  表示的条件与
应答式 :你发一句,对方回你一句

签到天数: 222 天

[LV.7]常住居民III

发表于 2021-7-31 11:24 | 显示全部楼层

签到天数: 169 天

[LV.7]常住居民III

发表于 2021-7-31 14:22 | 显示全部楼层

该用户从未签到

发表于 2021-8-2 10:24 | 显示全部楼层
需要的发的数据是16进制的,不能用arduino串口工具发,arduino串口工具发的ascii形式的16进制字符串,需要原始数据,换个串口工具勾选hex发送

该用户从未签到

 楼主| 发表于 2021-8-2 19:58 | 显示全部楼层
那那个低五位的东西该怎么处理啊,大佬们看看我

签到天数: 222 天

[LV.7]常住居民III

发表于 2021-8-13 17:21 | 显示全部楼层
本帖最后由 topdog 于 2021-8-13 18:20 编辑
sjdynake 发表于 2021-7-30 09:36
气体浓度 = 第四位的高字节低五位*256+第五位,说错了


byte Command[0]=0xFF
byte Command[4]=0x00 第四位
byte Command[5]=0x00 第五位
byte Command[8]=0xF8 校验位

第四位*256+第五位?DEC1=comdata[4]&&0x37;这句 0x37转化成二进制是B00110111,逻辑与comdata[4]。这一位就两种情况,1和0呀。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

继电器断开瞬间esp32重启或者网络断开
继电器断开瞬间esp32重启
主要模块: 芯片ESP32-WROOM-32D 供电用的220V转5V模块,700mA 网络LAN8720A模块 继电
【Arduino】168种传感器系列实验(171)---HLK-V20离线语音模块
【Arduino】168种传感器系
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
【Arduino】168种传感器系列实验(181)---1.3寸OLED液晶屏模块
【Arduino】168种传感器系
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
大佬们,帮帮忙
大佬们,帮帮忙
为什么我写的子程序,单独使用运行没问题,两个程序合起来就只会运行一个程序
OLED 128*64自制可达10000000个选项的菜单(已更新)
OLED 128*64自制可达10000
OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表