Bootstrap

GM65条形码二维码扫描识别模块与STM32学习

目录

模块介绍:

简介:

原理介绍:

工作流程:

技术参数:

修改配置:

代码介绍:

串口函数:

主函数:


模块介绍:

简介:

GM65 条形码二维码扫描识别模块是一种基于激光扫描头的识别设备

原理介绍:

当GM65模块开始工作时,其内部的激光扫描头会发出一束激光光束,扫描通过镜子透过扫描窗口照射到条形码或二维码上。扫描头将扫描结果转化为电信号,通过模块内置的中央处理器进行解码和校验,最终以数字或文本形式输出结果。不同的码制采用不同的解码算法,因此模块需要具有多种码制解码的能力。

工作流程:

工作流程主要包括四个步骤:激光扫描、识别、解码和输出。        

  1. 激光扫描:当启动GM65 条形码二维码扫描识别模块时,内部的激光扫描头会发出一束激光束扫描条形码或二维码,从而捕捉到码制信息。

  2. 识别:扫描到码制信息后,GM65模块开始识别码制类型,包括一维码(如EAN-13、CODE-39、ITF-14等)和二维码(如QR码、Data Matrix码等)。

  3. 解码:确定码制类型后,GM65模块会使用相应的解码算法对码制信息进行解码,从而得到正确的数字或文本。

  4. 输出:最后,GM65模块将解码后的数字或文本以所设置的输出格式方式(如USB、串口、蓝牙等)输出给外部设备,如电脑、收银机等。

技术参数:

修改配置:

因为是扫描二维码的模块,可以通过扫描技术手册提供的二维码进行修改模块的配置。例如修改波特率

PS:本来此处是修改参数的二维码,但无法放出,如果有需要,请私信或者评论要技术指导手册

 恢复出厂设置、修改识读模式、感应模式等等,技术手册都有

代码介绍:

串口函数:

//初始化串口和中断
void My_USART3_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,  ENABLE);           //开启GPIOB时钟
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);            //开启APB2总线复用时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,  ENABLE);  
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,  ENABLE);          //开启USART1时钟
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOB ,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOB ,&GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate=9600;//波特率
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//控制流模式
	USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
	USART_InitStructure.USART_Parity=USART_Parity_No;//奇偶效验
	USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	USART_Init(USART3,&USART_InitStructure);
	
	USART_Cmd(USART3,ENABLE);//使能串口
	
	USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//打开接收非空中断
	
	NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//子优先级位为1(响应优先级)
	NVIC_Init(&NVIC_InitStructure);//设置相应的中断为响应优先级和抢占优先级
	
}	

//编写中断处理函数
void USART3_IRQHandler(void)      //串口3中断服务程序
{
	uint8_t d;

	//检测标志位
	if(USART_GetITStatus(USART3, USART_IT_RXNE)==SET)
	{
		//接收数据
		d = USART_ReceiveData(USART3);
	    //将接收到的数据依次保存到数组里
		uart_buf[uart_cnt++] = d;  
		//GM65模块发完一组数据后会自动发送一个回车符,所以通过检测是否接受到回车来判断数据是否接收完成
		if(d == 0x0D) 
		{
			recv_ok = 1;  //接收完成
		}
	
		//将接收到的数据,通过串口1返发给PC
		USART_SendData(USART1, d);
	    while( USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); //等待发送完成
		USART_ClearFlag(USART1,USART_FLAG_TXE);         //清空标志位
		USART_ClearITPendingBit(USART3,USART_IT_RXNE);	//清空标志位
	}	
} 

主函数:

int main()
{
  My_USART3_Init();   //初始化串口3
	uart_init(9600);    //初始化串口1
	LED_Init();      //初始化LED
	OLED_Init();     //初始化OLED
	OLED_Clear();        //OLED清屏
	
	printf("================GM65二维码模块测试=================\r\n");	
	OLED_ShowString(30,0,(u8*)"GM65 TEST!",16);
	OLED_Refresh();

    while(1)
    {
		
			if(recv_ok==1)  //接收完成
			{
				OLED_Clear();        //OLED清屏
				OLED_ShowString(30,0,(u8*)"GM65 TEST!",16); 
				//命令判断,当收到D0关灯,D1开灯 
				if(strstr((char*)uart_buf,"D0"))  
				{
					GPIO_SetBits(GPIOE,GPIO_Pin_5);   //关灯
					OLED_ShowString(0,32,(u8*)"LED OFF",16); 
				}
				else if(strstr((char*)uart_buf,"D1"))
				{
					GPIO_ResetBits(GPIOE,GPIO_Pin_5); //开灯
					OLED_ShowString(0,32,(u8*)"LED ON",16); 
				}
				OLED_ShowString(0,16,(u8*)"QRCode:",16); 
				OLED_ShowString(8*7,16,(u8*)uart_buf,16); //显示二维码内容
				OLED_Refresh();      //刷新OLED
				uart_cnt = 0;        //最后清零,重新计数
				recv_ok = 0;         //接收完成标志置0
			}
		
    }
}

详细说明一下:strstr((char*)uart_buf,"D0"

strstr() 函数是 C 标准库中的字符串处理函数,用于在一个字符串中查找另一个字符串,返回被查找串在目标串中第一次出现的地址,如果未找到则返回 NULL。

在这段代码中,strstr() 函数的作用是在 uart_buf 数组中查找是否包含字符串 "D0",如果找到了就返回这个字符串在 uart_buf 中第一次出现的地址。这样,如果接收到的数据为 "D0",那么这个条件语句就成立,会执行 GPIO_SetBits(GPIOE,GPIO_Pin_5) 将 GPIOE_Pin_5 置高,从而关闭 LED 灯。

需要注意的是,由于 uart_buf 数组是由无符号字符数组构成的,而 strstr() 函数是处理以 NULL 结尾 '\0' 的字符串,所以需要使用强制类型转换 (char*)uart_buf 数组转换为字符串。

;