This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/LAUNCHXL-CC2650:心率项目-心率控制点-写入/更改特性值

Guru**** 2587345 points
Other Parts Discussed in Thread: CC2650

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/595244/rtos-launchxl-cc2650-heart-rate-project---heart-rate-control-point---write-change-characteristic-value

器件型号:LAUNCHXL-CC2650
Thread 中讨论的其他器件:CC2650

工具/软件:TI-RTOS

大家好、

我正在研究心率项目、我已经修改了该项目以支持发送(通知) 20字节数据包、并进行了修改以使其正常工作。

接下来、我 想在 cc26xx 和我的 Android 应用之间建立双向通信。 所以、我正在修改心率控制点特征、它看起来是"有效"的。 我从 CC2650修改的代码如下:

静态 bStatus_t 传闻证据_WriteAttrCB (uint16_t connHandle、
gattAttribute_t *pAttr、uint8_t *pValue、
uint16_t len、uint16_t offset、
uint8_t 方法)
{
bStatus_t status = Success;
uint16 uuid = build_uint16 (pAttr->type.uuuuid[0]、pAttr->type.uuuuid[1]);
switch (uuid)
{
案例传闻_CTRL_PT_UUID:
如果(偏移> 0)
{
状态= ATT_ERR_ATTR_NOT _long;
}
其他
{
*(pAttr->pValue)= pValue[0];
(*心跳服务 CB)(耳戴式命令集);

/*使用接收到的命令输入*/

}
中断; 

我的目标是在收到来自 Android 应用的输入后、它将执行一些预定义的任务。 例如、0表示切换 LED ... 现在、我希望它通过添加以下内容来通知接收到的数据:

*(pAttr->pValue)= pValue[0];
(*心跳服务 CB)(耳戴式命令集);

//返回值*(pAttr->pValue)
attHandleValueNoti_t 心跳评估;
心跳速率测量值.pValue = GATT_BM_alloc (connHandle、ATT_Handle_Value_Noti、
20、NULL);
char buf[12];
sprintf (buf、"CC2650 received:%d"、*(pAttr->pValue));
bedRateMeas len = 20;
betRateMeas .pValue[0]= 1;
int 计数器= 0;int i;
for (i = 1;i <= strlen (buf);++I、++counter){
butRateMeas .pValue[i]= buf[计数器];
}
if (HeartRate_MeasNotify (connHandle、&centerRateMeas)!=成功)
{
GATT_BM_FREE (((gattMsg_t *)&心跳 速率测量、ATT_Handle_value_Noti);
} 

但是、当应用程序执行这些代码行时、它会崩溃和/或断开连接。 为什么? 我使用非常类似的方法为函数 HeartRate_MeasNotify 发送20字节 int/string 数据包。

最棒的

Henry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Henry、

    耳戴式编写器 WriteAttrCB 在栈上下文中执行,不建议调用 sprintf()等高级函数。

    我建议捕获回调中的值、然后将其均衡到应用程序的消息队列中以供进一步处理。

    请参阅软件开发人员指南第5.3.4.2.3节
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sean、

    在结束本主题之前、我有最后一个问题。

    我能够从 Android 应用程序的 HeartRate_心跳 评估函数中获取通过 BLE 发送的值  

    静态空 HeartRate_心跳 事件(uint8_t 事件)
    {
    ...
    否则、如果(事件=耳戴式命令集)
    {
    uint8_t newValue;
    HEARTATE_GetParameter (HEARTATE_COMMAND_SET、newValue);
    char str [11]="已收到!\0";
    //处理接收到的值
    耳戴式措施通知(str);
    }
    

    在我的 Android 应用程序中、我可以接收软件发回的文本(已收到!)。 但是、当我尝试使用 sprintf 并将我的字符串与接收的数字连在一起时、应用程序会冻结、然后从 BLE 连接断开。 当我使用 System_printf 时也会发生同样的情况。

    但是、当我尝试延迟 CPU 时、在我获取新值并发送字符串"received"后、连接仍保持、我能够从 Android 发送另一个输入命令。

    #define FakeBlockingSlowWork() CPUdelay (12e6) 

    我不认为 System_printf 或 sprintf 会比该延迟花费更多的时间/功率、但为什么以及在使用 sprintf 或 System_printf 时会中断短连接?  

    非常感谢、

    Henry