【发布时间】:2016-12-30 10:47:17
【问题描述】:
我正在尝试从我的 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);
}
这个结果是:
?������移动?
为什么会发生这种情况,如何将其转换回 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 中提到的协议使其工作。实际的有效负载位于内部,因此需要从十六进制字符串中提取。
【问题讨论】:
-
A0-08-00-00-00 的值超出了正常的打印范围,所以给你一些不稳定的字符..
标签: c# arduino hex bluetooth-lowenergy