我正在使用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}"
答案 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。