这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » [经验] STM32串口USART1中断接收和中断发送

共1条 1/1 1 跳转至

[经验] STM32串口USART1中断接收和中断发送

工程师
2019-09-17 17:14:37     打赏

 先贴出中断函数:

  1. [plain] view plain copy


  2.   void USART1_IRQHandler(void){


  3.   IF (USART_GetiTStatus(USART1, USART_IT_RXNE) != RESET) {


  4.   USART_ClearITPendingBit(USART1, USART_IT_RXNE);


  5.   USART1_Buffer[i++]=USART_ReceiveData(USART1); //USART1_Buffesh是一个自己定义的接收数组


  6.   if(i>3){


  7.   SendFlag = 1;


  8.   }


  9.   }


  10.   if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){ //USART_IT_TC这里也可替换


  11.   if(Open_Send_Flag){ //这是一个发送的标志


  12.   uart1_sendstring(temp_data);


  13.   USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //USART_IT_TC


  14.   Open_Send_Flag = 0;


  15.   }


  16.   else{


  17.   USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //USART_IT_TC


  18.   }


  19.   }


  20.   }

复制代码



  发送字符串的函数:

  1. [plain] view plain copy


  2.   void uart1_sendstring(uint8_t* cp)


  3.   {


  4.   while((*cp)!='\0')


  5.   {


  6.   Usart1_Send_isr(*cp);


  7.   cp++;


  8.   }


  9.   }

复制代码



  发送单个字符的函数:

  1. [plain] view plain copy


  2.   void Usart1_Send_isr(uint8_t ch){


  3.   USART_SendData(USART1, (uint8_t)ch);


  4.   while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET ); //这里做缓冲区是否发送完判断


  5.   }

复制代码


  STM32中断系统详细分析
  http://www.makeru.com.cn/live/3523_1745.html?s=45051
  然后在中断函数外面发送数据的时候,打开发送中断。USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //USART_IT_TC
  之后再贴出两个简单的串口接收和发送的测试小例子:
  第一种:中断接收并把接收到的数据直接发送。

  1. [plain] view plain copy


  2.   void USART1_IRQHandler(void){


  3.   unsigned char RxData;


  4.   if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {


  5.   USART_ClearITPendingBit(USART1, USART_IT_RXNE);


  6.   RxData=USART_ReceiveData(USART1);


  7.   RxData = RxData + 1;


  8.   USART_SendData(USART1,RxData);


  9.   }


  10.   }

复制代码



  优点:简单,适合很少量数据传输。
  缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。
  第二种:中断接收之后判断数据头和数据尾,如果正确就直接发送出去。

  1. [plain] view plain copy


  2.   void USART1_IRQHandler(void){


  3.   if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {


  4.   USART_ClearITPendingBit(USART1, USART_IT_RXNE);


  5.   USART1_Buffer[i++]=USART_ReceiveData(USART1);


  6.   }


  7.   if((USART1_Buffer[0] == 0x01) && (USART1_Buffer[i-1] == 0x02)){


  8.   Flag = 1;


  9.   }


  10.   if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET){ //溢出,不明白?


  11.   USART_CleaRFlag(USART1,USART_FLAG_ORE);


  12.   USART_ReceiveData(USART1);


  13.   }


  14.   if(Flag){


  15.   for(j = 0;j<20;j++){


  16.   USART_SendData(USART1,USART1_Buffer[j]);


  17.   }


  18.   }


  19.   }

复制代码



  相关的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中断系统
  http://www.makeru.com.cn/live/3523_1745.html?s=45051





关键词: STM32     串口     中断    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]