你好,支持,
我正在工作的DA14580基础套件。
我有一个要求取adc值的高采样率约5ms在250ms的间隔和存储在缓冲区。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个字节。
是否有可能在一个包中发送更高的字节数?
否则,我将尽可能快地发送10x 20字节的数据包到我的电脑/手机。
我知道有处理程序(GATTC_CMP_EVT)获得响应时,下一个包可以发送。
我必须如何以及在哪里实现它?
我使用了ble_pherpheral_示例。
我用两个定时器。一个用于adc的采样率,另一个用于发送所有数据包。
我想知道如果一个定时器可以中断另一个定时器回调函数或如果定时器等待,直到回调函数完成。
谢谢
大卫
嗨DavidW,
论坛上有相当多的帖子解释了如何使用通知传输超过20个字节,以及BLE在这种情况下是如何操作的,请检查下面的几个:
https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl..。
https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl..。
https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bl..。
关于计时器,如上所述,如果两个计时器同时到期,它们将同时执行,不存在这样的情况,即一个BLE计时器为了执行而中断另一个计时器的回调。
由于MT_dialog
嘿,大卫,
如何在5ms内实现高采样率?你是否重复执行adc_get_sample()带有一些延迟:
空白collect_adc_in_5ms () {
adc_init (GP_ADC_SE 0 GP_ADC_ATTN3X);
adc_enable_channel (ADC_CHANNEL_P01);
for循环:
Int数据= adc_get_sample();
enque_data(数据);
延迟();
}
但是你怎么知道确切的延迟,从而知道确切的采样率呢?因为easy_time的单位是ms,所以不能在这里使用。
嗨MT-dialog,
谢谢链接,我研究所有,我想实现传输数据像发送20字节数据包的所有数据。
我知道有GATT_CMP_EVT处理程序谁给我一个反馈,如果一个数据包被发送。但是我该如何实现它呢?
你能给我举个例子吗?
我可以在我发送数据的函数中这样做吗?
我使用ble外设示例和示例中的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堆栈将自动将这些复制的数据分成20字节的数据包,并将发送直到缓冲区是空的。
我必须创建所有的后续通知循环吗?
你有什么论文或例子可以让我理解这个序列发生了什么吗?
问候
DavidW
嗨DavidW,
如果你通过前一个通知的完整处理器推送通知,你将启动第一个通知,所以你只发送第一个通知,一旦确认到达,你将推送下一个通知。关于发送一个60字节的数组,我已经提示你检查上面的链接,以便了解如何发送超过20字节的数据。的缺省MTU 20字节,所以如果你保持默认的MTU和推60个字节在60个字节长度特征中央第一20字节将只通知你将不得不增加MTU,如果你这样做,其余的L2CAP会照顾和处理数据的分割包20 - 27 - 13,请查看上面提供的链接,并查看论坛上的问题。
由于MT_dialog
嗨MT_dialog,
对不起,我没听懂。我在编程方面是新手,我不明白我如何能够实现CUST1_VAL_NTF_CFM的等待。在ble_app_peripheral中,我这样修改了代码:
struct custs1_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);
申请- > conhdl = app_env - > conhdl;
申请- >处理= CUST1_IDX_ADC_VAL_1_VAL;
申请- >长度= DEF_CUST1_ADC_VAL_1_CHAR_LEN;
memcpy(req->值,&buffer, DEF_CUST1_ADC_VAL_1_CHAR_LEN);
ke_msg_send(要求的);
struct custs1_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 - >处理= CUST1_IDX_ADC_VAL_1_VAL;
req_2 - > = DEF_CUST1_ADC_VAL_1_CHAR_LEN长度;
memcpy(req_2->值,&sample_2, DEF_CUST1_ADC_VAL_1_CHAR_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()中的函数吗?
谢谢