你好支持,
我正在研究DA14580基本套件。
我有一个要求在250ms的间隔内具有大约5ms的高采样率的ADC值,并将其存储在缓冲区中。5ms样本,245ms睡眠等..
我希望每秒清空缓冲区,以将其发送到计算机或应用程序。
我已经能够发送ADC数据并实现计时器。
这些是我的问题:
1.如何将ADC值存储在缓冲区中?每秒我都希望使用memcpy(req->值,(缓冲区使用数据),大小)来将存储在缓冲区中的所有数据复制到BLE堆栈并用一个传输发送。
你有任何榜样还是为我提供建议?
2.计时器之间是否有任何优先级。我避免了两次计时器或计时器之间的压缩和回调函数整个程序。
此致,
大卫
设备:
嗨Davidw,
timer_used = app_easy_timer(100,app_timer_callback_1);
timer_used_2 = app_easy_timer(100,app_timer_callback_2);
将首先触发的回调是app_timer_callback_1
谢谢mt_dialog.
嗨mt_dialog,
感谢您及时的回复。
我通过创建数组来获得它并通过BLE通知发送它。
问题是,我只能在一个数据包中传输高达20字节(10个ADC样本)的数据。
如何将其增加到300字节?
我知道通知数据包的20字节是20字节。
是否有可能在一个数据包中发送更高数量的字节?
否则,我想尽可能快地发送10x 20字节数据包到我的电脑/电话。
我知道有处理程序(gattc_cmp_evt)在可以发送下一个数据包时获得响应。
我如何以及在哪里实施这一点?
我使用ble_pheripheral_example。
我使用两个计时器。一个用于ADC的采样率,另一个用于发送所有数据包。
我想知道一个计时器是否可以在其他定时器回调函数中区间中断或者如果定时器等待直到回调函数完成。
谢谢
大卫
嗨Davidw,
论坛上有很多帖子,解释了如何使用通知传输超过20个字节以及在这种情况下操作,请查看以下几个:
https://support.dialog-semicondiondiondum/forums/post/dialog-smartbond-bl ...
https://support.dialog-semicondiondiondum/forums/post/dialog-smartbond-bl ...
https://support.dialog-semicondiondiondum/forums/post/dialog-smartbond-bl ...
关于定时器,如上所述,如果两个定时器同时过期,则它们都会执行,则不存在一个BLE定时器来中断另一个定时器的回调以便执行。
谢谢mt_dialog.
嘿大卫,
如何在5ms中实现高采样率?您是否重复执行adc_get_sample(),延迟:
void collect_adc_in_5ms(){
adc_init(gp_adc_se,0,gp_adc_attn3x);
adc_enable_channel(adc_channel_p01);
对于循环:
int data = adc_get_sample();
enque_data(数据);
延迟();
}
但是,你如何知道确切的延迟,从而确切采样率?由于Easy_time的单位是MS,因此在此处无法使用。
嗨mt-dialog,
谢谢您的链接,我研究了所有,我想实现发送数据,如在大量的20个字节数据包中发送所有数据。
我知道有gatt_cmp_evt处理程序如果发送了一个数据包,请给我一个反馈。但是我如何实施这个?
你能给我一个例子我如何使用它?
我可以在我发送数据的功能中吗?
我使用BLE Pheripheral示例以及App_Adcvall_Timer_CB_Handler如示例中。
问候
大卫
嗨Davidw,
你是什么意思如何实现这一点,每当您使用custs1_val_ntf_req发送通知时,您将获得一个gattc_cmp_evt(实际上是通过使用custs1个人资料,您将获得custs1_val_ntf_cfm消息,因为配置文件处理gattc_cmp_evt并发送回来一个custs1_val_ntf_cfm),表示通知是发送缓冲区,并在接收此类完成事件后立即将下一个连接间隔留下,然后您可以将下一个通知推向堆栈。只需按下第一个通知,应通过处理Custs1_val_ntf_cfm的处理,如果缓冲区已满,则应按下所有后续通知,然后您将在下次通知消息的空间后立即无法获取确认。
谢谢mt_dialog.
好的,我看到这个事件表明了通知已发送,它已经在示例代码中,抱歉该问题。现在我懂了。
你的意思是:“只需推动第一个通知,所有后续通知都应该通过处理Custs1_val_ntf_cfm,”
如果我用大量数据填充ble缓冲区(例如60字节),只能发送前20个字节。我使用cust1_val_ntf_req。
我想到了BLE堆栈将自动将此复制的数据分为20byte数据包,直到缓冲区为空。
我必须循环创建所有后续通知吗?
你有任何纸张或举例,我可以理解这个序列发生了什么吗?
问候
戴维德
嗨Davidw,
好吧,如果您通过先前通知的完整处理程序推送通知,则会启动第一个通知,因此您只需发送第一个通知,并一旦确认到达您将推动下一个通知。关于发送60个字节的数组,我已经向您查询了上面的链接,以便了解如何发送20个以上的数据。默认MTU是20个字节,因此如果保留默认MTU并在60字节长度特征中按60个字节,则将仅针对前20个字节通知中央,因此如果您这样做,则必须增加MTU,如果您这样做,则会增加MTU将在20 - 27 - 13的数据包中处理其余的休息并处理数据的分组,请检查上面提供的链接,并在论坛上查看问题。
谢谢mt_dialog.
嗨mt_dialog,
对不起,我不明白。我是新的编程,我不明白我如何实现等待Cust1_Val_ntf_cfm。在ble_app_peripheral中,我修改了这样的代码:
struct musts1_val_ntf_req * req = ke_msg_alloc_dyn(custs1_val_ntf_req,
task_custs1,
task_app,
custs1_val_ntf_req,
def_cust1_adc_val_1_char_len);
req-> conhdl = app_env-> conhdl;
req-> handle = cust1_idx_adc_val_1_val;
req-> length = def_cust1_adc_val_1_char_len;
memcpy(req->值,&buffer,def_cust1_adc_val_1car_len);
KE_MSG_SEND(REQ);
struct susts1_val_ntf_req * req_2 = ke_msg_alloc_dyn(custs1_val_ntf_req,
task_custs1,
task_app,
custs1_val_ntf_req,
def_cust1_adc_val_1_char_len);
静态uint16_t sample_2;
sample_2 =(Sample_2 <= 0xFFFF)?(Sample_2 + 1):0;
req_2-> conhdl = app_env-> conhdl;
req_2-> handle = cust1_idx_adc_val_1_val;
req_2-> length = def_cust1_adc_val_1_char_len;
memcpy(req_2->值,&sample_2,def_cust1_adc_val_1car_len);
ke_msg_send(req_2);
我只能从Sample_2获取值。我认为第一个通知有一个覆盖,因为我不等待第一第一的确认。
关于大卫
嗨Davidw,
上面已经实现的是在同一特征上发送两个通知的说明,一个之后,没有等待从第一个完成完成,因此在发送第一个值之前,您可以在发送数据库的值。您需要做的是发送第一个通知,然后在user_catch_rest_hndl()函数中发送确认。当确认来user_catch_rest_hndl()将执行,并且交换机盒将最终向上达到Custs1_Val_ntf_cfm到相应的特征的值。所以你要做的是,在这种情况下,将第二个通知的代码放置留下,并且在确认第二个通知时第三个通知应该离开等。
谢谢mt_dialog.
嗨mt_dialog,
好的,我得到了它。
我创建了一个函数。它在处理程序中调用并发送下一个通知。
有用。
现在我会
感谢您的帮助和耐力。
最好的祝愿,
大卫
嗨Davidw,
如果您发现上述任何答案有用,请将其中一个答案标记为已接受。
谢谢mt_dialog.
你能发给我这个项目的完整代码!
我很有意思!
Davidw请帮忙,
你能告诉我你在user_catch_rest_hndl()中的函数!
谢谢