OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3427|回复: 5

STM32串口扫描二维码只读取到第一位

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-25
在线时间
5 小时
发表于 2020-11-21 00:27:12 | 显示全部楼层 |阅读模式
1金钱
我用扫码枪扫描二维码把字符寄存在USART_RX_BUF[USART_REC_LEN]里,但是调用USART_RX_BUF[]的时候用if判断只会判断到第一个字符USART_RX_BUF[0]第二个字符变没了,导致我扫描10到19的二维码全都变成1.有没有大佬帮帮忙解决问题!!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-25
在线时间
5 小时
 楼主| 发表于 2020-11-21 00:41:31 | 显示全部楼层
用的是GM65,我还发现板子一上电马上扫描就可以,但是如果前面有执行程序的话,再调用USART_RX_BUF[]就会把10到19的二维码读成1
  1. #if EN_USART1_RX   //
  2. //
  3. //         
  4. u8 USART_RX_BUF[USART_REC_LEN];     //
  5. //
  6. //
  7. //
  8. //
  9. u16 USART_RX_STA=0;       //          

  10. void USART1_IRQHandler(void)
  11. {
  12.         u8 res;       
  13. #ifdef OS_CRITICAL_METHOD         //
  14.         OSIntEnter();   
  15. #endif
  16.         if(USART1->SR&(1<<5))//
  17.         {         
  18.                 res=USART1->DR;
  19.                 if((USART_RX_STA&0x8000)==0)//
  20.                 {
  21.                         if(USART_RX_STA&0x4000)//
  22.                         {
  23.                                 if(res!=0x0a)USART_RX_STA=0;//
  24.                                 else USART_RX_STA|=0x8000;        //
  25.                         }else //
  26.                         {       
  27.                                 if(res==0x0d)USART_RX_STA|=0x4000;
  28.                                 else
  29.                                 {
  30.                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
  31.                                         USART_RX_STA++;
  32.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//          
  33.                                 }                 
  34.                         }
  35.                 }                                                                                                
  36.         }                                                                                                                                                                           
复制代码
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2020-11-21 15:03:13 | 显示全部楼层
把协议和处理程序贴出来
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-25
在线时间
5 小时
 楼主| 发表于 2020-11-21 16:01:41 来自手机 | 显示全部楼层
用的是STM32F10
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-25
在线时间
5 小时
 楼主| 发表于 2020-11-21 16:09:38 | 显示全部楼层
  1. #include "sys.h"
  2. #include "usart.h"         
  3. #include "string.h"
  4. #include "math.h"

  5. #if SYSTEM_SUPPORT_UCOS
  6. #include "includes.h"                                                  
  7. #endif
  8.           
  9. #if 1
  10. #pragma import(__use_no_semihosting)            

  11. struct __FILE
  12. {
  13.         int handle;
  14.        
  15. };

  16. FILE __stdout;      

  17. _sys_exit(int x)
  18. {
  19.         x = x;
  20. }

  21. int fputc(int ch, FILE *f)
  22. {      
  23.         while((USART1->SR&0X40)==0);//&#209;-&#187;··¢&#203;í,&#214;±μ&#189;·¢&#203;ííê±&#207;   
  24.         USART1->DR = (u8) ch;      
  25.         return ch;
  26. }
  27. #endif

  28. //////////////////////////////////////////////////////////////////

  29. #if EN_USART1_RX   

  30.           
  31. u8 USART_RX_BUF[USART_REC_LEN];     

  32. u16 USART_RX_STA=0;   


  33. void USART1_IRQHandler(void)
  34. {
  35.         u8 res;       
  36. #ifdef OS_CRITICAL_METHOD        
  37.         OSIntEnter();   
  38. #endif
  39.         if(USART1->SR&(1<<5))
  40.         {         
  41.                 res=USART1->DR;
  42.                 if((USART_RX_STA&0x8000)==0)
  43.                 {
  44.                         if(USART_RX_STA&0x4000)
  45.                         {
  46.                                 if(res!=0x0a)USART_RX_STA=0;
  47.                                 else USART_RX_STA|=0x8000
  48.                         }else
  49.                         {       
  50.                                 if(res==0x0d)USART_RX_STA|=0x4000;
  51.                                 else
  52.                                 {
  53.                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
  54.                                         USART_RX_STA++;
  55.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;  
  56.                                 }                 
  57.                         }
  58.                 }                                                                                                
  59.         }
  60. #ifdef OS_CRITICAL_METHOD
  61.         OSIntExit();                                                                                           
  62. #endif
  63. }
  64. #endif                                                                                 


  65. void uart_init(u32 pclk2,u32 bound)
  66. {           
  67.         float temp;
  68.         u16 mantissa;
  69.         u16 fraction;          
  70.         temp=(float)(pclk2*1000000)/(bound*16);//μ&#195;μ&#189;USARTDIV
  71.         mantissa=temp;                                 //μ&#195;μ&#189;&#213;&#251;êy2&#191;·&#214;
  72.         fraction=(temp-mantissa)*16; //μ&#195;μ&#189;D&#161;êy2&#191;·&#214;         
  73.     mantissa<<=4;
  74.         mantissa+=fraction;
  75.         RCC->APB2ENR|=1<<2;   //ê1&#196;üPORTA&#191;úê±&#214;ó  
  76.         RCC->APB2ENR|=1<<14;  //ê1&#196;ü′&#174;&#191;úê±&#214;ó
  77.         GPIOA->CRH&=0XFFFFF00F;//IO×′ì&#172;éè&#214;&#195;
  78.         GPIOA->CRH|=0X000008B0;//IO×′ì&#172;éè&#214;&#195;
  79.                   
  80.         RCC->APB2RSTR|=1<<14;   //&#184;′&#206;&#187;′&#174;&#191;ú1
  81.         RCC->APB2RSTR&=~(1<<14);//í£&#214;1&#184;′&#206;&#187;                     
  82.         //2¨ì&#216;&#194;êéè&#214;&#195;
  83.         USART1->BRR=mantissa; // 2¨ì&#216;&#194;êéè&#214;&#195;         
  84.         USART1->CR1|=0X200C;  //1&#206;&#187;í£&#214;1,&#206;TD£&#209;é&#206;&#187;.
  85. #if EN_USART1_RX                  //è&#231;1&#251;ê1&#196;üá&#203;&#189;óê&#213;
  86.         //ê1&#196;ü&#189;óê&#213;&#214;D&#182;&#207;
  87.         USART1->CR1|=1<<8;    //PE&#214;D&#182;&#207;ê1&#196;ü
  88.         USART1->CR1|=1<<5;    //&#189;óê&#213;&#187;o3&#229;&#199;&#248;·&#199;&#191;&#213;&#214;D&#182;&#207;ê1&#196;ü                   
  89.         MY_NVIC_Init(3,3,USART1_IRQChannel,2);//×é2£&#172;×&#238;μíó&#197;&#207;è&#188;&#182;
  90. #endif
  91. }

  92. void  Uart1_PutChar(u8 ch)
  93. {
  94. USART1->DR = (u8) ch;  
  95. while((USART1->SR&0X40)==0);   
  96. }
复制代码
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-25
在线时间
5 小时
 楼主| 发表于 2020-11-21 16:11:24 | 显示全部楼层
本帖最后由 Patrick217 于 2020-11-21 16:27 编辑

调用程序我直接定义两个字符等于USART_RX_BUF[0]和USART_RX_BUF[1],但是前面的程序运行之后再去扫描二维码好像就只会接收第一个字符
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 18:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表