我有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,
KEU task\u id\u t const dest\u id,
ke_任务id_t常量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->report.adv_addr.addr,sizeof(struct bd_addr));
app_cancel_scanning();
}
返回(已消耗的热量);
}
嗨Jackiechau,
当你说“垃圾”时,当你得到广告指示时,十六进制值是应该的值,这是什么意思?也许你也看到了以前指示的数据,因为你没有记忆存储广告字符串的数组。
谢谢mt_dialog.
嗨mt_dialog,
“垃圾”表示可以收到相关的bdddress,因此无法得到正确的设备名称。但是,DSPS Android应用程序可以正确显示这些设备名称。谢谢。
嗨Jackiechau,
当您获得广告指示时,您正在获得的十六进制值呢,可以查看它们而不是ASCII字符吗?您能否请检查Param-> Report.data参数,而不是您复制数据的数组吗?或者可能是由于选择选择无法检查实际数据,可以尝试打印数据而不是在调试器中检查它们吗?当广告指示出现在我的设置时,我能够看到有效数据。
谢谢mt_dialog.
嗨mt_dialog,
请查收附件。它是显示错误HEX值的设备名称之一。我试图打印param->报告。数据参数通过控制台和结果是相同的。可能会显示对话设备名称,我认为这与优化问题无关,请建议。
嗨Jackiechau,
似乎有点奇怪,就我从你的屏幕截图中所见,调试程序0x02、0x01和0x06中正确显示了广告标志,1A是广告字符串报告的数据长度,FF是特定于制造商的数据。如果580过滤掉了下一个字节,这有点奇怪。你确定你使用的值是plac吗正在插入广告字符串?请使用只解析广告字符串(如BlueLoupe)的应用程序进行检查。可能您在使用的应用程序中看到的是手机缓存的设备名称,而不是实际的广告字符串。
谢谢mt_dialog.
嗨mt_dialog,
实际上,通过空气接收广告字符串,它们不会被我传输。我只是想知道为什么DSPS APK或我的BLE监视器(带USB BLE模块的PC应用程序)可以收到这些广告,但在我的对话框主机中并非如此。
我还有一个问题。在主机DSPS项目中,休眠模式已禁用。我在main_func的while循环中放入了printf_string("T")。当程序被调试器运行时,几百个“T”被打印出来,然后什么也没有。我停止了调试器并再次运行,又打印了一个“T”。这是怎么呢我预期是连续打印的“T”,请告知
嗨Jackiechau,
正如我在您所附的屏幕截图中提到的,我可以看到广告字符串的标志和主机(至少在我这边可以正确接收广告字符串,当我在广告字符串中放置名称时,我可以在额外的数组变量中检查名称),现在,关于您的其他设备能够检查名称perphaps,是因为这些设备可以缓存连接设备的名称或类似的内容,或者这些设备可以从扫描响应数据字符串中读取名称。为了确保您可以使用外围设备播发,并使用中央设备捕捉外围设备的播发d检查您在设备广告字符串中输入的名称。还有一件事
就打印“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定时器证明了这一点。请告知。另外,是否可以派你们的香港员工来帮助我,谢谢?
此外,许多开发人员要求帮助I2C从事问题,您的一方面会拍摄这方面吗?
嗨Jackiechau,
将邮件发送到注册的电子邮件地址。
谢谢mt_dialog.
嗨mt_dialog,
因为有时外围设备会断开连接,无法永远连接中央设备,所以我尝试发布app_reset_app()按下按钮断开连接后。此时,虽然central可以接收广告并连接到外围设备,但外围设备无法接收central传输的数据。在调用app_reset_app()后,是否有任何状态更改,或者我是否需要初始化一些代码,以便central可以再次连接?
此外,似乎发出App_reset_App()后的BLE定时器停止,我观察到未触发app_timer_set的处理程序。谢谢。
嗨Jackiechau,
你不需要发送重置命令来重新连接设备,很可能是你向外设发出连接请求的方式出了问题。请粘贴您正在使用的代码,以便从中央连接?还有,你在哪个SDK上开发,你是使用SDK5上的DSPS还是SDK3上的DSPS作为例子?外围设备不能接收中心传送的数据(通知/指示)是什么意思?在GAPM_RESET之后,应该通过app_easy_gap_dev_configure()(在SDK5中)函数设置设备的角色、操作等。
谢谢mt_dialog.
我在SDK5上使用DSP。
在中央端,我通过UART输入字符以手动方式扫描、取消扫描、连接和断开外围设备。我只使用了贵方提供的所有api。
Static void uart_rx_callback(uint8_t res, uint32_t read_size)
{
struct bd_addr testDeviceAddr;
开关(rx\u读取\u指针[0]){
案例's':
app_scanning();
休息;
案例'x':
app_cancel_scanning();
休息;
案例'c':
如果(ke_state_get (TASK_APP) = = APP_CONNECTABLE) {
printf_字符串(“CONNECT\r\n”);
app_connect();
}
休息;
案例'd':
if(ke_state_get(TASK_APP)==APP_CONNECTED){
app_disconnect();
printf_字符串(“断开连接”);
}
休息;
案例“r”:
printf_string(“重置堆栈\ r \ n”);
app_reset_app();
休息;
案例't':
printf_字符串(“设置应用程序可连接\r\n”);
ke_状态_集(任务_应用程序,应用程序可连接);
休息;
默认:
休息;
}
#万一
//重新初始化回调
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,
KEU task\u id\u t const dest\u id,
ke_任务id_t常量src_id)
{
app_disconnect();
ke_状态_集(任务_应用程序,应用程序可连接);
printf_string(“ble连接丢失\ r \ n”);
返回(已消耗的热量);
}
在外设方面,调试消息将在GAPC_CONNECTION_REQ_IND_HANDLLER中打印和GAPC_DISCONNECT_IND_HANDLLER,使得我可以知道是否连接了外围设备的连接。
在最后一个帖子中,我想说的是,由于远程断开,外围设备可能会断开连接。当中央行程再次连接膜组器设备时,它无法再次连接。然后我尝试在秘书处发出app_reset_app。此时,虽然中心可以接收广告消息并连接到外围设备,但是当中央试图通过连接模式下的App_uart_push发送数据时,Peripher设备无法接收任何内容。
此外,在外围设备端,我通过调用app_timer_set()添加了一个计时器,以每1秒打印调试消息。然而,当发出app_reset_app时,我观察到调试消息被停止以打印。
嗨Jackiechau,
连接到设备时(使用app_connect()函数时)如何分配使用ke_msg_alloc_dyn()或ke_msg_alloc()宏的GAPM_START_CONNECTION_CMD消息。正确连接应使用KE_MSG_ALLOC_DYN()。通过使用此命令,不需要GAPM_重置命令,并且外围设备应能够重新连接。
谢谢mt_dialog.
嗨mt_dialog,
我正在使用SDK5的原始源代码提供的KE_MSG_ALLOC()。为什么KE_MSG_ALLOC()不是最好的解决方案?
如果我使用ke_msg_alloc_dyn()marco,如何定义参数“长度”?
中央是否会因为超时而断开?
您是否尝试过测试DSP中央和外围的连接过夜?
实际上,无论扫描、停止扫描、连接或断开连接,central都会通过外部事件手动执行。谢谢。
嗨Jackiechau,
在SDK5中的DSP主机中,未使用app_connect()-(是SDK3函数)函数,而是使用api函数app_easy_gap_start_connection_to_set()函数,该函数使用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.