你好Dialog_support,
我已经配置角色切换使用ble_app_peripheral实例和DSPS项目。默认操作模式为外围当我按下按钮,当前角色就会切换到中央.除了角色切换之外,它还执行连接其他外设和发送数据等操作。现在,只有当按钮被按下时,才会发生下一个角色转换。角色转换部分工作得很顺利,但是在角色转换后与各自的中心和外围发生连接时,我面临着一个问题。我已经在DSPS项目的帮助下创建了自定义客户端配置文件,命名为custc1.c和custc1_task.c。在这个文件中,我声明了两个常量结构。
1.如果我在下面的结构中声明GATTC_CMP_EVT,然后在外设模式下,它平滑地连接到移动应用程序,但在中心模式下,它不能连接到外设。Const struct ke_msg_handler custc1_connected[] =
{
(ke_msg_func_t) custc1_data_write_req_handler}, {CUSTC1_DATA_WRITE_REQ
(ke_msg_func_t) gattc_cmp_evt_handler}, {GATTC_CMP_EVT
};
2.如果我在下面的结构中声明GATTC_CMP_EVT,然后在中心模式下,它能够连接到其他外设,但在外设模式期间,当我们试图连接到移动应用程序,然后它进入hardfault_handler。Const struct ke_msg_handler custc1_default_state[] =
{
(ke_msg_func_t) custc1_enable_req_handler}, {CUSTC1_ENABLE_REQ
(ke_msg_func_t) gapc_disconnect_ind_handler}, {GAPC_DISCONNECT_IND
(ke_msg_func_t) gattc_cmp_evt_handler}, {GATTC_CMP_EVT
};
上面的gattc_cmp_evt_handler在custs1_task.c和custc1_task.c中定义。但是这个处理程序被声明为静态的。你能帮我查一下是什么原因吗?
我已经上传了custc1_task.c文件的结构,我已经使用的图像。
感谢和问候,
前腿帕特尔
嗨,前腿帕特尔
我不知道您在这个自定义设计上有什么实现,但我认为您正在使用一个设备,它将切换角色,它将启用不同的配置文件每次取决于指定的角色,我还认为,只有当设备作为中心而不是外设时,你附加的新文件和代码才会生效,例如,如果该设备是一个外设,那么应该被触发的GATTC_CMP_EVT将在对应的文件中,该文件对应于task_cust1,而不是在task_cust1(您已经创建的)中。您引用的处理程序是通过prf_init_func()设置的,并且每个不同的概要文件为每个交付的消息初始化自己的处理程序,因此这是您应该检查的第一件事。所有初始化时的任务都使用ke_task_create()函数来创建任务并为每个可用状态声明处理程序。
由于MT_dialog
你好Dialog_Support,
我已经检查了这个,它不正常发生。如果配置文件是外围那么两个TASK_CUSTC1和TASK_CUSTS1触发。我无法解决这个问题。请帮帮我。
在这里我附加了我的自定义实现谷歌驱动器链接。
https://drive.google.com/open?id=1UsZEpIpUsBgj1FV7huw8yoEmhICqWhJv
感谢和问候,
前腿帕特尔
嗨,前腿帕特尔
嗯,据我所知,您正在启用中央配置文件,一旦您启用外围设备(自定义配置文件),就我所知,这不是您想做的确切的事情,不是吗?因此,当您在custs1_connected[]数组中有GATTC_CMP_EVT时,相应的处理程序不会执行,因为概要文件的状态与连接的状态不同,所以什么也不会执行。当custc1_default_handler[]中有相同的消息时,如果GATTC_CMP_EVT到达特定的任务,它将被执行,显然,无论你在该处理程序中做什么,它将导致硬错误发生。收到GATTC_CMP_EVT的原因是您正在启用一个发现过程(您调用了启用概要文件),显然发现过程没有成功返回,因此,您使用PRF_ERR_STOP_DISC_CHAR_MISSING调用custc1_enable_cfm_send()函数,并且在custc1_enable_cfm_send()中再次调用PRF_CLIENT_ENABLE_ERROR,它会触发硬故障。发生硬错误是因为你在PRF_CLIENT_ENABLE_ERROR宏中传递了错误的变量,你传递了PRF_CLIENT_ENABLE_ERROR(custc1_env, con_info->prf_id, CUSTC1);但是你应该传递的是PRF_CLIENT_ENABLE_ERROR(custc1_envs, con_info->prf_id, CUSTC1);这是一个错误的指针,因此ke_free()函数由于该硬错误而失败。
由于MT_dialog
你好Dialog_Support,
谢谢您快速而完美的回复。
嗨,前腿帕特尔
由于MT_dialog