目录
模块介绍:
简介:
原理介绍:
工作流程:
技术参数:
修改配置:
代码介绍:
串口函数:
主函数:
GM65 条形码二维码扫描识别模块是一种基于激光扫描头的识别设备
当GM65模块开始工作时,其内部的激光扫描头会发出一束激光光束,扫描通过镜子透过扫描窗口照射到条形码或二维码上。扫描头将扫描结果转化为电信号,通过模块内置的中央处理器进行解码和校验,最终以数字或文本形式输出结果。不同的码制采用不同的解码算法,因此模块需要具有多种码制解码的能力。
工作流程主要包括四个步骤:激光扫描、识别、解码和输出。
激光扫描:当启动GM65 条形码二维码扫描识别模块时,内部的激光扫描头会发出一束激光束扫描条形码或二维码,从而捕捉到码制信息。
识别:扫描到码制信息后,GM65模块开始识别码制类型,包括一维码(如EAN-13、CODE-39、ITF-14等)和二维码(如QR码、Data Matrix码等)。
解码:确定码制类型后,GM65模块会使用相应的解码算法对码制信息进行解码,从而得到正确的数字或文本。
输出:最后,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
数组转换为字符串。