你好,
我们有一个外设解决方案,其中DA14580连接在UART到我们的微控制器。DA14580查询用于GATT特性的值,控制器读/从中央写请求。
我们赶上读(ATTS_READ_REQ_IND)和写(GATTC_WRITE_CMD_IND)在user_catch_rest_hndl事件()
有没有用,我们可以阻止,直到我们得到来自控制器的响应在UART的读或写请求,然后把从user_catch_rest_hndl响应机制()
总之,我们需要传送user_catch_rest_hndl读/写请求(),等到收到响应(UART中断),然后从user_catch_rest_hndl发送响应数据()。能否请你让我们知道如何才能做到这一点。任何指针,实例将是有益的。
谢谢
hrishikesh.
设备:
嗨dhrishi,
我不太理解这个用例,您提到580连接到外部MCU(我想这就是您所说的控制器)并且控制器提供特性值。
那么,上述情况descibe你想做些什么?
谢谢你的对话
是的。确切地。这是正确的。
我们如何做
嗨dhrishi,
由于数据库值保存在580的内部数据库中,因此没有关于您尝试执行的操作的示例,而且我也不太确定您提到的块,因为一旦您得到指示(中央已读取或写入特征)SDK只会向应用程序报告这一点,并由您决定要做什么。据我所知,关于你想做什么,BLE规范中使用的大多数命令都是顺序的,这意味着大多数命令(包括读请求和写请求)当由中央发出时,它们应该由外围设备确认,这意味着如果中央设备没有从之前的命令中获得响应,则不能发送额外的请求(此请求/响应方案类似于BLE协议实现的流控制)。因此,您可以从读或写请求中获取指示,在catch_rest函数中捕获它们并启动UART事务,在您发送确认消息之前,中心不会发出任何额外的请求,因此一旦您的UART事务完成,您就可以在链接的另一端发送确认。还应注意,并非所有命令都遵循请求/响应方案,例如,写入命令(写入时无响应)将触发您的指示,但中央处理器不会等待响应,并且在处理前一个命令时仍可以发出额外的命令,这需要额外的流量控制方案。
因此,基于上述,您可以通过UART时写指示写发生,当读指示来自中央从UART读取。对于发送的值,你已经从UART读,因为我已经在不同的文章中提到,你不能只是发送值已通过UART直接获得,但你必须在内部数据库中设置的值,只要你有读指示,然后发送确认的读取。所以在读取接收触发的UART交易调用,以便设置在数据库中的值,然后dg_atts_read_cfm的attmdb_att_set_value()()送价值。
此外,要知道,当你从UART读,你必须保持清醒,所以为了不眠有XTAL16。
谢谢你的对话
我已经在我的implementation.My关注有attmdb_att_set_value()和dg_atts_read_cfm()是,当ATTS_READ_REQ_IND将在user_catch_rest_hndl()被接收,我必须先发送请求到在UART外部MCU来获取特征值和上的数据的接收,调用上述两个功能。对?
现在,从外部MCU的UART响应将从中断上下文。那么,如何才能让当前执行的线程在user_catch_rest_hndl()要等到适当的响应,从外部MCU接收。否则它会通过调用调用上面的垃圾/不正确的值两个函数和读取响应中央是不正确的返回。
总之,我们应该等到从UART响应(从中断上下文中)被接收,同样是保存在GATT数据库,然后将读确认发送出去。
嗨dhrishi,
是的,这我在想什么,得到的指示,启动UART交易,获取数据,并与由UART得到的值发送确认。
580不是一个基于线程的系统,它只是有一个调度程序,每当rwip_schedule()函数从主循环运行时,它都会调度消息并执行相应的回调。因此,您可以尝试的是,一旦获得读取指示,就启动UART事务或设置UART以从外部MCU接收数据(这取决于您的实现和交互方式),然后离开catch_rest处理程序(通过设置读取中断)或留在那里(执行UART事务,在这种情况下,您不能停留在您想要执行UART事务的时间,因为您将开始丢失BLE事件,最终您将断开连接,因为您不会执行调度功能,因为您不会通过主循环)一旦交互完成。当UART中断命中或事务完成时,只需向客户端发送确认消息。
谢谢你的对话