你好,
我们有一个外围解决方案,其中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将只报告给应用程序,它取决于你要做什么。据我所知道的,关于你woulid喜欢做什么,最in的BLE规范使用的命令是连续的,这意味着大多数时候由中央发出的命令(包括读取请求和写入请求),他们应,通过该装置,所述中心cannnot发送的附加请求,如果它好好尝试获得来自先前命令的响应(这种请求/响应方案是像的流量控制,该协议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,它不是一个基于线程系统中,只是有一个调度器用于调度消息并执行相应的回调evertime从主循环的rwip_schedule()函数运行。所以,你可以尝试的,只要你得到的读数指示什么,开始UART交易或建立UART从外部MCU(取决于您的实现和互动怎么会)接收数据,要么离开catch_rest处理程序(通过设置一个读中断),或者呆在那里(执行UART transastion,在这种情况下,你不能只要你想执行UART的交易,因为你将开始失踪BLE事件,最终你会得到断开,因为你不会留是执行调度功能,因为你不会的互动都完成了,一旦经过主循环)。当UART中断命中或交易已完成,然后只发送确认信息给客户端。
谢谢mt_dialog.