你好,
我们有一个外设解决方案,其中DA14580通过UART连接到我们的微控制器。DA14580查询控制器以获取来自中心的GATT读/写请求的特征值。
我们捕获read(atts_read_req_ind)和write(gattc_write_cmd_nind)事件在user_catch_rest_hndl()中
是否有一种机制可以阻止我们可以阻止,直到我们从控制器上从UART获取读取或写入请求的响应,然后从user_catch_rest_hndl()发送响应
简而言之,我们需要从user_catch_rest_hndl()中发送读/写请求并等待接收响应(UART中断),然后从user_catch_rest_hndl()发送响应数据。你能告诉我们这是怎么做的。任何指针,例子都会有所帮助。
谢谢,
hrishikesh.
设备:
嗨Dhrishi,
我不太了解用例,你提到580附加到外部MCU(我想这就是你说控制器时的意思),控制器提供了特征的值。
那么,上面的情景做出了你想做的事吗?
谢谢mt_dialog.
是的。确切地。那是对的。
我们如何做到这一点
嗨Dhrishi,
由于在580的内部数据库中保存数据库值,因此您尝试执行的内容毫无示例,我也不确定您提到的块,因为您一旦获得指示(即中心)已阅读或写作了一个特征)SDK将仅向申请报告并取决于您将要做的事。据我所知,关于你喜欢做的,BLE规范中使用的大多数命令都是顺序的,这意味着大多数命令(包括读取请求和写入请求)在由中央发出时应由外围设备确认,这意味着中央诱饵如果没有从前一个命令的响应,则会发送其他请求(此请求/响应方案就像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时,我将必须先向外部MCU发送请求,以获得该特征的值在数据接收时,调用上述两个功能。正确的?
现在,来自外部MCU的UART响应将来自中断上下文。因此,如何使当前执行线程在user_catch_rest_hndl()中等待,直到从外部MCU接收到适当的响应。否则它将通过调用以上两个功能来返回,其中垃圾/不正确值以及对中央的读取响应将不正确。
简而言之,我们应该等到接收到UART(从中断上下文)的响应,并且在GATT数据库中保存相同,然后发送读取确认。
嗨Dhrishi,
是的,这是我思考的,获取指示,启动UART事务,获取数据,并通过UART获得的值发送确认。
580不是基于线程的系统,它只需一个调度程序,该调度程序将消息和执行相应的回调常常从主循环运行来执行邮件和执行相应的rundracks。因此,一旦获得读取指示,您可以尝试的是,启动UART事务或设置UART以从外部MCU接收数据(这取决于您的实现以及交互方式如何),无论是留下catch_rest处理程序(通过设置读取中断)或留在那里(执行UART Transastion,在这种情况下,只要您想要执行UART事务,您就无法开始,因为您将开始丢失的BLE事件并最终您将断开连接只要交互完成,就会执行调度函数,因为交互完成后立即通过主循环。当UART中断命中或事务已完成后,只需向客户端发送确认消息。
谢谢mt_dialog.