您的位置 首页 数字

STM32-串口试验学习笔记

USART1_IRQHandler(void)函数:当串口1发生了相应的中断,就会跳到改函数执行。这里设计了一个小小的接收协议(系统并未定义):通过这个

USART1_IRQHandler(void)函数:

当串口1发生了相应的中止,就会跳到改函数履行。这儿规划了一个小小的接纳协议(体系并未界说):经过这个函数,合作一个数组USART_RX_BUF[ ],一个接纳状况寄存器USART_RX_STA完结对串口的数据的接纳办理。USART_RX_BUF[ ]最大值为64,也便是一次接纳的数据最大不能超越64字节。USART_RX_STA是一个接纳状况寄存器,其各位的界说如表所示:

(留意:这个是作者规划的协议,怎样判别串口接纳一组数据结束?因为每次接纳的数据长度不一样,少的就3个8位数据,多的时分有十多个,这个数据个数是不定的,且没规则的数据,有什么好的办法让它接纳完好?

协议的规划思路如下:

当接纳到从电脑发过来的数据,把接纳到的数据保存在 USART_RX_BUF 中,一起在接纳状况寄存器(USART_RX_STA)中计数接纳到的有用数据个数,当收到回车(0X0D,0X0A)的第一个字节 0X0D时,标志位即第六方位1,计数器将不再添加,等候 0X0A的到来,而假如 0X0A 没有来到,则以为这次接纳失利,从头开端下一次接纳。假如顺畅接纳到 0X0A,则符号 USART_RX_STA的第七位,这样完结一次接纳,并等候该位被其他程序铲除,然后开端下一次的接纳,而假如迟迟没有收到 0X0D,那么在接纳数据超越 64 个了,则会丢掉前面的数据,从头接纳。因为这个寄存器是作者界说,咱们了解时或许简单模糊,其实这个跟一般寄存器相似,只不过是作者界说了一个8位数,规则了它每位的界说,前两位是两个个标志位,后六位用来计数,这样就好了解了。函数代码如下:

[cpp]view plaincopy

  1. voidUSART1_IRQHandler(void)
  2. {
  3. u8res;
  4. if(USART1->SR&(1<<5))//接纳到数据USART1应该是作者界说的一个结构体,内含各个寄存器
  5. {
  6. res=USART1->DR;
  7. if((USART_RX_STA&0x80)==0)//接纳未完结
  8. {
  9. if(USART_RX_STA&0x40)//接纳到了0x0d
  10. {
  11. if(res!=0x0a)USART_RX_STA=0;//接纳过错,从头开端
  12. elseUSART_RX_STA|=0x80;//接纳完结了
  13. }else//还没收到0X0D
  14. {
  15. if(res==0x0d)USART_RX_STA|=0x40;
  16. else
  17. {
  18. USART_RX_BUF[USART_RX_STA&0X3F]=res;
  19. USART_RX_STA++;
  20. if(USART_RX_STA>63)USART_RX_STA=0;//接纳数据过错,从头开端接纳
  21. }
  22. }
  23. }
  24. }
  25. }

其实咱们能够不必协议法

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/261452.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部