⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.wsdof.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
15个员额/0个新员额
最后发表
DavidW
离线
最后看到:2年4个月前
加入:2017-11-17 08:35
缓冲adc值

你好,支持,

我正在研究DA14580基本套件。
我有一个要求,取adc值与高采样率约5ms在250ms的间隔,并将它们存储在缓冲区。5ms采样,245ms睡眠等等。
我希望每秒清空缓冲区,以便将其发送到计算机或应用程序。
我已经能够发送ADC数据和实现定时器。

以下是我的问题:

1.如何将adc值存储在缓冲区中?每秒钟我都想使用memcpy(req->value,(buffer with data),size)将buffer中存储的所有数据复制到ble堆栈,并通过一次传输发送。

你有什么例子或建议给我吗?

2.定时器之间是否有优先级。我避免了在两个计时器或计时器和回调函数之间的刷新整个过程。

顺致敬意,
大卫

设备:
MT_dialog
离线
最后看到:1个月1周前
工作人员
加入:2015-06-08 34
嗨DavidW,

嗨DavidW,

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

使用的计时器=应用程序轻松计时器(100,应用程序计时器回调1);
timer_used_2=应用程序_easy_timer(100,应用程序_timer_callback_2);

首先触发的回调是app\u timer\u callback\u 1

由于MT_dialog

DavidW
离线
最后看到:2年4个月前
加入:2017-11-17 08:35
嗨,MT_Dialog,

嗨,MT_Dialog,

谢谢你的快速回复。
我通过创建数组得到它,然后通过ble通知发送它。
问题是,我只能在一个数据包中传输多达20字节(10个adc样本)的数据。
我如何增加到300字节?
我知道一个通知包的限制是20字节。
是否有可能在一个包中发送更高数量的字节?
否则,我想尽快发送10x 20字节的数据包到我的电脑/电话。
我知道有一个处理程序(GATTC_CMP_EVT)在发送下一个包时获得响应。
我必须如何以及在何处实施这一点?
我使用了ble_Pheriferal_的例子。

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

谢谢
大卫

MT_dialog
离线
最后看到:1个月1周前
工作人员
加入:2015-06-08 34
嗨DavidW,

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

关于定时器,如上所述,如果两个定时器同时到期,它们将同时执行,则不存在一个定时器中断另一个定时器的回调以执行的情况。

由于MT_dialog

伤感
离线
最后看到:2年10个月前
加入:2016-11-28 15:55
嘿,大卫,

嘿,大卫,
如何在5ms内实现高采样率?是否重复执行adc_get_sample(),并有如下延迟:
无效收集adc(单位:5ms)(){
adc_init(GP_adc_SE,0,GP_adc_ATTN3X);
adc_启用_通道(adc_通道_P01);
for循环:
Int data = adc_get_sample();
enque_data(数据);
延迟();

但是你怎么知道确切的延迟和采样率呢?因为easy_time的单位是ms,所以这里不能使用。

DavidW
离线
最后看到:2年4个月前
加入:2017-11-17 08:35
嗨MT-dialog,

嗨MT-dialog,

谢谢链接,我研究所有,我想实现传输数据,像发送所有数据在很多20字节的包。
我知道有一个GATT_CMP_EVT处理程序在发送数据包时会给我反馈。但我如何实现这一点?
你能给我举个例子我怎么用这个吗?
我可以在发送数据的函数中执行此操作吗?

我使用ble外设示例和app_adcvall_timer_cb_handler,就像示例中那样。

问候
大卫

MT_dialog
离线
最后看到:1个月1周前
工作人员
加入:2015-06-08 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_CF的处理推送M、 如果缓冲区已满,那么一旦有空间接收下一条通知消息,您将无法得到确认。

由于MT_dialog

DavidW
离线
最后看到:2年4个月前
加入:2017-11-17 08:35
好的,我知道了

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

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

我认为ble堆栈将把这个复制的数据自动分成20字节的包,它将被发送,直到缓冲区是空的。
我必须为创建所有后续通知做循环吗?

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

问候
DavidW

MT_dialog
离线
最后看到:1个月1周前
工作人员
加入:2015-06-08 34
嗨DavidW,

嗨DavidW,

如果通过前一个通知的完整处理程序推送通知,您将启动第一个通知,因此您将只发送第一个通知,一旦确认到达,您将推送下一个通知。关于发送60字节的数组,我建议您检查上面的链接,以了解如何发送超过20字节的数据。默认MTU为20字节,因此,如果您保持默认MTU并以60字节的长度特性推送60字节,则仅会通知中心前20个字节,因此您必须增加MTU,如果这样做,L2CAP将处理其余部分,并以20-27-13的数据包处理数据分段,请检查上面提供的链接,并检查论坛上的问题。

由于MT_dialog

DavidW
离线
最后看到:2年4个月前
加入:2017-11-17 08:35
嗨MT_dialog,

嗨MT_dialog,

对不起,我不明白。我是编程新手,不知道如何实现等待CUST1_VAL_NTF_CFM。在ble_app_外围设备中,我修改了如下代码:

struct custs1_val_ntf_req* req = KE_MSG_ALLOC_DYN(custs1_val_ntf_req,
TASK_CUSTS1,
TASK_APP,
客户1_val_ntf_需求,
定义客户(ADC)值(字符);

申请- > conhdl = app_env - > conhdl;
申请- >处理= CUST1_IDX_ADC_VAL_1_VAL;
req->length=DEF_CUST1_ADC_VAL_1_CHAR_LEN;
memcpy(请求->值和缓冲区,定义客户1\u ADC\u值1\u字符);

发送消息(请求);

struct custs1_val_ntf_req* req_2 = KE_MSG_ALLOC_DYN(custs1_val_ntf_req,
TASK_CUSTS1,
TASK_APP,
客户1_val_ntf_需求,
定义客户(ADC)值(字符);

静态uint16_t sample_2;
样本2=(样本2<=0xffff)?(样本2+1):0;

req_2 - > conhdl = app_env - > conhdl;
req_2 - >处理= CUST1_IDX_ADC_VAL_1_VAL;
需求2->长度=定义客户1 ADC值1字符长度;
memcpy(req_2->值,&sample_2, DEF_CUST1_ADC_VAL_1_CHAR_LEN);

ke_msg_send (req_2);

我只得到sample_2的值。我认为有一个覆盖第一个通知,因为我没有等待第一个确认。

关于大卫

MT_dialog
离线
最后看到:1个月1周前
工作人员
加入:2015-06-08 34
嗨DavidW,

嗨DavidW,

您在上面实现的只是发送两个具有相同特征的通知的指令,一个接一个地发送,而不需要等待第一个通知完成,因此您在发送第一个值之前立即更改数据库的值。您需要做的是发送第一个通知,然后在user_catch_rest_hndl()函数中获取确认。当得到确认时,将执行user_catch_rest_hndl(),并且切换实例将最终得到CUSTS1_VAL_NTF_CFM对应的特征值。在这种情况下,你需要做的是放置代码让第二个通知离开,在第二个通知确认后第三个通知应该离开,以此类推。

由于MT_dialog

DavidW
离线
最后看到:2年4个月前
加入:2017-11-17 08:35
嗨,MT_dialog,

嗨,MT_dialog,

好的,我知道了。
我创建一个函数。它在处理程序中被调用并发送下一个通知。
它起作用了。
现在我将
谢谢你的帮助和耐力。

最好的祝愿,

大卫

MT_dialog
离线
最后看到:1个月1周前
工作人员
加入:2015-06-08 34
嗨DavidW,

嗨DavidW,

如果您发现上述任何答案有用,请将其中一个答案标记为已接受。

由于MT_dialog

gert186
离线
最后看到:1年2个月前
加入:2016-04-21 59
你能给我完整的密码吗

你能给我发送项目的完整代码吗!

我对此很感兴趣!

gert186
离线
最后看到:1年2个月前
加入:2016-04-21 59
DAVIDW请帮助,

DAVIDW请帮助,

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

谢谢