打印
[信息]

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

[复制链接]
267|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2021-3-18 16:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

先贴出中断函数:


[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]);  
  •   }  
  • }  
  • }  

使用特权

评论回复
沙发
kxsi| | 2021-4-7 12:11 | 只看该作者
这个程序裸奔就可以 是吗

使用特权

评论回复
板凳
aoyi| | 2021-4-7 12:12 | 只看该作者
适用于什么型号的啊

使用特权

评论回复
地板
gwsan| | 2021-4-7 12:14 | 只看该作者
全系列都可以吗

使用特权

评论回复
5
drer| | 2021-4-7 12:14 | 只看该作者
是不是还需要对io口进行配置啊

使用特权

评论回复
6
nawu| | 2021-4-7 12:16 | 只看该作者
数组最大可以设置成多少

使用特权

评论回复
7
YINQIAO| | 2021-4-7 12:36 | 只看该作者
发送数据时也用中断了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2003

主题

7060

帖子

10

粉丝