bluefruit NRF52 最大连接间隔速度(connInterval)
bluefruit NRF52 max connection interval speed (connInterval)
我有一个 Adafruit Bluefruit NRF52 连接到 Adafruit BNO055 9 轴方向传感器,收集 3 个绝对方向轴和 3 个加速度轴(总共 6 个浮点数)并通过 bleuart 通过蓝牙发送。我需要 bleuart 每 7.5 毫秒更新一次新的值行,但是当我 运行 它时,它每秒打印的新值行不会超过 20 行。本质上,我需要尽快更新值,因为我正在测量非常高速、高保真度的运动。
在每一行的开头我也有三位数字,代表IMU上每个传感器的校准状态。每个打印的行看起来像:
303 68.69 4.19 -2.19 -0.12 0.14 -0.40
我目前正在使用最新的 iOs 版本流式传输到我的 iphone,理论上它可以处理 7.5 毫秒的间隔。
我读到一个解决方案可能是缓冲值并以更大的连接间隔发送更大的数据块,但我不确定如何执行此操作。
我的相关Arduino代码如下:
Bluefruit.setConnIntervalMS(7.5, 20);
void loop()
{
imu::Vector<3> accel =
bno.getVector(Adafruit_BNO055::VECTOR_LINEARACCEL);
/* Get a new sensor event */
sensors_event_t event;
bno.getEvent(&event);
/* Display the floating point data */
bleuart.print(event.orientation.x);
bleuart.print("\t");
bleuart.print(event.orientation.y);
bleuart.print("\t");
bleuart.print(event.orientation.z);
bleuart.print("\t");
/* Display the floating point data for Linear Acceleration */
bleuart.print(accel.x());
bleuart.print("\t");
bleuart.print(accel.y());
bleuart.print("\t");
bleuart.print(accel.z());
bleuart.print("\n");
}
iOS 实际上不支持 7.5 毫秒的连接间隔。检查 Apple developer guidelines 中的连接参数部分 (11.6)。仅仅因为您 指定 CI 这么低并不意味着您真的会得到它。在这种情况下,nRF52 是从机,只从主机(您的 phone)请求一个低间隔。主人如果愿意,完全可以无视你的要求
正如您已经避开的那样,您最好缓冲您的数据并通过自定义特征发送它。弄清楚您需要多少字节,也许您可以将几个读数打包到单个 BLE 写入中。如果您真的在吞吐量方面苦苦挣扎,那么您将需要具有多种特征的定制服务。我最近参与了一个项目,该项目通过具有三个特性的 BLE 传输 8 个数据通道(~125Hz/16 位),这接近您可以实现的最大吞吐量。
顺便说一句:通过每秒打印的行数来判断数据吞吐量是一个很大的禁忌。打印功能通常有巨大的开销,并且会以负面的方式极大地影响您测量的吞吐量。
如果我能提供进一步的帮助,请告诉我。
我有一个 Adafruit Bluefruit NRF52 连接到 Adafruit BNO055 9 轴方向传感器,收集 3 个绝对方向轴和 3 个加速度轴(总共 6 个浮点数)并通过 bleuart 通过蓝牙发送。我需要 bleuart 每 7.5 毫秒更新一次新的值行,但是当我 运行 它时,它每秒打印的新值行不会超过 20 行。本质上,我需要尽快更新值,因为我正在测量非常高速、高保真度的运动。
在每一行的开头我也有三位数字,代表IMU上每个传感器的校准状态。每个打印的行看起来像:
303 68.69 4.19 -2.19 -0.12 0.14 -0.40
我目前正在使用最新的 iOs 版本流式传输到我的 iphone,理论上它可以处理 7.5 毫秒的间隔。
我读到一个解决方案可能是缓冲值并以更大的连接间隔发送更大的数据块,但我不确定如何执行此操作。
我的相关Arduino代码如下:
Bluefruit.setConnIntervalMS(7.5, 20);
void loop()
{
imu::Vector<3> accel =
bno.getVector(Adafruit_BNO055::VECTOR_LINEARACCEL);
/* Get a new sensor event */
sensors_event_t event;
bno.getEvent(&event);
/* Display the floating point data */
bleuart.print(event.orientation.x);
bleuart.print("\t");
bleuart.print(event.orientation.y);
bleuart.print("\t");
bleuart.print(event.orientation.z);
bleuart.print("\t");
/* Display the floating point data for Linear Acceleration */
bleuart.print(accel.x());
bleuart.print("\t");
bleuart.print(accel.y());
bleuart.print("\t");
bleuart.print(accel.z());
bleuart.print("\n");
}
iOS 实际上不支持 7.5 毫秒的连接间隔。检查 Apple developer guidelines 中的连接参数部分 (11.6)。仅仅因为您 指定 CI 这么低并不意味着您真的会得到它。在这种情况下,nRF52 是从机,只从主机(您的 phone)请求一个低间隔。主人如果愿意,完全可以无视你的要求
正如您已经避开的那样,您最好缓冲您的数据并通过自定义特征发送它。弄清楚您需要多少字节,也许您可以将几个读数打包到单个 BLE 写入中。如果您真的在吞吐量方面苦苦挣扎,那么您将需要具有多种特征的定制服务。我最近参与了一个项目,该项目通过具有三个特性的 BLE 传输 8 个数据通道(~125Hz/16 位),这接近您可以实现的最大吞吐量。
顺便说一句:通过每秒打印的行数来判断数据吞吐量是一个很大的禁忌。打印功能通常有巨大的开销,并且会以负面的方式极大地影响您测量的吞吐量。
如果我能提供进一步的帮助,请告诉我。