你好,
我们有一个外围解决方案,其中DA14580是通过UART连接到我们的微控制器。DA14580向控制器查询来自中央处理器的GATT读/写请求的特征值。
我们在user\u catch\u rest\u hndl()中捕获read(ATTS\u read\u REQ\u IND)和write(GATTC\u write\u CMD\u IND)事件
有没有一种机制可以用来阻止,直到我们通过UART获得控制器对读或写请求的响应,然后从用户\u catch\u rest\u hndl()发送响应
简而言之,我们需要从用户\u catch\u rest\u hndl()发送一个读/写请求,并等待收到响应(UART中断),然后从用户\u catch\u rest\u hndl()发送响应数据。你能告诉我们怎么做吗。任何提示,例子都会有帮助。
谢谢,
瑞诗凯施
设备:
嗨,德里希,
我不太了解用例,你提到580附加到外部MCU(我想这就是你说控制器时的意思),控制器提供了特征的值。
那么,上面的场景描述了你想做什么吗?
谢谢mt_dialog.
对。确切地。没错。
我们怎么做
嗨,德里希,
由于在580的内部数据库中保存数据库值,因此您尝试执行的内容毫无示例,我也不确定您提到的块,因为您一旦获得指示(即中心)已阅读或写作了一个特征)SDK将仅向申请报告并取决于您将要做的事。据我所知,关于你喜欢做的,BLE规范中使用的大多数命令都是顺序的,这意味着大多数命令(包括读取请求和写入请求)在由中央发出时应由外围设备确认,这意味着中央诱饵如果没有从前一个命令的响应,则会发送其他请求(此请求/响应方案就像BLE协议实现的流控制)。因此,您可以从读取或写请求中获取指示,捕获它们在catch_rest函数中并启动您的UART事务,中央不会发出任何其他请求,直到您发送确认消息,就在您的UART交易完成之前可以在链接的另一边发送确认。还要注意,并非所有命令都遵循请求/响应方案,例如写命令(没有响应写)将触发您的指示,但中央不会等待响应,并且在处理前一个时仍然可以发出额外的命令这需要额外的流量控制方案。
因此,基于上述情况,当出现写指示时,您可以通过UART进行写操作,当中央处理器发出读指示时,您可以从UART进行读操作。关于发送您从UART读取的值,正如我在另一篇文章中提到的,您不能直接发送您通过UART获得的值,但您必须在收到读取指示后立即在内部数据库中设置该值,然后发送读取确认。因此,在读取接收触发UART事务时,调用attmdb\u att\u set\u value()在数据库中设置值,然后dg\u atts\u read\u cfm()发送值。
另外,请注意,当您从UART读取时,您必须保持清醒,因此没有睡眠才能拥有XTAL16。
谢谢mt_dialog.
我的实现中已经有attmdb\u att\u set\u value()和dg\u atts\u read\u cfm()。我担心的是,当在user\u catch\u rest\u hndl()中接收到atts\u read\u REQ\IND时,我必须首先通过UART向外部MCU发送请求,以获取该特性的值,并且在接收到数据时,调用上述两个函数。对吗?
现在,来自外部MCU的UART响应将来自中断上下文。因此,如何使user\u catch\u rest\u hndl()中当前正在执行的线程等待,直到从外部MCU接收到适当的响应。否则,它将通过使用垃圾/错误值调用上述两个函数返回,而对中央的读取响应将不正确。
简而言之,我们应该等到接收到来自UART(来自中断上下文)的响应并将其保存在GATT数据库中,然后发送读取确认。
嗨,德里希,
是的,这就是我所想的,获取指示,启动UART事务,获取数据,并用UART获得的值发送确认。
580不是基于线程的系统,它只需一个调度程序,该调度程序将消息和执行相应的回调常常从主循环运行来执行邮件和执行相应的rundracks。因此,一旦获得读取指示,您可以尝试的是,启动UART事务或设置UART以从外部MCU接收数据(这取决于您的实现以及交互方式如何),无论是留下catch_rest处理程序(通过设置读取中断)或留在那里(执行UART Transastion,在这种情况下,只要您想要执行UART事务,您就无法开始,因为您将开始丢失的BLE事件并最终您将断开连接只要交互完成,就会执行调度函数,因为交互完成后立即通过主循环。当UART中断命中或事务已完成后,只需向客户端发送确认消息。
谢谢mt_dialog.