【问题标题】:Arduino escape character \xArduino 转义字符 \x
【发布时间】:2015-05-29 22:45:56
【问题描述】:

我正在使用带有 u8glib 库的 Arduino Pro Mini 和 OLED 显示器 .96"。所以我必须使用此代码来输出乌克兰语单词“Тест”。

String str = "\xc2\xd5\xe1\xe2";
u8g.print(str);

它工作正常。但是当我通过蓝牙从 Android 传输相同的字符串时,它会输出 "\xc2\xd5\xe1\xe2" :(

while (BTSerial.available() > 0){     
   char recieved = BTSerial.read();
   inData += recieved;
   if (recieved == '\n'){
      u8g.print(inData);
   }
}

为什么 Arduino 没有“看到”来自 Android 的转义字符 \x?我尝试读取 2 个字符并执行以下操作:

inData += "\x" + char1 + char2;

但有错误:\x used with no following hex

安卓代码

String str = "Тест";
String result = "";
for (int i = 0; i < str.length(); i++) {
   char c = str.charAt(i);
   int code = (int)c;
   if (code >= 1025){
      code -= 864;
      result += "\\x" + Integer.toHexString(code);
   }else {
      result += c;
   }
}
byte[] msgBuffer = result.getBytes();
String b = "\n";
byte[] n = b.getBytes();
try {
   mmOutStream.write(msgBuffer);
   mmOutStream.write(n);
}catch (IOException e){
   e.printStackTrace();
}

【问题讨论】:

  • 乌克兰字符是 2 个字节吗?
  • C 中的“char”是一个字节,我认为它也是 Java 中的。如果是这种情况,那么“代码”永远不会大于 1025,因为一个字节不能大于 255。
  • @Les 乌克兰字母表以 1040 开头,在 1028 (Є)、1025 (Ё) 上有一些字母。我将结果变量打印到控制台,它包含“\xc2\xd5\xe1\xe2”
  • 好的,取出转换,发送带有换行符的原始字符串。收到多少字符? (在循环中放置一个计数器,因为如果您收到一个 null 并将其附加到字符串中,它什么也不做)
  • 您的 Adruino 代码是 C++ 吗? inData的数据类型是什么?

标签: c arduino arduino-ide


【解决方案1】:

由 Arduino 初始化为“str”的字符串被转换为实际字符。它实际上并不包含 \xc2\xd5\xe1\xe2,它包含字符 c2、d5、e1 和 e2。

在 Android 中,您需要发送相同的“未转义”值。

当你在代码中初始化一个字符串时,比如:

String str = "\xc2\xd5\xe1\xe2";
u8g.print(str);

\x 是一个转义符,告诉编译器下一个字符将被视为要初始化的字符的十六进制表示。 u8g.print(str) 看不到转义字符串,它看到编译器将其转换为的实际 4 个字符(和 null)。

编辑:根据您显示 Android 代码的更新,您似乎根本不会发送 \x。尝试将 getBytes() 更改为 getBytes("ISO 8859-5") 这是 Cryllic 的代码

Edit2:在 Java 中,char 是一个无符号的 16 位整数,所以我上次的编辑是有缺陷的。

在事务的 Android 端转义字符可能会浪费时间。相反,我认为 BTSerial.read() 的返回值在分配给 char 时被截断。尝试将“received”的类型更改为“int”。

Here 是 Arduino 板上的一个线程,可以帮助您更好地处理 Unicode。

【讨论】:

  • 我可以在 Arduino 中替换来自 Android 的斜杠以输出为转义字符吗?
  • 没有。您要么必须转换接收到的字符串,要么必须发送预处理的字符串。要转换字符串,您必须解释整个转义序列,例如,您必须将 4 个字符序列 \xc2 替换为单个字符 (char)0xC2。
  • @skifbrt - 你试过发送原始字符串吗?
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 2015-08-03
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多