野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8942|回复: 0

定时发送接收蓝牙数据传输丢包问题

[复制链接]
发表于 2021-12-23 15:41:15 | 显示全部楼层 |阅读模式
最近写了一个蓝牙程序,需要定时发送接收,发现数据传输出现了丢包,记录下问题,寻找大佬提供解决方案。
运行流程:上位机通过蓝牙与单片机连接,采用的是usart2,以100ms的频率给单片机发送数据,单片机里面设置了定时器中断,以100ms的频率通过串口usart1发送到PC端的上位机,发现程序会周期性丢包。
  1. 1346 1343 1341 1342 1348
  2. 1346 1343 1341 1342 1348
  3. 1346 1343 1341 1342 1348
  4. 1346 1343 1 1342 1348
  5. 41 1342 1348 1342 1348
  6. 41 1342 1348 1342 1348
  7. 41 1342 1348 1342 1348
  8. 41 1342 1348 1342 1348
  9. 41 1342 1348 1342 1348
  10. 41 1342 1348 1342 1348
  11. 41 1342 1348 1342 1348
  12. 41 1342 1348 1342 1348
  13. 1346 1343 1341 1342 1348
  14. 1346 1343 1341 1342 1348
  15. 1346 1343 1341 1342 1348
  16. 1346 1343 1341 1342 1348
  17. 1346 1343 1341 1342 1348
  18. 1346 1343 1341 1342 1348
  19. 1346 1343 1341 1342 1348
  20. 1346 1343 1341 1342 1348
  21. 1346 1343 1341 1342 1348
  22. 1346 1343 1341 1342 1348
  23. 1346 1343 1341 1342 1348
  24. 1346 1343 1341 1342 1348
  25. 1346 1343 1341 1342 1348
  26. 1346 1343 1341 1342 1348
  27. 1346 1343 1341 1342 1348
  28. 1346 1343 1341 1342 1348
  29. 1346 13 1341 1342 1348
  30. 1346 13 1341 1342 1348
  31. 1346 13 1341 1342 1348
  32. 1346 13 1341 1342 1348
  33. 1346 13 1341 1342 1348
  34. 1346 13 1341 1342 1348
  35. 1346 13 1341 1342 1348
  36. 1346 13 1341 1342 1348
  37. 1346 13342 1348 1342 1348
  38. 1346 13342 1348 1342 1348
  39. 1346 13342 1348 1342 1348
复制代码

猜测原因:定时器中断,usart2和usart1中断的优先级。

这里给出中断优先级配置
/// 配置USART2接收中断,蓝牙
  1. static void BLT_NVIC_Configuration(void)
  2. {
  3.     NVIC_InitTypeDef NVIC_InitStructure;
  4.     /* Configure the NVIC Preemption Priority Bits */
  5.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC_PriorityGroup_2

  6.     /* Enable the USARTy Interrupt */
  7.     NVIC_InitStructure.NVIC_IRQChannel = BLT_USART_IRQ;
  8.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;//0
  9.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//0
  10.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  11.     NVIC_Init(&NVIC_InitStructure);
  12. }
复制代码



/// 配置USART1接收中断,串口
  1. static void NVIC_Configuration(void)
  2. {
  3.   NVIC_InitTypeDef NVIC_InitStructure;
  4.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//2
  5.   NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  6.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  7.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  8.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  9.   NVIC_Init(&NVIC_InitStructure);
  10. }
复制代码

// 定时器中断优先级配置
  1. // 中断优先级配置
  2. static void BASIC_TIM_NVIC_Config(void)
  3. {
  4.     NVIC_InitTypeDef NVIC_InitStructure;
  5.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//0
  6.     NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;
  7.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //0
  8.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//3       
  9.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  10.     NVIC_Init(&NVIC_InitStructure);
  11. }
复制代码
另外给出定时器中断中,串口发送的程序
  1. void  BASIC_TIM_IRQHandler (void)
  2. {
  3.         if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET ) {       
  4.                 time++;
  5.                 if(time%100 == 0){//100ms一次的定时中断
  6.                         time_flag += 0.2 ;
  7.       time = 0;
  8.                         /* LED1 取反 */      
  9.                         LED1_TOGGLE;
  10.                         if(Snake_ready_flag == 1)
  11.                         {                               
  12.                                         if(BLT_USART_ReceiveData.receive_data_flag == 1)
  13.                                         {
  14.                         /*************蓝牙接收关节角度测试************/       
  15.                                                 DEBUG_USART_ReceiveData.uart_buff[DEBUG_USART_ReceiveData.datanum] = 0;                       
  16.                                                 get_SnakeData(BLT_USART_ReceiveData.uart_buff,BLT_USART_ReceiveData.datanum);
  17.                                                 for(int i = 0; i <5; i++)
  18.                                                 {
  19.                                                         printf("%d ", Angle_ReceiveData.angle1[i]);
  20.                                                 }
  21.                                                 printf("\n");
  22.                                         }
  23.                                 clean_rebuff();                       
  24.                         }

  25.                 }
  26.         TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);                   
  27.         }                        
  28. }
复制代码

希望大家能帮我找找丢包的问题到底是那里出错了哇

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-26 19:15 , Processed in 0.064059 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表