【问题标题】:Convert a HEX string to long in C++在 C++ 中将 HEX 字符串转换为 long
【发布时间】:2020-06-30 18:51:42
【问题描述】:

我正在为 Ardunio 编写我的第一个 BLE 系统,我正在将它构建在一个已经工作的系统之上,用于控制 RGB 条带,目前,我正在使用 HEX 数字来了解我在哪里设置了什么。

好的,修改问题,

#define BLE_RX 5
#define BLE_TX 4

SoftwareSerial BLE(BLE_RX, BLE_TX);

// set the startup color to white
unsigned long color = 0xFFFFFF;
// hold the last color set so we can off / on without losing prior settings
unsigned long lastColor = 0x000000;

void setup() 
{
  Serial.begin(9600);
  BLE.begin(9600);

  pinMode(GREEN_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  pinMode(BLUE_LED, OUTPUT);
  Serial.println("hello world");
}


void loop() {
  long r = ((color >> 16) & 0xFF);
  long g = ((color >> 8) & 0xFF);
  long b = (color & 0xFF);
  char data[100];
  analogWrite(RED_LED, r);
  analogWrite(GREEN_LED, g);
  analogWrite(BLUE_LED, b);

  readBLE();
}

long hstol(String recv){
  char c[6];
  recv.toCharArray(c, 6);
  return strtol(c, NULL, 16);
}

void readBLE(){
  if(BLE.available() > 0){
    String data = BLE.readString();
    if(data.length() == 6){
      lastColor = color;
      Serial.println(data);
      Serial.println(hstol(data));
      color = hstol(data);
    }
  }
}

当我第一次运行 CPP 时,如果通过 BLE 我发送 FF0000(红色),LED 灯条应该是白色的,我的 LED 变绿,这是我的输出

FF0000 应该等于 16711680 时,00FF00 = 65280 和 0000FF = 255

【问题讨论】:

  • 你可以使用C库吗? sscanf 会很好用。
  • @john 是的 sscanf 可供我使用
  • @Barkermn01 String recv的格式是什么?
  • 关于strtol,如果recv的内容是例如"0xFF0000" 那么你可以将它用作strtol(recv.c_str()), 0, 0),或者strtol(recv.c_str() + 2, 0, 16)
  • @Barkermn01 根据您的新问题,将数组大小更改为7hstol 内。那时它会正常工作。记住 strtol 是基于\0 结束的字符串。

标签: c++ arduino hex


【解决方案1】:

您发布的代码中的错误来源:您使用的是 6 个字符的数组,而它应该是 7 来保存整个 recv 字符串。您的代码当前显示未定义的行为,因为 strtol 搜索空/空白字符以完成解析,而 char c[6] 的范围内从未出现过该字符。

我建议使用这种方法。它只是一个单行的东西,不需要额外的内存来存储一些临时字符数组。 (也节省了时间,否则就浪费在复制十六进制字符串上)。

void setup() {
  Serial.begin(9600);
  
  String x1 = "FF0000";
  long y1 = strtol(x1.c_str(), NULL, 16); // <--
  Serial.print(y1); // prints 16711680
  Serial.println();
  
  String x2 = "0xFF0000";
  long y2 = strtol(x2.c_str(), NULL, 0); // <--
  Serial.print(y2); // prints 16711680
  Serial.println();
  
  long y3 = strtol(x2.c_str() + 2, NULL, 16); // <--
  Serial.print(y3); // prints 16711680
  Serial.println();
}

void loop() {
    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多