我有2个DA14580AK eVB和将DSP设备和主机应用程序加载到2个不同的EVB中。我在主机的GAPM_ADV_REPORT_IND_HANDLER中设置了断点,并显示了监视视图中的PARAM-> REPORT.ADD.ADDR.ADDR&param-> report.data的值。对话框主机可以正确显示对话设备名称和BD地址。如果对话框主机收到另一个品牌BLE的广告消息,则只能正确接收BD地址,但收到的设备名称是垃圾。但是,DSPS Android应用程序可以正确显示这些设备名称,请诚挚建议。
msgid,lapm_adv_report_ind_handler(ke_msg_id_t const,
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,param-> report.data_len);
memcpy(gbdaddress,param-> eport.adddr.addr,sizeof(struct bd_addr));
if(!memcmp(&param-> report.data [3],app_dflt_addata,app_dflt_add_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,
“垃圾”表示可以收到相关的bdddress,因此无法得到正确的设备名称。但是,DSPS Android应用程序可以正确显示这些设备名称。谢谢。
嗨Jackiechau,
当您获得广告指示时,您正在获得的十六进制值呢,可以查看它们而不是ASCII字符吗?您能否请检查Param-> Report.data参数,而不是您复制数据的数组吗?或者可能是由于选择选择无法检查实际数据,可以尝试打印数据而不是在调试器中检查它们吗?当广告指示出现在我的设置时,我能够看到有效数据。
谢谢mt_dialog.
嗨mt_dialog,
请查收附件。它是显示错误十六进制值的设备名称之一。我试着通过控制台打印param->report.data参数,结果是一样的。对话框设备名称可以显示,我不认为这是有关优化问题,请告知。
嗨Jackiechau,
似乎有点奇怪,只要我从屏幕截图看,AD标志在调试器0x02,0x01和0x06中正确显示了,1A是广告字符串报告的数据的长度,FF是制造商特定的数据。如果580过滤出下一个字节,它有点奇怪。您确定要在广告字符串中放置的值吗?请您使用只解析像BlueLoupe这样的广告字符串的应用程序。也许在您使用的应用中看到的是您所使用的应用程序是由手机缓存而不是实际广告字符串的设备名称。
谢谢mt_dialog.
嗨mt_dialog,
实际上,通过空气接收广告字符串,它们不会被我传输。我只是想知道为什么DSPS APK或我的BLE监视器(带USB BLE模块的PC应用程序)可以收到这些广告,但在我的对话框主机中并非如此。
另外,我还有一个问题。在主机DSPS项目中,睡眠模式是禁用的。我在main函数的while循环中放了一个printf_字符串(“T”)。当调试器运行程序时,打印出几百个“T”,然后就什么也没有了。我停止调试器并再次运行,又打印了一个“T”。发生什么事?我希望连续的“T”被打印出来,请告知。
嗨Jackiechau,
正如我在屏幕截图中提到的那样,我可以看到广告字符串的标志,主机(至少在我的侧面可以正确接收广告字符串,当我在广告字符串中放置名称我可以检查名称在额外的阵列变量中),现在考虑到您的其他设备能够检查每个用户的名称是因为这些设备可以缓存所连接的设备的名称或类似于该设备或设备可以从扫描响应数据字符串读取名称。为了确保您可以使用外设宣传,并通过中央捕获外设的广告,并检查您放置在设备的广告字符串中的名称。还有另一件事
至于打印“T”,尝试使用直接使用UART的函数,例如UART\u 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()后,是否有任何状态更改,或者我应该需要初始一些代码,以便中央可以再次连接它?
此外,似乎发出App_reset_App()后的BLE定时器停止,我观察到未触发app_timer_set的处理程序。谢谢。
嗨Jackiechau,
您不必发送重置命令来重新连接到设备,很可能您向外围设备发出连接请求的方式有问题。您能粘贴您正在使用的代码以便从中心连接吗?另外,您在哪个SDK上开发,以SDK5或SDK3上的DSP为例?外设无法接收中心传输的数据(通知/指示)是什么意思?在GAPM\u重置之后,应该从app\u easy\u gap\u dev\u configure()(在SDK5中)函数设置设备,该函数将设置设备的角色、操作等。
谢谢mt_dialog.
我在SDK5上使用DSP。
在中心侧,I通过UART输入字符以手动扫描,取消扫描,连接和断开外围设备。我刚刚使用了所有的API。
静态无效uart\u rx\u回调(uint8\u t res,uint32\u t read\u size)
{
结构bd\u addr testDeviceAddr;
开关(rx_read_pointer [0]){
案例's':
app_scanning();
休息;
案例'x':
app_cancel_scanning();
休息;
案例'c':
if(ke\u state\u get(TASK\u APP)==APP\u 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);
休息;
默认:
休息;
}
#万一
//重新回调
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 * param,
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_HANDLLER中打印和GAPC_DISCONNECT_IND_HANDLLER,使得我可以知道是否连接了外围设备的连接。
在最后一个帖子中,我想说的是,由于远程断开,外围设备可能会断开连接。当中央行程再次连接膜组器设备时,它无法再次连接。然后我尝试在秘书处发出app_reset_app。此时,虽然中心可以接收广告消息并连接到外围设备,但是当中央试图通过连接模式下的App_uart_push发送数据时,Peripher设备无法接收任何内容。
另外,在外设方面,我还添加了一个计时器,通过调用app\u timer\u set()每1秒打印一次调试消息。但是,当app\u reset\u app发出时,我发现调试消息被停止打印。
嗨Jackiechau,
连接到设备时(使用app_connect()函数时)如何分配使用ke_msg_alloc_dyn()或ke_msg_alloc()宏的GAPM_START_CONNECTION_CMD消息。正确连接应使用ke_msg_alloc_dyn()。通过使用此缩小命令,不需要,外围设备应该能够重新连接。
谢谢mt_dialog.
嗨mt_dialog,
我正在使用SDK5的原始源代码提供的KE_MSG_ALLOC()。为什么KE_MSG_ALLOC()不是最好的解决方案?
如果我使用ke_msg_alloc_dyn()marco,如何定义参数“长度”?
中央侧会因为超时而断开吗?
您是否尝试过测试DSP中央和外围的连接过夜?
实际上,无论扫描,停止扫描,连接或断开连接,中心都会通过外部事件手动操作。谢谢。
嗨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.