zoukankan      html  css  js  c++  java
  • USART1_IRQHandler 函数的理解

     1 void USART1_IRQHandler(void) //串口 1 中断服务程序
     2 {
     3   u8 Res;
     4   #if SYSTEM_SUPPORT_OS //如果 SYSTEM_SUPPORT_OS 为真,则需要支持 OS
     5   OSIntEnter();
     6   #endif
     7   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
     8   //接收中断(接收到的数据必须是 0x0d 0x0a 结尾)
     9   {
    10     Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
    11     if((USART_RX_STA&0x8000)==0)//接收未完成15     {
    16       if(USART_RX_STA&0x4000)//接收到了 0x0d
    17       {
    18         if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    19         else USART_RX_STA|=0x8000; //接收完成了
    20       }
    21       else //还没收到 0X0D
    22       { 
    23         if(Res==0x0d)USART_RX_STA|=0x4000;
    24         else
    25         {
    26           USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
    27           USART_RX_STA++;
    28           if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
    29           //接收数据错误,重新开始接收
    30         } 
    31       }
    32     }
    33   }
    34 #if SYSTEM_SUPPORT_OS //如果 SYSTEM_SUPPORT_OS 为真,则需要支持 OS
    35 OSIntExit();
    36 #endif
    37 }

    下面这段话来自原子的stm32开发指南-库函数版本V1.3 129页。

    当接收到从电脑发过来的数据,把接收到的数据保存在 USART_RX_BUF 中,同时在接收状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车(回车的表示由 2 个字节组成:0X0D 和 0X0A)的第一个字节 0X0D 时,计数器将不再增加,等待0X0A 的到来,而如果 0X0A 没有来到,则认为这次接收失败,重新开始下一次接收。如果顺利接收到 0X0A,则标记 USART_RX_STA 的第 15 位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到 0X0D,那么在接收数据超过 USART_REC_LEN 的时候,则会丢弃前面的数据,重新接收。

     

     计算机向串口发送一串字符,一般不止一个,例如发送”abcdefg回车“。那么串口中断函数会执行9次,回车要执行两次串口中断。当串口中断函数第一次执行时,USART1->DR里面装的是字符a,下面以串口第一次执行来分析这个串口中断函数。

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)这是判断读数据寄存器是否空,因为接受到了a,所以不是空的,这个判断成立。

    Res =USART_ReceiveData(USART1);//(USART1->DR); 既然接受到了字符a,那么就要把他读取出来

      if((USART_RX_STA&0x8000)==0) 因为现在接受的是第一个字符,所以接收肯定没有完成,USART_RX_STA还是它的初始化值,于是第15位还是0,这个判断语句成立。于是要执行下面这句话  

    if(USART_RX_STA&0x4000)   USART_RX_STA的第14位仍然是0,所以这个判断不成立,所以会执行下面这句话   

     if(Res==0x0d) 当然这个判断也不成立,所以要执行下面这句话

    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;计算出接收的是第几个字符,然后装到缓存里面

    USART_RX_STA++;加1表明已经接收好了几个数据原文链接:https://blog.csdn.net/qq_36226810/article/details/82787905

    个人理解:相当于数组存储数值,当作缓冲

    但个别地方还不理解。。。慢慢看吧

  • 相关阅读:
    【React Native】某个页面禁用物理返回键
    【React Native】DeviceEventEmitter监听通知及带参数传值
    转载【React Native代码】手写验证码倒计时组件
    【React Native】 中设置 APP 名称、应用图标、为安卓添加启动图
    【React Native错误集】* What went wrong: Execution failed for task ':app:installDebug'.
    【React Native错误集】Import fails with "Failed to execute 'ImportScripts' on 'WorkerGlobalScope'"
    【React Native错误集】Android error “Could not get BatchedBridge, make sure your bundle is packaged properly” on start of app
    「React Native笔记」在React的 setState 中操作数组和对象的多种方法(合集)
    【React Native】Error: Attribute application@allowBackup value=(false) from AndroidManifest.xml
    坚果云如何使用二次验证码/谷歌身份验证器/两步验证/虚拟MFA?
  • 原文地址:https://www.cnblogs.com/action0/p/12741219.html
Copyright © 2011-2022 走看看