我有2个DA14580AK EVB和加载dsp设备和主机应用程序到2个不同的EVB。我在主机的gapm_adv_report_ind_handler中设置了断点,并显示了param->report.adv_addr的值。addr & param - >报告。观察视图中的数据。Dialog主机可以正确显示Dialog设备名称和BD地址。如果Dialog主机接收到另一个品牌BLE的广告消息,只能正确接收BD地址,但是接收到的设备名是垃圾。然而,DSPS android应用程序可以正确显示这些设备名称,请告知。
Int gapm_adv_report_ind_handler(ke_msg_id_t const msgid,
Const struct gapm_adv_report_ind *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
memset(gBdAddress, 0, sizeof(struct bd_addr));
memcpy (gBLEname param - >报告。数据,参数- > report.data_len);
memcpy (gBdAddress param - > report.adv_addr。addr, sizeof (struct bd_addr));
如果(! memcmp (param - >报告。数据[3]、APP_DFLT_ADV_DATA APP_DFLT_ADV_DATA_LEN))
{
//保存找到的bd_addr到全局变量
memcpy(&connect_bdaddr,param-> eport.addr.addr,sizeof(struct bd_addr));
app_cancel_scanning ();
}
return(ke_msg_consumed);
}
嗨jackiechau,
当你说“垃圾”时,你的意思是什么,当你得到广告指示时,十六进制价值是应该是的一个?也许您还看到了先前迹象的数据,因为您不会将您存储广告字符串存储的数组。
由于MT_dialog
嗨MT_dialog,
“garbage”表示不能获得正确的设备名称,但可以接收相关的BdAddress。然而,DSPS android应用程序可以正确显示这些设备名称。谢谢。
嗨jackiechau,
当你得到一个广告指示时,你能检查十六进制值吗,你能检查它们而不是ascii字符吗?你能检查param->报告吗?数据参数而不是要复制数据的数组?或者可能由于opentialization你不能检查实际数据,你可以尝试打印数据而不是在调试器中检查它们吗?虽然我能够看到有效的数据时,广告指示来我的设置。
由于MT_dialog
嗨MT_dialog,
请查收附件。它是显示不正确十六进制值的设备名称之一。我试图打印param->报告。数据参数通过控制台,结果一致。对话框设备名称可以显示,我认为这与优化问题无关,请告知。
嗨jackiechau,
似乎有点奇怪,只要我从屏幕截图看,AD标志在调试器0x02,0x01和0x06中正确显示了,1A是广告字符串报告的数据的长度,FF是制造商特定的数据。如果580过滤出下一个字节,它有点奇怪。您确定要在广告字符串中放置的值吗?请您使用只解析像BlueLoupe这样的广告字符串的应用程序。也许在您使用的应用中看到的是您所使用的应用程序是由手机缓存而不是实际广告字符串的设备名称。
由于MT_dialog
嗨MT_dialog,
实际上,广告串是通过空气接收的,它们不是由我传送的。我只是想知道为什么DSPS apk或我的BLE监视器(带有USB BLE模块的PC应用程序)可以接收这些广告,但在我的对话主机中却不是这样。
我还有一个问题。在主机DSPS项目中,休眠模式是禁用的。我在main_func的while循环中放入了一个printf_string(“T”)。当程序被调试器运行时,打印了几百个“T”,然后什么也没有打印出来。我停止调试并再次运行,又打印了一个“T”。这是怎么呢我以为打印的是连续的“T”,请告知
嗨jackiechau,
正如我在屏幕截图中提到的那样,我可以看到广告字符串的标志,主机(至少在我的侧面可以正确接收广告字符串,当我在广告字符串中放置名称我可以检查名称在额外的阵列变量中),现在考虑到您的其他设备能够检查每个用户的名称是因为这些设备可以缓存所连接的设备的名称或类似于该设备或设备可以从扫描响应数据字符串读取名称。为了确保您可以使用外设宣传,并通过中央捕获外设的广告,并检查您放置在设备的广告字符串中的名称。还有另一件事
就打印“T”而言,尝试使用直接使用UART的函数,例如uart_write(“T”,1,NULL);
由于MT_dialog
嗨MT_dialog,
我发现,当调用app_cancel_scanning()或app_disconnect()时,未打印“t”。调用app_scanning()或app_connect()后,打印连续的“t”。在运行App_cancel_scanning()或app_disconnect()时,程序计数器似乎停止,直到收到中断。它通过添加Systick计时器证明。请诚挚建议。另外,是否有可能为您的HK员工提供帮助我,谢谢?
另外,许多开发人员在I2C从站问题上请求帮助,你们是否计划对此进行研究?
嗨Jackiechau,
邮件被发送到注册的电子邮箱。
由于MT_dialog
嗨MT_dialog,
因为有时外围设备断开连接并无法永久连接Central,我尝试在断开按钮后发出App_reset_App()。此时,虽然中心可以接收广告并连接到外围设备,但外围设备无法接收中心的发送数据。调用app_reset_app()后,是否有任何状态更改,或者我应该需要初始一些代码,以便中央可以再次连接它?
此外,似乎BLE计时器在发出app_reset_app()之后停止了,我注意到app_timer_set的处理程序没有被触发。谢谢。
嗨jackiechau,
你不需要发送一个重置命令来重新连接到一个设备,最有可能的是你向外设发出连接请求的方式出了问题。你能粘贴你正在使用的代码,以便从中央连接吗?另外,你在哪个SDK上开发,你是在SDK5上使用dsp还是在SDK3上作为例子?你说外设不能接收中央传送的数据(通知/指示)是什么意思?在GAPM_RESET之后,您的设备应该通过app_easy_gap_dev_configure()(在SDK5中)函数进行设置,该函数将设置您的设备的角色、操作等。
由于MT_dialog
我在SDK5上使用dsp。
在中心侧,I通过UART输入字符以手动扫描,取消扫描,连接和断开外围设备。我刚刚使用了所有的API。
Static uart_rx_callback(uint8_t res, uint32_t read_size)
{
struct bd_addr testDeviceAddr;
开关(rx_read_pointer [0]){
例“s”:
app_scanning ();
打破;
例“x”:
app_cancel_scanning ();
打破;
例“c”:
如果(ke_state_get (TASK_APP) = = APP_CONNECTABLE) {
printf_string(“connect \ r \ n”);
app_connect ();
}
打破;
例“d”:
if(ke_state_get(task_app)== app_connected){
app_disconnect ();
printf_string(“disconnect \ r \ n”);
}
打破;
案例'r':
printf_string(“重置堆栈\ r \ n”);
app_reset_app ();
打破;
例“t”:
printf_string(“set app_connectable \ r \ n”);
ke_state_set (TASK_APP APP_CONNECTABLE);
打破;
默认值:
打破;
}
# endif
//重新回调
uart_sps_read(rx_read_pointer, RX_CALLBACK_SIZE, &rx_state_ptr, &uart_rx_callback);
}
int gapc_disconnect_ind_handler(ke_msg_id_t const msgid,
Struct gapc_disconnect_ind const *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
app_disconnect ();
ke_state_set (TASK_APP APP_CONNECTABLE);
printf_string (BLE连接丢失\ r \ n”);
return(ke_msg_consumed);
}
在外设端,调试消息将打印在gapc_connection_req_ind_handler和和gapc_disconnect_ind_handler中,这样我就可以知道外设设备的连接是否已连接。
在上一篇文章中,我想说的是,有时外围设备可能会因为远程断开而断开。当中央试图再次连接外围设备时,无法再次连接。然后我尝试在外围设备中发出app_reset_app。此时,虽然central可以接收advertisemnet并连接到外围设备,但当central试图以连接模式通过app_uart_push发送数据时,外围设备无法接收任何数据。
此外,在外设端,我通过调用app_timer_set()来每1秒打印调试消息,从而添加了一个计时器。但是,当发出app_reset_app时,我注意到调试消息被停止打印。
嗨Jackiechau,
当您连接到设备时(使用app_connect()函数时)如何分配gapm_start_connection_cmd消息,您使用KE_MSG_ALLOC_DYN()或KE_MSG_ALLOC()宏。为了正确连接应使用ke_msg_alloc_dyn()。通过使用此缩小命令,不需要,外围设备应该能够重新连接。
由于MT_dialog
嗨MT_dialog,
我使用的是由SDK5的原始源代码提供的KE_MSG_ALLOC()。为什么KE_MSG_ALLOC()不是最好的解决方案?
如果我使用KE_MSG_ALLOC_DYN() marco,如何定义参数“长度”?
中央侧会因为超时而断开吗?
你有没有试过通宵测试DSPS中心和外设的连接?
实际上,无论扫描,停止扫描,连接或断开连接,中心都会通过外部事件手动操作。谢谢。
嗨jackiechau,
在SDK5中的DSP主机中,APP_CONNECT() - (是SDK3函数)函数未使用,而是使用API函数app_easy_gap_start_connection_to_msg_create()的API函数app_easy_gap_start_connection_to_msg_create(),这反过来调用app_connect_start_msg_create(),稍后的函数是使用ke_msg_alloc_dyn分配gapm_start_connection_cmd消息的函数。参数长度应为(sizeof(struct gap_bdaddr))。关于为什么要使用ke_msg_alloc_dyn,在附带的参数中的每一个消息/结构都具有一个名为空数组,必须与ke_msg_alloc_dyn分配。在SDK3中,使用KE_MSG_ALLOC,并且撰写为什么我们之后重置堆栈,但这不是启动或重新启动连接的正确方法。是的,由于超时,有一个断开连接。我不知道QA是否在DSP上进行了过夜测试,所以我无法肯定地告诉你,但我想那些测试的那种测试是标准的,所以我想他们有。
由于MT_dialog
我检查了SDK3应该使用,因为DSPS项目只适用于SDK3。
嗨jackiechau,
DSP也在SDK 5中实现,请在参考设计中检查对话框串行端口服务。最新版本基于5.0.3 SDK版本。
由于MT_dialog