[应用相关] STM32为什么用串口接收数据不全,时常丢失?

[复制链接]
763|2
 楼主| lalallalala 发表于 2022-1-28 12:11 | 显示全部楼层 |阅读模式

  1. ```#include "stm32f10x.h"
  2. #include "usart.h"
  3. #include "delay.h"
  4. void My_USART1_Init(void)

  5. {
  6.     GPIO_InitTypeDef GPIO_InitStrue;
  7.     USART_InitTypeDef USART_InitStrue;
  8.     NVIC_InitTypeDef NVIC_InitStrue;
  9.     //①使能GPIOA和串口1
  10.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  11.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);   
  12.      //②初始化GPIOA两个引脚
  13.     GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
  14.     GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
  15.     GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  16.     GPIO_Init(GPIOA,&GPIO_InitStrue);   
  17.     GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  18.     GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
  19.     GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
  20.     GPIO_Init(GPIOA,&GPIO_InitStrue);   
  21.     //③串口初始化
  22.     //波特率
  23.     USART_InitStrue.USART_BaudRate=115200;
  24.     //硬件控制
  25.     USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  26.     USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
  27.     //奇偶验证
  28.     USART_InitStrue.USART_Parity=USART_Parity_No;
  29.     //停止位
  30.     USART_InitStrue.USART_StopBits=USART_StopBits_1;
  31.     //字长
  32.     USART_InitStrue.USART_WordLength=USART_WordLength_8b;
  33.     USART_Init(USART1,&USART_InitStrue);
  34.     //串口使能
  35.     USART_Cmd(USART1,ENABLE);//③
  36.     USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接受中断
  37.     USART_ITConfig(USART1,USART_IT_ORE,ENABLE);//开启溢出中断
  38.     //初始化中断
  39.     NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
  40.     NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
  41.     NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
  42.     NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
  43.     NVIC_Init(&NVIC_InitStrue);


  44. }

  45. u8  usart_buf[4][USART_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节
  46. static volatile u16 count=0;//接收状态标记
  47. static volatile int p=0;
  48. void USART1_IRQHandler(void)
  49. {   
  50.     if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//开启接收中断
  51.     {
  52.         USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除标志中断位
  53.         p = (count / USART_REC_LEN) % 4;        
  54.         usart_buf[p][count % USART_REC_LEN] = USART_ReceiveData(USART1);   
  55.         count++;
  56.     }
  57. }


  58. int main(void)
  59. {  
  60.     //要使用中断,先要中断分组,一般在主函数的开头
  61.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  62.     My_USART1_Init();
  63.     delay_init();
  64.     while(1){
  65.         if(count > 0){
  66.             if(count % 256 == 0){
  67.                 for(int i = 0; i < 256; i++){   
  68.                     USART_SendData(USART1,usart_buf[p][i]);
  69.                     while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
  70.                 }
  71.                 printf("\r\n\r\n");
  72.                 delay_ms(100);
  73.             }           
  74.         }      
  75.     };   
  76. }



wode2008 发表于 2022-1-28 14:15 | 显示全部楼层
先在中断里直接打印接受的数据,先不处理。看看是否有丢失。
littlelida 发表于 2022-1-28 16:03 | 显示全部楼层
能收,但收不全?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

82

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部