将从 BTSerial 接收到的字符串转换为十六进制字符串

问题描述 投票:0回答:1

我有一个应用程序,可以将十六进制字符串发送到我的 ESP32。我希望这些字符串能够通过 RS232 转 TTL 模块(连接到我的 ESP)发送到定标器。

在我的应用程序端,我发送此命令:

"\\e\\x34\\x54\\x45\\x53\\x54\\r" //This translates to ascii ESC4TESTCarriageReturn

它需要双转义字符才能实际发送单个反斜杠。

在我的微控制器方面,我正在做:

//This reads the incoming BT message
String message = SerialBT.readStringUntil('\n');
//This sends the message, converted to a char * 
Serial2.write(message.c_str());

理论上,我收到了正确的字符串,正如您在串行监视器输出中看到的那样:

BT Message received: \e\x34\x54\x45\x53\x54\r
The command to be sent via rs232: \e\x34\x54\x45\x53\x54\r
Error: E10 //This indicates that the message could not be processed by the receiver

但是,如果我像这样在微控制器代码中预定义的直接发送消息,我会从接收器收到正确的响应:

Serial2.write("\e\x34\x54\x45\x53\x54\r");

------ Output ------
Test4 //This indicates that Testpattern 4 was selected

我对c++不太熟悉,所以我可能做了一些明显错误的事情,也许有人知道,如何将收到的BT消息转换为可以通过Serial2发送的实际消息。

编辑:所以基本上我的问题是,如何实现通过蓝牙接收的字符串的转换( \x34\x54\x45\x53\x54 ) 按原样转换为十六进制字符串,微控制器可以正确解释该十六进制字符串,因此可以通过 rs232 正确发送。

c++ arduino bluetooth microcontroller esp32
1个回答
0
投票

解决方案是编写一个自己的解析器。既然你说你控制 BT 发送方,那么你不需要 C++ 标准的所有通用功能。

我们看到单个字符的这些不同类型的子字符串:

  • "\e"
    '\e'
  • "\x##"
    表示
    '\x##'
    ,“##”是两位十六进制数字;
  • "\r"
    '\r'

这是一个简单的测试草图,用于直接解决方案:

void setup() {
  while (!Serial);
  String message = "\\e\\x34\\x54\\x45\\x53\\x54\\r";
  Serial.println(message);
  String toSend = unescape(message);
  for (int c : toSend) {
    Serial.print(c, HEX);
  }
  Serial.println();
}

void loop() {
}

String unescape(String &escaped) {
  String unescaped;
  for (size_t index = 0; index < escaped.length(); index++) {
    if (escaped[index] == '\\') {
      index++;
      switch (escaped[index]) {
      case 'e':
        unescaped += '\e';
        break;
      case 'x':
        index++;
        {
          char hex = strtol(escaped.substring(index, index + 2).c_str(), 0, 16);
          unescaped += hex;
        }
        index++;
        break;
      case 'r':
        unescaped += '\r';
        break;
      default:
        break;
      }
    }
  }
  return unescaped;
}

请注意,这个简单的建议存在一些您在专业软件中不希望出现的小问题:

  • 它不会在
    unescape()
    中进行错误检查。实际上,如果输入有错误,它会默默地返回不完整或错误的结果。
  • 它使用 Arduino 的
    String
    ,速度慢且笨重。

将其作为您自己更好的解决方案的起点。

© www.soinside.com 2019 - 2024. All rights reserved.