STM32串口USART1中断接收和中断发送

  先贴出中断函数:

  

[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)!='\0')

  {

  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]);

  }

  }

  }

 

  

  相关的stm32串口以及中断相关的资料

  本帖隐藏的内容

  (stm32串口应用)

  http://www.makeru.com.cn/live/1392_1164.html?s=45051

  基于STM32讲解串口操作

  http://www.makeru.com.cn/live/1758_490.html?s=45051

  stm32之SPI通信

  http://www.makeru.com.cn/live/3523_1795.html?s=45051

  STM32中断系统

  http://www.makeru.com.cn/live/3523_1745.html?s=45051

转载于:https://www.cnblogs.com/QianD/p/11170601.html

你可能感兴趣的:(STM32串口USART1中断接收和中断发送)