我似乎无法在BLE上传递整数值。
我使用#include
发送的值不断转换到8位?
我已经尝试了一些事情,如改变BLE特征Int (BLEIntCharacteristic)和Char (BLECharCharacteristic),但这没有效果。
提前感谢。
void loop() {
int reading;
{
BLEDevice central = BLE.central();
if (central)
{
digitalWrite(LED_BUILTIN, HIGH);
while (central.connected()) {
reading = adc.readFB(0, 2.5, 500000.00);
serviceCharacteristic.setValue(reading); //reading value from load sensor is eg ; 89943
Serial.print(reading);
Serial.print('n');
//delay(200);
}
}
digitalWrite(LED_BUILTIN, LOW);
}
蓝牙LE特性的数据类型始终是字节数组。创建适当的序列化是软件的任务。
在Arduino系统上有这样的转换。例子:
uint8_t byteArray[2];
int intValue = 42;
byteArray[0] = [highByte(val);
byteArray[1] = lowByte(val);
intValue = word( byteArray[0], byteArray[1]);
但请注意末尾。在不同的计算机系统中,较大类型的数据以不同的顺序存储,因此在重新组合数据时必须考虑这些顺序。
参考:
- highByte ()
- lowByte ()
- 词()
好了,我终于在这些网站的帮助下弄明白了,我真的推荐大家去看看:
Quick Bird Studios如何在Swift中读取BLE特性
不安全的领土!理解Swift中的Raw Bytes和指针
这个堆栈溢出post
在Arduino端,这是我的代码:
...
BLEIntCharacteristic serviceCharacteristic(CHARACTERISTIC, BLERead | BLENotify);
...
int reading;
{
BLEDevice central = BLE.central();
if (central)
{
digitalWrite(LED_BUILTIN, HIGH);
while (central.connected()) {
reading = adc.readFB(0, 2.5, 500000.00);
serviceCharacteristic.setValue(reading); //reading value from load sensor is eg ; 89943
上。在我的Swift应用程序的客户端,有一次我发现Arduino BLE Device通过调用data发送了四个字节的数据。我将类型从[UINIT8]更改为[UINT32],然后BAM!现在我只需要得到数组中的第一个值!
编辑:我将[UInt32]数组更改为本地[Int]以实现相同的结果。
如果有人看到我这样做的方式有问题,或者可以使代码更明确和有效,请大声喊出来!
guard let data = characteristic.value else{
return
}
print(data.count)
let numberOfBytes = data.count
var rxByteArray = [Int](repeating: 0, count: numberOfBytes)
(data as NSData).getBytes(&rxByteArray, length: numberOfBytes)
print(rxByteArray)