你好,
我参考SDK里面的ble_app_peripheral中的user_svc1_led_wr_ind_handler部分,可以实现单字节数据的接收处理,请问对于手机主机端发过来的多字节数据我应该怎么处理呢,是否同样可以在这个函数里进行转存处理呢?我尝试了转存,但是并不能获取到第二个正确的字节数据。如果有例子的话最好了,期待回复。
你好,
需要将特征值的长度改一下:
DEF_SVC1_LED_STATE_CHAR_LEN
谢谢!解决了。顺便问一下,我需要操作IO口时间比较长,那么这个操作是放在user_svc1_led_wr_ind_handler这个类似的函数里面进行处理比较好呢,还是直接放在主循环进行处理呢,看官网好像并不建议直接在主循环里做任何处理。或者有其他好的建议吗
是的,不建议直接在主循环里添加用户代码,并且最好在用户层面实现用户功能,不要修改到SDK文件下的任何源文件。
关于主循环,大概流程是:
而(1)
{
/ / 1。将消息队列中的消息一个个取出,执行(调用处理程序),直到消息队列为空- - > schedule_while_ble_on ();
/ / 2。判断是否有异步事件需要处理- > app_asynch_proc()——> app_on_system_powered ()
/ / 3。休眠条件判断- > sleep_mode = rwip_power_down ();
/ / 4。休眠流程——>如果(sleep_mode = = mode_ext_sleep) | | (sleep_mode = = mode_ext_sleep_otp_copy))
}
你可在消息处理程序里置位一个标志位,然后在上述第二点的app_on_system_powered()里放置你的事件处理时间比较长的函数
你好,我按照这种方式在user_callback_config.h里进行了如下定义
.app_on_system_powered = user_scan_sda_flag,
然后在user_peripheral.c里定义了该函数
空白user_scan_sda_flag(空白){wdg_freeze ();//停止看门狗定时器如果(VAL_FLAG = = 1){Audion_WriteSingle_CMD (ble_singlebyte);VAL_FLAG = 0;/ / val处理完毕}else if (VAL_FLAG = = 2){Audion_WriteMulti_CMD (ble_multibyte [0], ble_multibyte [1]);VAL_FLAG = 0;/ / val处理完毕}wdg_resume ();//恢复看门狗定时器wdg_reload(watchdog_default_period);},里面就是处理时间较长的函数
实际测试发现蓝牙还是会断,我在Audion_WriteMulti_CMD, Audion_WriteSingle_CMD这两个函数里还穿插加入了rwip_schedule();,让内核去运行,但是还是不行,通过电子狗工具,发现协议栈差不多10 ms就得有一次RSSI数据获取,但是我的实际运行最小周期的操作大概有30 ms。请问是否有什么其他的好方法来解决这个问题吗?谢谢 期待你的回复
下面是电子狗的调试日志
03:06:34.493 INFO GATT写命令(连接:0x00句柄:0x001F数据:0x02)03:06:34.496 DEBUG Task 'GATT Write Command (Connection:0x00 Handle:0x001F Data:0x02)' completed (Result:Success)03:06:35.464 DEBUG EnhancedPeripheral (UUID= 00000000000 -0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - Read RSSI started03:06:35.467调试任务开始(读取RSSI(连接:0x00))03:06:35.472 DEBUG TX - ID:GAPC_GET_INFO_CMD(0x0E05)来源:TASK_ID_APP(0)目的:TASK_ID_GAPC(0)参数:0x0703:06:35.475 DEBUG Task 'Read RSSI (Connection:0x00)' completed (Result:Success)03:06:35.479调试inconceedPeripheral(UUID = 00000000-0000-0000-0000-770E0D0C0B0A名称= DA14580-EVB-QI) - 阅读RSSI(RSSI:-102)03:06:36.478 DEBUG EnhancedPeripheral (UUID= 00000000000 -0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - Read RSSI started . (UUID=00000000-0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi03:06:36.481 DEBUG任务启动(读取RSSI(连接:0x00))03:06:36.487 DEBUG TX - ID:GAPC_GET_INFO_CMD(0x0E05)来源:TASK_ID_APP(0)目的:TASK_ID_GAPC(0)参数:0x0703:06:36.491 DEBUG Task 'Read RSSI (Connection:0x00)' completed (Result:Success)03:06:36.497 DEBUG enhedperipheral (UUID= 00000000000 -0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - Read RSSI done (RSSI:-66)03:06:37.490调试EnganceCheCeripheral(UUID = 00000000-0000-0000-0000-770E0D0C0B0A名称= DA14580-EVB-QI) - 读取RSSI已启动03:06:37.493调试任务启动(读取RSSI(连接:0x00))03:06:37.499 DEBUG TX - ID:GAPC_GET_INFO_CMD(0x0E05)来源:TASK_ID_APP(0)目的:TASK_ID_GAPC(0)参数:0x0703:06:37.501 DEBUG Task 'Read RSSI (Connection:0x00)' completed (Result:Success)03:06:37.504 DEBUG enhedperipheral (UUID= 00000000000 -0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - Read RSSI done (RSSI:-97)03:06:38.505 DEBUG EnhancedPeripheral (UUID= 00000000000 -0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - Read RSSI started03:06:38.508调试任务启动(读取RSSI(连接:0x00))03:06:38.512 DEBUG TX - ID:GAPC_GET_INFO_CMD(0x0E05)来源:TASK_ID_APP(0)目的:TASK_ID_GAPC(0)参数:0x0703:06:38.515 DEBUG Task 'Read RSSI (Connection:0x00)' completed (Result:Success)03:06:38.518 DEBUG enhedperipheral (UUID= 00000000000 -0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - Read RSSI done (RSSI:-95)03:06:38.523 INFO外设断开连接(连接:0x00原因:0x08)03:06:38.527 INFO Disconnected (Device:00000000-0000-0000-0000-770e0d0c0b0a)03:06:38.530 DEBUG EnhancedPeripheral (UUID= 00000000000 -0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - State: Ready->Idle03:06:38.532 INFO EnhancedPeripheral (UUID= 00000000000 -0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) -断开连接事件
在线后,麻烦解答一下 !非常感谢!
请问连接间隔是多少?增大连接间隔是否能避免该问题
我在从机端改变了超时时间,设定大于我的最大阻塞时间后可行。有一点疑惑,rwip日程安排(),这个函数我穿插在我的应用部分,会有什么隐患吗
从个人的经验来看,有几个注意点:
1.rwip时间表()需要花时间执行,需要评估其执行的时间不会对你的流程产生影响
2.要避免无限递归,即
空白block_function ()
块();
Rwip_schedule()
假设有个消息hanlder:
void msg_handler()
block_function();
块功能不可以在消息处理程序中执行。
明白 非常感谢!
你好,
需要将特征值的长度改一下:
DEF_SVC1_LED_STATE_CHAR_LEN
谢谢!解决了。顺便问一下,我需要操作IO口时间比较长,那么这个操作是放在user_svc1_led_wr_ind_handler这个类似的函数里面进行处理比较好呢,还是直接放在主循环进行处理呢,看官网好像并不建议直接在主循环里做任何处理。或者有其他好的建议吗
你好,
是的,不建议直接在主循环里添加用户代码,并且最好在用户层面实现用户功能,不要修改到SDK文件下的任何源文件。
关于主循环,大概流程是:
而(1)
{
/ / 1。将消息队列中的消息一个个取出,执行(调用处理程序),直到消息队列为空- - > schedule_while_ble_on ();
/ / 2。判断是否有异步事件需要处理- > app_asynch_proc()——> app_on_system_powered ()
/ / 3。休眠条件判断- > sleep_mode = rwip_power_down ();
/ / 4。休眠流程——>如果(sleep_mode = = mode_ext_sleep) | | (sleep_mode = = mode_ext_sleep_otp_copy))
}
你可在消息处理程序里置位一个标志位,然后在上述第二点的app_on_system_powered()里放置你的事件处理时间比较长的函数
你好,我按照这种方式在user_callback_config.h里进行了如下定义
.app_on_system_powered = user_scan_sda_flag,
然后在user_peripheral.c里定义了该函数
空白user_scan_sda_flag(空白)
{
wdg_freeze ();//停止看门狗定时器
如果(VAL_FLAG = = 1)
{
Audion_WriteSingle_CMD (ble_singlebyte);
VAL_FLAG = 0;/ / val处理完毕
}
else if (VAL_FLAG = = 2)
{
Audion_WriteMulti_CMD (ble_multibyte [0], ble_multibyte [1]);
VAL_FLAG = 0;/ / val处理完毕
}
wdg_resume ();//恢复看门狗定时器
wdg_reload(watchdog_default_period);
},里面就是处理时间较长的函数
实际测试发现蓝牙还是会断,我在Audion_WriteMulti_CMD, Audion_WriteSingle_CMD这两个函数里还穿插加入了rwip_schedule();,让内核去运行,但是还是不行,通过电子狗工具,发现协议栈差不多10 ms就得有一次RSSI数据获取,但是我的实际运行最小周期的操作大概有30 ms。请问是否有什么其他的好方法来解决这个问题吗?谢谢 期待你的回复
下面是电子狗的调试日志
03:06:34.493 INFO GATT写命令(连接:0x00句柄:0x001F数据:0x02)
03:06:34.496 DEBUG Task 'GATT Write Command (Connection:0x00 Handle:0x001F Data:0x02)' completed (Result:Success)
03:06:35.464 DEBUG EnhancedPeripheral (UUID= 00000000000 -0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - Read RSSI started
03:06:35.467调试任务开始(读取RSSI(连接:0x00))
03:06:35.472 DEBUG TX - ID:GAPC_GET_INFO_CMD(0x0E05)来源:TASK_ID_APP(0)目的:TASK_ID_GAPC(0)参数:0x07
03:06:35.475 DEBUG Task 'Read RSSI (Connection:0x00)' completed (Result:Success)
03:06:35.479调试inconceedPeripheral(UUID = 00000000-0000-0000-0000-770E0D0C0B0A名称= DA14580-EVB-QI) - 阅读RSSI(RSSI:-102)
03:06:36.478 DEBUG EnhancedPeripheral (UUID= 00000000000 -0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - Read RSSI started . (UUID=00000000-0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi
03:06:36.481 DEBUG任务启动(读取RSSI(连接:0x00))
03:06:36.487 DEBUG TX - ID:GAPC_GET_INFO_CMD(0x0E05)来源:TASK_ID_APP(0)目的:TASK_ID_GAPC(0)参数:0x07
03:06:36.491 DEBUG Task 'Read RSSI (Connection:0x00)' completed (Result:Success)
03:06:36.497 DEBUG enhedperipheral (UUID= 00000000000 -0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - Read RSSI done (RSSI:-66)
03:06:37.490调试EnganceCheCeripheral(UUID = 00000000-0000-0000-0000-770E0D0C0B0A名称= DA14580-EVB-QI) - 读取RSSI已启动
03:06:37.493调试任务启动(读取RSSI(连接:0x00))
03:06:37.499 DEBUG TX - ID:GAPC_GET_INFO_CMD(0x0E05)来源:TASK_ID_APP(0)目的:TASK_ID_GAPC(0)参数:0x07
03:06:37.501 DEBUG Task 'Read RSSI (Connection:0x00)' completed (Result:Success)
03:06:37.504 DEBUG enhedperipheral (UUID= 00000000000 -0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - Read RSSI done (RSSI:-97)
03:06:38.505 DEBUG EnhancedPeripheral (UUID= 00000000000 -0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - Read RSSI started
03:06:38.508调试任务启动(读取RSSI(连接:0x00))
03:06:38.512 DEBUG TX - ID:GAPC_GET_INFO_CMD(0x0E05)来源:TASK_ID_APP(0)目的:TASK_ID_GAPC(0)参数:0x07
03:06:38.515 DEBUG Task 'Read RSSI (Connection:0x00)' completed (Result:Success)
03:06:38.518 DEBUG enhedperipheral (UUID= 00000000000 -0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - Read RSSI done (RSSI:-95)
03:06:38.523 INFO外设断开连接(连接:0x00原因:0x08)
03:06:38.527 INFO Disconnected (Device:00000000-0000-0000-0000-770e0d0c0b0a)
03:06:38.530 DEBUG EnhancedPeripheral (UUID= 00000000000 -0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) - State: Ready->Idle
03:06:38.532 INFO EnhancedPeripheral (UUID= 00000000000 -0000-0000-0000-770e0d0c0b0a Name=DA14580-EVB-Qi) -断开连接事件
在线后,麻烦解答一下 !非常感谢!
你好,
请问连接间隔是多少?增大连接间隔是否能避免该问题
我在从机端改变了超时时间,设定大于我的最大阻塞时间后可行。有一点疑惑,rwip日程安排(),这个函数我穿插在我的应用部分,会有什么隐患吗
你好,
从个人的经验来看,有几个注意点:
1.rwip时间表()需要花时间执行,需要评估其执行的时间不会对你的流程产生影响
2.要避免无限递归,即
空白block_function ()
{
块();
Rwip_schedule()
块();
}
假设有个消息hanlder:
void msg_handler()
{
block_function();
}
块功能不可以在消息处理程序中执行。
明白 非常感谢!