你好,
我正在开发一个通过ble传输加速度计测量值的项目。我已经成功地传输了它们,当它们只是读取特征时,作为下一步,我希望它们被通知,以便您可以获得智能手机的更新。我根据ble_Peripheral示例中的adc1特性进行了计算。
我首先尝试使用第一个特征(x轴特征),一旦订阅它就加载一个值,然后不再发送另一个值。
我使用了浅蓝色的android应用程序来检查特征。
也许我错过了一个需要配置的设置,以便在cccd被写入描述符后发送更新?
我已经附上了部分源文件,我认为对你们有用的检查。
你也可以在这里找到我的完整源代码项目:
https://drive.google.com/open?id=1u4KLQE1cd2xDbppyyhiDjL2lnfaqtZ09
提前谢谢
设备:
嗨,科斯塔,
让我检查一下你的项目,我会给你回复的。您是否在移动应用程序中启用了通知?作为第一步,我建议您尝试发送原始值作为ADC示例,而不是加速计的数据。您希望通过BLE发送多少数据?
此外,我强烈建议您看看DA14585/6产品和我们最新的SDK6。对于这些产品,我们实现了一个软件示例,它读取I2C上的传感器值,并通过通知发雷电竞官网登录送它们。除了这个例子之外,我们还有大量的软件示例,这些示例对入门非常有用。请查看以下链接:
谢谢,PM_Dialog
你好,
我已经有了DA14580 pro的开发工具包,所以我想继续。我查看了DA14585/6的示例,看看他们是否可以帮助我开发DA14580,但事实并非如此。
我要传输的传感器数据是12位值(由一个寄存器的8位和第二个寄存器的4位组成)。
在查看手册UM-B-050之后,我注意到您必须写入控制点以启用通知以及adc1使用的计时器,我能请您解释一下这是如何发生的,特别是如何启用通知吗?
嗨,科斯塔,
控制点特性用于SDK的ble_app_peripheral示例。当一个值被写入控制点特征时,会触发user_custs1_ctrl_wr_ind_handler()。因此,如果该值为1,则app_adcval1_timer_cb_handler将在APP_PERIPHERAL_CTRL_TIMER_DELAY触发。app_adcval1_timer_cb_handler模拟ADC采样,如果您检查这个函数的源代码,您将看到“sample”值在每个APP_PERIPHERAL_CTRL_TIMER_DELAY周期增加。“样本”将通过通知发送到对等设备。但是,对等端需要通知操作。我检查了你的代码,我可以看到你没有使用控制点特征。所以,你必须通过你正在使用的移动应用程序启用通知。
谢谢,PM_Dialog
你好,
我在使用LightBlue应用程序就像在教程中一样。在按下应用上的订阅按钮后,一个值会被发送过来,cccd也会被写入所以我假设从移动端启用了通知。我需要做些什么来启用它们吗?
在链接中,你会看到一张照片。
https://drive.google.com/file/d/1RJGA8gjJRAEbly63jSUAcf13y69hWyXG/view?usp=sharing
谢谢你!
嗨,科斯塔,
在user_catch_rest_hndl中,您正在处理CUSTS1_VAL_WRITE_IND消息,因此如果我能够正确理解,您可以在特征中写入一些内容,以触发user_CUSTS1_accel_x_cfg_IND_handler()?您能否在调试模式下运行代码,并在user_custs1_accel_x_cfg_ind_handler()中添加断点?断点命中了吗?
谢谢,PM_Dialog
你好,
断点点击并停止代码,如图所示。
老实说,我不确定是否需要编写任何内容来触发该处理程序,我的印象是,为了启用通知,需要编写描述符写入(cccd)。
在我的应用程序中,我希望它在写入描述符后立即开始通知,并在特征从传感器获取数据时继续发送数据,直到断开连接。这是否意味着我不需要CUST1\u VAL\u WRITE\u IND结构?
https://drive.google.com/drive/u/0/folders/1A7NlyWUAD-jKNcAVlQ9iZtdjmmQ9ljI7
嗨,科斯塔,
很抱歉,我无法在调试模式下运行您的代码,因为我没有加速计,而且我有一个NMI。当执行user_custs1_accel_x_cfg_ind_处理程序时,将根据您的代码触发app_accel_x_ntf_req_处理程序。因此,在这个函数中,您从传感器读取数据,通过通知发送第一个数据,并启动计时器,以便在APP_PERIPHERAL_CTRL_timer_DELAY之后再次读取。在这一点上,让我问你一件事。在app_easy_timer的回调函数中,为什么有app_accel_x_set_处理程序而没有app_accel_x_ntf_req_处理程序?请检查ble_app_外围示例的app_adcval1_timer_cb_处理程序。你能把你和我共享的链接重新发送给我吗?因为我没有访问权限?
谢谢,PM_Dialog
你好,
您的建议让我认为,可能是set处理程序和ntf处理程序混淆了程序,在完全注释掉accel_x_set_handler并只留下ntf处理程序之后,它工作了!我成功地读取了特征后的值。
非常感谢。
然而,我确实遇到了另一个问题。在发送了一些值之后的一段时间,我在arch_system.c文件中得到了一个wrap_platform_reset错误(我在下面的链接中有一个调试的屏幕截图)。这是什么?是什么原因造成的?(是否有可能是发送的结果值?)
https://drive.google.com/file/d/1yWSYWH0vNBYa7Y1ZxgoI51rMmpZV6Zo2/view?usp=sharing
谢谢
嗨,科斯塔,
很高兴你解决了你的问题,谢谢你接受我的回答。wrap_platform_reset是由于内存不足。在您的应用程序中,可能会在每次连接后出现某种内存泄漏堆积。当wrap_platform_reset()发生时,请确保错误代码是RESET_MEM_ALLOC_FAIL,您必须调试它才能找到它。此外,检查是否有任何未决消息,你已经发送在加速计的读取,并确保你正在消费的消息,你得到时,消息被处理或如果你正在分配数据,他们应该被释放。举个例子,如果你得到数据从传感器和分配信息以发送数据通知尽快有一个连接设备最终会耗尽内存,如果设备运行耗尽内存,这将导致设备重置。尝试从da1458x_config_advanced定义并增加DB_HEAP_SZ,例如,您可以将值设置为2048。另外,您可以将APP_PERIPHERAL_CTRL_TIMER_DELAY更改为更大的延迟。
谢谢,PM_Dialog