您好,支持,
我正在研究DA14580基本套件。
我要求在250ms的间隔内以大约5ms的高采样率采集adc值,并将其存储在缓冲区中。5ms采样、245ms睡眠等等。。
我希望每秒清空缓冲区,以将其发送到计算机或应用程序。
我已经能够发送ADC数据并实现计时器。
这些是我的问题:
1.如何将ADC值存储在缓冲区中?每秒我都希望使用memcpy(req->值,(缓冲区使用数据),大小)来将存储在缓冲区中的所有数据复制到BLE堆栈并用一个传输发送。
你有什么例子或建议给我吗?
2.定时器之间是否有优先级。我避免了在两个计时器或计时器和回调函数之间的刷新整个过程。
此致,
大卫
设备:
嗨,大卫,
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,
谢谢你的快速回复。
我通过创建数组获得它,并通过ble通知发送它。
问题是,我只能在一个数据包中传输高达20字节(10个ADC样本)的数据。
如何将其增加到300字节?
我知道通知数据包的20字节是20字节。
是否有可能在一个数据包中发送更多字节?
否则,我希望尽可能快地将10x20字节的数据包发送到我的计算机/手机。
我知道有一个处理程序(GATTC_CMP_EVT)可以在下一个数据包可以发送时获得响应。
我如何以及在哪里实施这一点?
我使用ble_pheripheral_example。
我使用两个计时器。一个用于ADC的采样率,另一个用于发送所有数据包。
我想知道一个计时器是否可以在其他定时器回调函数中区间中断或者如果定时器等待直到回调函数完成。
谢谢
大卫
嗨,大卫,
论坛上有相当多的帖子解释了如何使用通知传输超过20个字节,以及BLE在这种情况下是如何运行的。请查看以下几条:
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定时器来中断另一个定时器的回调以便执行。
谢谢你的对话
嘿,大卫,
如何在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_数据(数据);
延迟();
}
但是你怎么知道准确的延迟和准确的采样率呢?因为easy_time的单位是ms,所以这里不能使用它。
嗨,MT对话,
谢谢您的链接,我研究了所有,我想实现发送数据,如在大量的20个字节数据包中发送所有数据。
我知道有gatt_cmp_evt处理程序如果发送了一个数据包,请给我一个反馈。但是我如何实施这个?
你能给我举个例子,我怎么用这个吗?
我可以在我发送数据的功能中吗?
我使用了ble-PheriPeral示例,以及示例中的app_adcvall_timer_cb_处理程序。
当做
大卫
嗨,大卫,
你是什么意思如何实现这一点,每当您使用custs1_val_ntf_req发送通知时,您将获得一个gattc_cmp_evt(实际上是通过使用custs1个人资料,您将获得custs1_val_ntf_cfm消息,因为配置文件处理gattc_cmp_evt并发送回来一个custs1_val_ntf_cfm),表示通知是发送缓冲区,并在接收此类完成事件后立即将下一个连接间隔留下,然后您可以将下一个通知推向堆栈。只需按下第一个通知,应通过处理Custs1_val_ntf_cfm的处理,如果缓冲区已满,则应按下所有后续通知,然后您将在下次通知消息的空间后立即无法获取确认。
谢谢你的对话
好的,我看到事件表明通知已发送,并且已经在示例代码中,很抱歉这个问题。现在我明白了。
你的意思是:“只需推动第一个通知,所有后续通知都应该通过处理Custs1_val_ntf_cfm,”
如果我用我的大数据数组(例如60字节)填充ble缓冲区,则只发送前20个字节。
我认为ble堆栈会自动将复制的数据分成20字节的数据包,然后发送到缓冲区为空为止。
我是否必须循环创建所有后续通知?
你有任何纸张或举例,我可以理解这个序列发生了什么吗?
当做
戴维德
嗨,大卫,
好吧,如果您通过先前通知的完整处理程序推送通知,则会启动第一个通知,因此您只需发送第一个通知,并一旦确认到达您将推动下一个通知。关于发送60个字节的数组,我已经向您查询了上面的链接,以便了解如何发送20个以上的数据。默认MTU是20个字节,因此如果保留默认MTU并在60字节长度特征中按60个字节,则将仅针对前20个字节通知中央,因此如果您这样做,则必须增加MTU,如果您这样做,则会增加MTU将在20 - 27 - 13的数据包中处理其余的休息并处理数据的分组,请检查上面提供的链接,并在论坛上查看问题。
谢谢你的对话
嗨,MT_dialog,
对不起,我不明白。我是新的编程,我不明白我如何实现等待Cust1_Val_ntf_cfm。在ble_app_peripheral中,我修改了这样的代码:
结构custs1\u val\u ntf\u req*req=KE_MSG\u ALLOC\u DYN(custs1\u val\u ntf\u req,
任务1,
任务应用程序,
custs1_val_ntf_req,
def_cust1_adc_val_1_char_len);
req->conhdl=app\U env->conhdl;
req->handle=CUST1\u IDX\u ADC\u VAL\u 1\u VAL;
req-> length = def_cust1_adc_val_1_char_len;
memcpy(req->值,&buffer,def_cust1_adc_val_1car_len);
KE_MSG_SEND(REQ);
结构custs1_val_ntf_req*req_2=KE_MSG_ALLOC_DYN(custs1_val_ntf_req,
任务1,
任务应用程序,
custs1_val_ntf_req,
def_cust1_adc_val_1_char_len);
静态uint16样本2;
sample_2 =(Sample_2 <= 0xFFFF)?(Sample_2 + 1):0;
需求2->conhdl=app\U env->conhdl;
请求2->handle=CUST1\u IDX\u ADC\u VAL\u 1\u VAL;
req_2-> length = def_cust1_adc_val_1_char_len;
memcpy(请求->值和样本2,定义客户1\u ADC\u值1\u字符);
发送消息(请求2);
我只从示例_2中获取值。我认为第一个通知会被覆盖,因为我不会等待第一个通知的确认。
问候大卫
嗨,大卫,
您上面实现的只是关于发送两个相同特性的通知的指令,一个接一个地发送,而不必等待第一个通知的完成,因此您可以在发送第一个值之前立即更改数据库的值ser_catch_rest_hndl()函数来获取确认。当确认到来时,用户_catch_rest_hndl()将执行,并且切换案例将以CUSTS1_VAL_NTF_CFM为结束,以对应的特征值为结束。因此,在这种情况下,您需要做的是为第二个通知留下代码,在确认第二个通知后,第三个通知应该留下,依此类推。
谢谢你的对话
嗨mt_dialog,
好的,我知道了。
我创建了一个函数,在处理程序中调用它并发送下一个通知。
有用。
现在我会的
谢谢你的帮助和耐心。
最好的祝愿,
大卫
嗨,大卫,
如果您发现上述任何答案有用,请将其中一个答案标记为已接受。
谢谢你的对话
你能发给我这个项目的完整代码!
我很有意思!
大卫,请帮忙,
你能给我看看你在user\u catch\u rest\u hndl()中的函数吗!
谢谢