⚠️
大家好. .谢谢你来参加论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,并包含在Dialog主网站中。所有的帖子和账户都已迁移。我们现在只接受新论坛的流量-请张贴任何新的线程//www.wsdof.com/support.我们将在未来几天修复漏洞/优化搜索和标签。
15个岗位/ 0个新岗位
最后发表
DavidW
离线
最后看到:3年7个月前
加入:2017-11-17 08:35
缓冲adc值

你好,支持,

我正在DA14580基本工具包上工作。
我有一个要求,在250ms的间隔内,以大约5ms的高采样率取adc值,并将它们存储在缓冲区中。5ms采样,245ms睡眠等等。
我想每秒钟清空缓冲区,把它发送到电脑或应用程序。
我已经能够发送ADC数据和实现定时器。

这些是我的问题:

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

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

2.计时器之间是否有优先级。我避免了两个定时器或定时器和回调函数之间的冲突。

最好的问候,
大卫

设备:
MT_dialog
离线
最后看到:1年4个月前
工作人员
加入:2015-06-08 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

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

嗨MT_Dialog,

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

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

谢谢
大卫

MT_dialog
离线
最后看到:1年4个月前
工作人员
加入: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..。

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

由于MT_dialog

伤感
离线
最后看到:4年1个月前
加入: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,所以这里不能使用它。

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

嗨MT-dialog,

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

我使用了ble pheripheral的例子和app_adcvall_timer_cb_handler的例子。

问候
大卫

MT_dialog
离线
最后看到:1年4个月前
工作人员
加入: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_CFM的处理来推送,如果缓冲区已满,那么只要有空间容纳下一个通知消息,您就不会得到确认。

由于MT_dialog

DavidW
离线
最后看到:3年7个月前
加入:2017-11-17 08:35
好吧,我看到了

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

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

我以为ble堆栈会自动将复制的数据分成20字节的数据包,直到缓冲区空了为止。
我必须使循环创建所有后续通知?

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

问候
DavidW

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

嗨DavidW,

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

由于MT_dialog

DavidW
离线
最后看到:3年7个月前
加入:2017-11-17 08:35
嗨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);

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_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 <= 0xffff) ?(sample2 + 1): 0;

Req_2 ->conhdl = app_env->conhdl;
req_2->句柄= 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_1_CHAR_LEN);

ke_msg_send (req_2);

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

关于大卫

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

嗨DavidW,

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

由于MT_dialog

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

嗨MT_dialog,

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

最好的祝愿,

大卫

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

嗨DavidW,

如果你认为以上任何答案有用,请标记其中一个答案为接受。

由于MT_dialog

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

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

我对此很感兴趣!

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

请帮帮我,

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

谢谢