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

你好,支持,

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

这些是我的问题:

1.如何将ADC值存储在缓冲区中?每秒我都希望使用memcpy(req->值,(缓冲区使用数据),大小)来将存储在缓冲区中的所有数据复制到BLE堆栈并用一个传输发送。

你能给我一些例子或建议吗?

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

此致,
大卫

设备:
MT_dialog
离线
最后看到:3个月1周前
工作人员
加入: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
离线
最后看到:2年6个月前
加入:2017-11-17 08:35
嗨mt_dialog,

嗨mt_dialog,

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

我使用两个计时器。一个用于ADC的采样率,另一个用于发送所有数据包。
我想知道一个计时器是否可以在其他定时器回调函数中区间中断或者如果定时器等待直到回调函数完成。

谢谢
大卫

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

嗨DavidW,

论坛上有相当多的帖子解释了如何使用通知传输超过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定时器来中断另一个定时器的回调以便执行。

由于MT_dialog

伤感
离线
最后看到:3年6天前
加入:2016-11-28 15:55
嘿,大卫,

嘿,大卫,
如何在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数据= adc_get_sample();
enque_data(数据);
延迟();

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

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

嗨MT-dialog,

谢谢您的链接,我研究了所有,我想实现发送数据,如在大量的20个字节数据包中发送所有数据。
我知道有gatt_cmp_evt处理程序如果发送了一个数据包,请给我一个反馈。但是我如何实施这个?
你能给我举个例子吗?
我可以在我发送数据的功能中吗?

我使用ble外设示例和示例中的app_adcvall_timer_cb_handler。

问候
大卫

MT_dialog
离线
最后看到:3个月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_cfm的处理,如果缓冲区已满,则应按下所有后续通知,然后您将在下次通知消息的空间后立即无法获取确认。

由于MT_dialog

DavidW
离线
最后看到:2年6个月前
加入:2017-11-17 08:35
好的,我看到了这个活动

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

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

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

你有任何纸张或举例,我可以理解这个序列发生了什么吗?

问候
DavidW

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

嗨DavidW,

好吧,如果您通过先前通知的完整处理程序推送通知,则会启动第一个通知,因此您只需发送第一个通知,并一旦确认到达您将推动下一个通知。关于发送60个字节的数组,我已经向您查询了上面的链接,以便了解如何发送20个以上的数据。默认MTU是20个字节,因此如果保留默认MTU并在60字节长度特征中按60个字节,则将仅针对前20个字节通知中央,因此如果您这样做,则必须增加MTU,如果您这样做,则会增加MTU将在20 - 27 - 13的数据包中处理其余的休息并处理数据的分组,请检查上面提供的链接,并在论坛上查看问题。

由于MT_dialog

DavidW
离线
最后看到:2年6个月前
加入: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);

申请- > conhdl = app_env - > conhdl;
申请- >处理= CUST1_IDX_ADC_VAL_1_VAL;
req-> length = def_cust1_adc_val_1_char_len;
memcpy(req->值,&buffer,def_cust1_adc_val_1car_len);

KE_MSG_SEND(REQ);

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-> 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
离线
最后看到:3个月1周前
工作人员
加入:2015-06-08 34
嗨DavidW,

嗨DavidW,

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

由于MT_dialog

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

嗨mt_dialog,

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

最好的祝愿,

大卫

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

嗨DavidW,

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

由于MT_dialog

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

你能发给我这个项目的完整代码!

我很有意思!

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

DAVIDW请帮助,

你能给我看看你在user_catch_rest_hndl()中的函数吗?

谢谢