⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
15个职位/ 0个新职位
最后一篇
戴维德
离线
最后一次露面:2年5个月前
加入:2017-11-17 08:35.
缓冲ADC值

你好支持,

我正在工作的DA14580基础套件。
我有一个要求在250ms的间隔内具有大约5ms的高采样率的ADC值,并将其存储在缓冲区中。5ms样本,245ms睡眠等..
我想每秒钟清空缓冲区,以便将它发送到计算机或应用程序。
我已经能够发送ADC数据并实现计时器。

以下是我的问题:

1.如何在缓冲区中存储adc值?每秒钟我想使用memcpy(req->值,(缓冲区与数据),大小)复制所有的数据存储在缓冲区的ble堆栈和发送它与一个传输。

你有任何榜样还是为我提供建议?

2.计时器之间是否有任何优先级。我避免了两次计时器或计时器之间的压缩和回调函数整个程序。

最好的问候,
大卫

设备:
mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
嗨Davidw,

嗨Davidw,

  1. 您可以创建一个具有固定大小的数组,请保留索引并在不同索引下存储数组中的每个值。当它发送通知时,您只需在通知消息中复制整个数组并发送结束。
  2. 我不明白第二个问题,你能再清吗?你的意思是BLE定时器?例如,如果您设置具有相同时间的两个BLE定时器?如果是这种情况,那么将首先执行的回调是首先由软件放置在队列中的计时器。如果您的示例,则会调用:

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.

戴维德
离线
最后一次露面:2年5个月前
加入:2017-11-17 08:35.
嗨MT_Dialog,

嗨MT_Dialog,

感谢您及时的回复。
我通过创建数组来获得它并通过BLE通知发送它。
问题是,我只能传输数据高达20字节(10个adc样本)在一个包。
如何将其增加到300字节?
我知道通知包的限制是20个字节。
是否有可能在一个数据包中发送更高数量的字节?
否则,我想尽可能快地发送10x 20字节数据包到我的电脑/电话。
我知道有处理程序(gattc_cmp_evt)在可以发送下一个数据包时获得响应。
我必须如何以及在哪里实现它?
我使用了ble_pherpheral_示例。

我用两个定时器。一个用于adc的采样率,另一个用于发送所有数据包。
我想知道如果一个定时器可以中断另一个定时器回调函数或如果定时器等待,直到回调函数完成。

谢谢
大卫

mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
嗨Davidw,

嗨Davidw,

论坛上有很多帖子,解释了如何使用通知传输超过20个字节以及在这种情况下操作,请查看以下几个:

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.

感伤
离线
最后一次露面:2年11个月前
加入:2016-11-28 15:55
嘿大卫,

嘿大卫,
如何在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 data = adc_get_sample();
enque_data(数据);
延迟();
}
但是,你如何知道确切的延迟,从而确切采样率?由于Easy_time的单位是MS,因此在此处无法使用。

戴维德
离线
最后一次露面:2年5个月前
加入:2017-11-17 08:35.
嗨mt-dialog,

嗨mt-dialog,

谢谢链接,我研究所有,我想实现传输数据像发送20字节数据包的所有数据。
我知道有GATT_CMP_EVT处理程序谁给我一个反馈,如果一个数据包被发送。但是我该如何实现它呢?
你能给我一个例子我如何使用它?
我可以在我发送数据的函数中这样做吗?

我使用BLE Pheripheral示例以及App_Adcvall_Timer_CB_Handler如示例中。

问候
大卫

mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
嗨Davidw,

嗨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.

戴维德
离线
最后一次露面:2年5个月前
加入:2017-11-17 08:35.
好的,我看到了

好的,我看到这个事件表明了通知已发送,它已经在示例代码中,抱歉该问题。现在我懂了。

“只推送第一个通知,所有后续通知都应该通过CUSTS1_VAL_NTF_CFM的处理推送,..”是什么意思?
如果我用大量数据填充ble缓冲区(例如60字节),只能发送前20个字节。我使用cust1_val_ntf_req。

我想到了BLE堆栈将自动将此复制的数据分为20byte数据包,直到缓冲区为空。
我必须循环创建所有后续通知吗?

你有什么论文或例子可以让我理解这个序列发生了什么吗?

问候
戴维德

mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
嗨Davidw,

嗨Davidw,

如果你通过前一个通知的完整处理器推送通知,你将启动第一个通知,所以你只发送第一个通知,一旦确认到达,你将推送下一个通知。关于发送一个60字节的数组,我已经提示你检查上面的链接,以便了解如何发送超过20字节的数据。的缺省MTU 20字节,所以如果你保持默认的MTU和推60个字节在60个字节长度特征中央第一20字节将只通知你将不得不增加MTU,如果你这样做,其余的L2CAP会照顾和处理数据的分割包20 - 27 - 13,请查看上面提供的链接,并查看论坛上的问题。

谢谢mt_dialog.

戴维德
离线
最后一次露面:2年5个月前
加入:2017-11-17 08:35.
嗨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;
申请- >长度= DEF_CUST1_ADC_VAL_1_CHAR_LEN;
memcpy(req->值,&buffer, DEF_CUST1_ADC_VAL_1_CHAR_LEN);

ke_msg_send(要求的);

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 - > = 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获取值。我认为第一个通知有一个覆盖,因为我不等待第一第一的确认。

关于大卫

mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
嗨Davidw,

嗨Davidw,

上面已经实现的是在同一特征上发送两个通知的说明,一个之后,没有等待从第一个完成完成,因此在发送第一个值之前,您可以在发送数据库的值。您需要做的是发送第一个通知,然后在user_catch_rest_hndl()函数中发送确认。当确认来user_catch_rest_hndl()将执行,并且交换机盒将最终向上达到Custs1_Val_ntf_cfm到相应的特征的值。所以你要做的是,在这种情况下,将第二个通知的代码放置留下,并且在确认第二个通知时第三个通知应该离开等。

谢谢mt_dialog.

戴维德
离线
最后一次露面:2年5个月前
加入:2017-11-17 08:35.
嗨MT_dialog,

嗨MT_dialog,

好的,我得到了它。
我创建了一个函数。它在处理程序中调用并发送下一个通知。
它的工作原理。
现在我会
感谢您的帮助和耐力。

最好的祝愿,

大卫

mt_dialog.
离线
最后一次露面:2个月3周前
职员
加入:2015-06-08 11:34
嗨Davidw,

嗨Davidw,

如果您认为以上答案中有任何一个是有用的,请将其中一个标记为可接受答案。

谢谢mt_dialog.

Gert186.
离线
最后一次露面:1年4个月前
加入:2016-04-21 12:59
你能把完整的代码发给我吗

你能把项目的完整代码发给我吗?

我对此很感兴趣!

Gert186.
离线
最后一次露面:1年4个月前
加入:2016-04-21 12:59
Davidw请帮忙,

Davidw请帮忙,

你能告诉我你在user_catch_rest_hndl()中的函数!

谢谢