STM32+二维码扫描模块(QR_Scaner)实现门禁系统

这里使用的是SMT32F103RCT6核心板

二维码扫描模块使用的是窜口通信,可以使用USB转TTL配合微信小程序(二维码生成器)生成二维码,模块RXD,TXD一定要跟TTL的RXD,TXD反接,使用窜口调休助手就可以观察二维码扫描模块的的效果

STM32搭配二模块扫描模块实现门禁

二维码启动C文件

#include <string.h>
#include "QR_Scaner.h"
#include "usart.h"
#include "systick.h"

uint8_t        TmpBuf[1];
uint8_t        QRScanerRxBuf[1024];
__IO uint32_t    QR_Scaner_RxIdx = 0;

uint8_t complete_flag = 0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART2)
    {
        if(TmpBuf[0] != 0x00)
            QRScanerRxBuf[QR_Scaner_RxIdx++] = TmpBuf[0];
        
        //HAL_UART_Transmit(&huart1, (uint8_t *)TmpBuf, 1, 0xffff);
        
        if(QR_Scaner_RxIdx >= sizeof(QRScanerRxBuf))
        {
            memset(QRScanerRxBuf, 0x00, sizeof(QRScanerRxBuf));
            QR_Scaner_RxIdx = 0;
            printf("QRScanerRxBuf 已满\r\n");
        }
        
        HAL_UART_Receive_IT(&huart2, TmpBuf, 1);
    }
}

char multip_scaner_cmd[] = "AT+SCAN=0\r\n";    //全速扫码
char single_scaner_cmd[] = "AT+SCAN=1\r\n";    //单次扫码

int scan_mode_set(uint8_t mode)
{
    memset(QRScanerRxBuf, 0x00, sizeof(QRScanerRxBuf));
    QR_Scaner_RxIdx = 0;    
    
    switch(mode)
    {
        case 0:
            HAL_UART_Transmit(&huart2, (uint8_t *)multip_scaner_cmd, strlen(multip_scaner_cmd), 100);
            break;
        case 1:
            HAL_UART_Transmit(&huart2, (uint8_t *)single_scaner_cmd, strlen(single_scaner_cmd), 100);
            break;
        default:
            return -1;
    }    
        
    delayms(20);

    if(strstr((char *)QRScanerRxBuf, "[AT]OK\r\n"))
    {
        return 0;
    }
    else
    {
        return -1;
    }
}

#define QR_SCANER_RESET_RETURN        "OK! - [QBoard][A very outstanding Bar Code Scanner]\r\n"

#define PASS_WORD    "1234567890"            // 默认的门禁密码,修改成自己的密码,也就是二维码的内容。

void QR_Door_Control(void)
{    
    uint32_t tick_start = 0;
    
    printf("---欢迎使用二维码门禁系统---\r\n");
    
    memset(QRScanerRxBuf, 0x00, sizeof(QRScanerRxBuf));
    QR_Scaner_RxIdx = 0;
    

    // 启动串口接收
    HAL_UART_Receive_IT(&huart2, TmpBuf, 1);
    
    // 等待二维码扫描模块启动
    tick_start = get_systicks();
    while(1)
    { 
        if(QR_Scaner_RxIdx==0)
        {
            printf("\r\n .二维码扫描模块已启动...\r\n");
            break;
        }
        if(query_time(tick_start, 5000))
        {
            goto exit;
        }
    }
    printf("\r\n .已进入扫码识别模式,请扫码开门--->\r\n");

    memset(QRScanerRxBuf, 0x00, sizeof(QRScanerRxBuf));
    QR_Scaner_RxIdx = 0;    
    while(1)
    {
        if(QR_Scaner_RxIdx==0)
        {        
            /* 等待数据收完 */
            delayms(100);
            
            /* 对比收到的数据和密码 */
            if(strcmp((char *)QRScanerRxBuf, PASS_WORD"\r\n") == 0)
            {
                //printf("密码是:%s", (char *)QRScanerRxBuf);
                printf("\r\n .门禁密码正确 <---\r\n");
                delayms(1000);
            }
            else
            {
                printf("\r\n .门禁密码错误!\r\n");
                delayms(1000);
            }
            
            // 门已关闭,重新开始扫码开门
            if(scan_mode_set(1) != 0)
            {
                printf("设置单次扫码模式失败2\r\n");
                break;
            }    
            
            memset(QRScanerRxBuf, 0x00, sizeof(QRScanerRxBuf));
            QR_Scaner_RxIdx = 0;                
        }    
    }
    
exit:
    
    printf("进入扫码识别模式失败,请检查硬件连接。\r\n");
    printf("QRScanerRxBuf:%s", QRScanerRxBuf);
}

#ifndef __QR_SCANER_H__
#define __QR_SCANER_H__

void QR_Door_Control(void);

#endif

主函数

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  
  QR_Door_Control();    
  LED_Control();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
    printf("rest\n");
  while (1)
  {
   LED_R_ON;
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

 

 

 

 

版权声明:本文为CSDN博主「她与樱花皆落503」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_59310673/article/details/119520870

生成海报
点赞 0

她与樱花皆落503

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

RT-Thread Studio移植LAN8720A驱动

RTT网络协议栈驱动移植(霸天虎) 1、新建工程 ​ 工程路径不含中文路径名,工程名用纯英文不含任何符号。 2、用CubeMx配置板子外设 2.1、配置时钟 ​ 按照自己板子配置相应时钟。

ESP8266 无限重启踩坑

最近做了一个电子墨水屏万年历,在移植屏幕代码时遇到了esp8266无限软复位的问题,如果你的串口打印是以下图片所示,那么恭喜你问题解决了。 造成软复位的原因是因为,程序里有死循环&#xf

Renode应用:在RISC-V核上运行FreeRTOS

本篇记录通过Renode在RISC-V核上运行FreeRTOS demo的情况。本来不准备写这一篇,但是发现近期工作学习密度实在太大,上周工作的中间结果这周竟然完全想不起来了,不得不又花了一些时间从头摸

Lin总线通信在STM32作为主机代码以及从机程序

距离上次做资料准备已经过去六天了。最近在学车,上周末就没有开电脑。这周开始进行了Lin通信的代码整理,目前是可以正常通信的了,采用的是增强型校验方式。后期再进一步跟进研究。。。更新一博,留