你好,
我们有一个外围解决方案,其中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
设备:

嗨dhrishi,
我不太理解用例,你提到580是附加到外部MCU(我认为这是你所说的控制器的意思),控制器提供了特性的值。
那么,上面的场景描述了你想要做的事情吗?
由于MT_dialog
是的。完全正确。这是正确的。
我们怎么做呢
嗨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
在我的实现中已经有了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数据库中,然后发送读确认。
嗨dhrishi,
是的,这就是我所想的,得到指示,启动UART事务,得到数据,并发送由UART获得的值的确认。
580不是一个基于线程的系统,它只是有一个调度程序,每当rwip_schedule()函数从主循环运行时,调度消息并执行相应的回调。所以你可以试试是什么,一旦你得到阅读指示,启动UART事务或设置的UART接收数据从外部单片机(这取决于你的实现和交互将如何),要么离开catch_rest处理程序(通过设置一个读取中断)或呆在那里(执行UART transastion,在这种情况下,你不能停留在你想要执行UART事务,因为你会开始丢失BLE事件,最终你会断开连接,因为你不会执行调度函数,因为你不会通过主循环),只要交互完成。当UART中断到达或事务完成时,只需向客户端发送确认消息。
由于MT_dialog