阻止DA14580从控制器接收GATT读写响应的机制

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.wsdof.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
6个员额/ 0个新员额
最后发表
dhrishi
离线
最后看到:3年7个月前
加入:2017-02-10 09:56
阻止DA14580从控制器接收GATT读写响应的机制

你好,

我们有一个外围解决方案,其中DA14580通过UART连接到我们的微控制器。DA14580向控制器查询来自中央的GATT读/写请求的特征值。
我们在user_catch_rest_hndl()中捕获读(ATTS_READ_REQ_IND)和写(GATTC_WRITE_CMD_IND)事件
是否有一种机制,我们可以使用它来阻塞,直到我们通过UART获得控制器对读或写请求的响应,然后从user_catch_rest_hndl()发送响应。

简而言之,我们需要从user_catch_rest_hndl()发送一个读/写请求,并等待响应收到(UART中断),然后从user_catch_rest_hndl()发送响应数据。你能告诉我们怎么做吗?任何指针,例子都会很有帮助。

谢谢,
Hrishikesh

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

嗨dhrishi,

我不太理解用例,你提到580是附加到外部MCU(我认为这是你所说的控制器的意思),控制器提供了特性的值。

  • 作为第一个例子理解你在说什么,让比如ATTS_READ_REQ_IND尽快这将发生580年中央将读取的特征,所以你会得到消息,你想阻止发送确认中央,直到你从外部处理器读取的值吗?你是这个意思吗?
  • 关于GATTC_WRITE_CMD_IND,这将在中央写入指定的特征时触发,所以您希望在发送确认之前阻塞(如果外设需要确认,因为有写不需要响应)?

那么,上面的场景描述了你想要做的事情吗?

由于MT_dialog

dhrishi
离线
最后看到:3年7个月前
加入:2017-02-10 09:56
是的。完全正确。这是正确的。

是的。完全正确。这是正确的。
我们怎么做呢

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

嗨dhrishi,

没有例子,你正在做什么,因为数据库的值是保持在内部数据库的580,我也不太确定块,你提到,因为一旦你得到指示(一个中心已经读或写了一个特征),SDK就会报告给应用程序,这取决于你要做什么。据我所知,关于你想要做什么,BLE规范中使用的大多数命令都是顺序的,这意味着大多数的命令(包括读请求和写请求)当中央他们应该出具确认外围这意味着中央无能为力发送一个额外的请求如果多恩得不到回应前面的命令(这请求/响应计划就像一个祝福的流控制协议实现)。所以你可以读或写请求的指示,抓住他们的catch_rest功能,开始你的UART事务,中央不会发出任何额外的请求,直到你发送一条确认消息,所以一旦你的UART事务完成可以发送确认链接的另一边。还请注意,并不是所有的命令按照请求/响应计划,例如写命令无响应(写)将触发你的迹象但是中央不会等待响应,它仍然可以发出一个额外的命令在处理之前,需要一个额外的流量控制方案。

因此,根据上述情况,当出现写指示时,可以通过UART进行写入,当来自中央的读指示时,可以从UART进行读取。关于从UART发送你已经阅读的价值,我在另一篇文章提到过你不能直接发送你通过UART的价值但是你必须设置内部数据库中的值一旦你有阅读提示,然后发送的确认阅读。因此,在读取接收时,触发UART事务调用attmdb_att_set_value(),以便在数据库中设置值,然后dg_atts_read_cfm()发送值。

另外,请注意,当您从UART读取数据时,您必须保持清醒,因此为了使用XTAL16,不能睡觉。

由于MT_dialog

dhrishi
离线
最后看到:3年7个月前
加入:2017-02-10 09:56
我已经有了attmdb_att

在我的实现中已经有了attmdb_att_set_value()和dg_atts_read_cfm()。我关心的是,当在user_catch_rest_hndl()中接收到ATTS_READ_REQ_IND时,我必须首先通过UART向外部MCU发送请求以获得该特征的值,并在接收数据时调用上述两个函数。对吧?

现在,来自外部MCU的UART响应将来自中断上下文。因此,我如何使user_catch_rest_hndl()中的当前执行线程等待,直到从外部MCU接收到适当的响应。否则它将通过调用上面两个带有垃圾/不正确值的函数返回,并且对中央的读响应将是不正确的。

简而言之,我们应该等待从UART(从中断上下文)的响应被接收并保存在GATT数据库中,然后发送读确认。

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

嗨dhrishi,

是的,这就是我所想的,得到指示,启动UART事务,得到数据,并发送由UART获得的值的确认。

580不是一个基于线程的系统,它只是有一个调度程序,每当rwip_schedule()函数从主循环运行时,调度消息并执行相应的回调。所以你可以试试是什么,一旦你得到阅读指示,启动UART事务或设置的UART接收数据从外部单片机(这取决于你的实现和交互将如何),要么离开catch_rest处理程序(通过设置一个读取中断)或呆在那里(执行UART transastion,在这种情况下,你不能停留在你想要执行UART事务,因为你会开始丢失BLE事件,最终你会断开连接,因为你不会执行调度函数,因为你不会通过主循环),只要交互完成。当UART中断到达或事务完成时,只需向客户端发送确认消息。

由于MT_dialog