我试图从我的Arduino设备上通过BLE读取加速度计。唯一的问题是我不确定如何将其转换回可读的字符串值。
我的Arduino草图(部分内容)如下所示:
if((x - lastX) > threshold) {
STATUS = "MOVING";
toggleIsMoving();
} else if((y - lastY) > threshold) {
STATUS = "MOVING";
toggleIsMoving();
} else if((z - lastZ) > threshold) {
STATUS = "MOVING";
toggleIsMoving();
} else {
STATUS = "STOPPED";
toggleIsStopped();
}
lastX = x;
lastY = y;
lastZ = z;
Serial.print(STATUS);
我在Xamarin Android应用程序(通过BLE)中收到的十六进制值是:
A0-08-00-00-00-4D-4F-56-49-4E-47-CE-3C
我目前的实施是:
public static string FromHex(string hex) {
hex = hex.Replace("-", "");
byte[] raw = new byte[hex.Length / 2];
for (int i = 0; i < raw.Length; i++)
raw[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
return Encoding.ASCII.GetString(raw);
}
结果是:
?MOVING&LT;
为什么会发生这种情况,如何将其转换回C#中的可读字符串?
更新1
我在bean-sdk源代码中做了一些研究,发现了这个:
/**
* Represents a LightBlue Serial Transport Message
*
* Defined as:
*
* [1 byte] - Length (Message ID + Payload)
* [1 byte] - Reserved
* [2 byte] BE - Message ID
* [0-64 bytes] LE - Payload
* [2 bytes] LE - CRC (Everything before CRC)
*
* @param messageId
* @param definition
*/
更新2
最后通过实现更新1中提到的协议使其工作。实际有效负载位于内部,因此需要从十六进制字符串中提取。
答案 0 :(得分:2)
超过0x7F的任何内容都是 NOT ASCII。第一个字符是0xA0。其中,Unicode和IOS LATIN 1都是NBSP。序列A0-08-00-00-00
可能有意义,但不是以纯文本方式。您应该查看加速度计的规格,看看它喷出的是什么来正确解释它。
修改
此外,由于在您的代码中将变量STATUS
设置为&#34; MOVING&#34;,MOVING之前和之后的字符可能是虚假字符。
答案 1 :(得分:-1)
我使用了以下内容:
private static string hexToASCII(string hexValue)
{
StringBuilder output = new StringBuilder("");
for (int i = 0; i < hexValue.Length; i += 2)
{
string str = hexValue.Substring(i, 2);
output.Append((char)Convert.ToInt32(str, 16));
}
return output.ToString();
}
的Java函数转换而来