Arduino逃脱角色\ x

时间:2015-05-29 22:45:57

标签: c arduino arduino-ide

我正在使用Arduino Pro Mini和OLED显示器.96“和u8glib库。因此我必须使用此代码输出乌克兰语”Тест“。

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

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

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

为什么Arduino不会“看到”来自Android的转义字符\ x?我试过读2个字符并做这样的事情:

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();
}

但是有错误:\ x使用没有后续的十六进制

Android代码

call sendKeys.bat "Minecraft console title" "stop{enter}"

1 个答案:

答案 0 :(得分:2)

由Arduino初始化为&#39; str&#39;转换为实际字符。它实际上不包含\ xc2 \ xd5 \ xe1 \ xe2,它包含字符c2,d5,e1和e2。

在Android中,您需要发送相同的&#34;未转义的&#34;值。

在代码中初始化字符串时,例如:

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

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

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

Edit2:在Java中,char是无符号的16位整数,因此我的上一次编辑存在缺陷。

您可能会通过在交易的Android端转义字符来浪费时间。相反,我认为BTSerial.read()的返回值在分配给char时被截断。尝试更改&#34;收到&#34;的类型到&#34; int&#34;。

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