STM32
直播中

fanB

8年用户 1461经验值
擅长:20615
私信 关注
[问答]

小白求助,求STM32串口USART1中断接收和中断发送的程序

小白求助,求STM32串口USART1中断接收和中断发送的程序

回帖(1)

杨雪

2021-11-16 10:02:13

先贴出中断函数:
  
[plain] view plain copy  void USART1_IRQHandler(void){  IF (USART_GetiTStatus(USART1, USART_IT_RXNE) != RESET) {  USART_ClearITPendingBit(USART1, USART_IT_RXNE);  USART1_Buffer[i++]=USART_ReceiveData(USART1); //USART1_Buffesh是一个自己定义的接收数组  if(i>3){  SendFlag = 1;  }  }  if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){ //USART_IT_TC这里也可替换  if(Open_Send_Flag){ //这是一个发送的标志  uart1_sendstring(temp_data);  USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //USART_IT_TC  Open_Send_Flag = 0;  }  else{  USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //USART_IT_TC  }  }  }
  
  发送字符串的函数:
  
[plain] view plain copy  void uart1_sendstring(uint8_t* cp)  {  while((*cp)!='')  {  Usart1_Send_isr(*cp);  cp++;  }  }
  
  发送单个字符的函数:
  
[plain] view plain copy  void Usart1_Send_isr(uint8_t ch){  USART_SendData(USART1, (uint8_t)ch);  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET ); //这里做缓冲区是否发送完判断  }
  
  然后在中断函数外面发送数据的时候,打开发送中断。USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //USART_IT_TC
  之后再贴出两个简单的串口接收和发送的测试小例子:
  第一种:中断接收并把接收到的数据直接发送。
  
[plain] view plain copy  void USART1_IRQHandler(void){  unsigned char RxData;  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {  USART_ClearITPendingBit(USART1, USART_IT_RXNE);  RxData=USART_ReceiveData(USART1);  RxData = RxData + 1;  USART_SendData(USART1,RxData);  }  }
  
  优点:简单,适合很少量数据传输。
  缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。
  第二种:中断接收之后判断数据头和数据尾,如果正确就直接发送出去。
  
[plain] view plain copy  void USART1_IRQHandler(void){  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {  USART_ClearITPendingBit(USART1, USART_IT_RXNE);  USART1_Buffer[i++]=USART_ReceiveData(USART1);  }  if((USART1_Buffer[0] == 0x01) && (USART1_Buffer[i-1] == 0x02)){  Flag = 1;  }  if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET){ //溢出,不明白?  USART_CleaRFlag(USART1,USART_FLAG_ORE);  USART_ReceiveData(USART1);  }  if(Flag){  for(j = 0;j<20;j++){  USART_SendData(USART1,USART1_Buffer[j]);  }  }  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分