STM32+GM65二维码识别模块_gm65 条码识读模块原理-程序员宅基地

技术标签: STM32  GM65  扫码  

前言

朋友毕设需要用到扫码模块,但是网上这方面的资源比较少,下载源码还需要收费。所以自己写了一个简单实用的,大家可以来我这下载源码。

功能介绍

本案例主要实现的功能是,GM65扫描到二维码包含的信息后,将信息通过串口传输给32单片机,32单片机再将信息使用OLED显示屏显示出来,同时可以实现扫码开灯、关灯等功能。

主要硬件

STM32F103C8T6最小系统板、GM65二维码识别模块、0.96寸4针OLED显示屏

模块接线

GM65二维码识别模块—接32的串口3
TX—PB11 RX—PB10 VCC—5V GND—GND
4针OLED显示屏
SCL—PA5 SDA–PA7 VCC—3V3 GND—GND

实验效果

当二维码的内容是字符串D1时灯亮,是D0时灯灭。OLED显示屏的第2行显示了二维码的内容。第3行显示灯的开关。
在这里插入图片描述
当二维码的内容是字符串xixihaha时,不会执行开关灯的操作,但也会显示内容在显示屏上。
在这里插入图片描述
程序中,串口3收到二维码信息后会通过串口1返发给PC,故除了可以用显示屏看到效果外,也可以用串口助手看到二维码的内容。
在这里插入图片描述

二维码及模块的一些配置

1、二维码的生成是在微信小程序的草料二维码。
在这里插入图片描述

在这里插入图片描述

2、GM65模块设置成串行通讯模式,同时设置波特率为9600
当模块发出嘀嘀嘀声响时,说明设置成功。
在这里插入图片描述
3、如果觉得模块的灯太亮,声音太大可以按下面扫码设置
在这里插入图片描述
在这里插入图片描述

代码实现

main.c文件

/*=======================main.c======================*/
#include "stm32f10x.h"
#include "usart.h"
#include "led.h"
#include "oled.h"
#include "string.h"

u8 recv_ok = 0;       //接收完成标志
u8 uart_buf[32]={
    0};  //用于保存串口数据
u8 uart_cnt=0;        //用于定位串口数据的位置

int main()
{
    
    Init_Usart();   //初始化3个串口
	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(GPIOC,GPIO_Pin_13);   //关灯
				OLED_ShowString(0,32,(u8*)"LED OFF",16); 
			}
			else if(strstr((char*)uart_buf,"D1"))
			{
    
				GPIO_ResetBits(GPIOC,GPIO_Pin_13); //开灯
				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
		}
		
    }
}

//串口3中断
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);	//清空标志位
	}	
} 

资源下载

需要源码的可以自行下载。https://github.com/J-CHUN/STM32-GM65.git
下载操作:
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/NICHUN12345/article/details/124489502

智能推荐

bootstrap之 formgroup表单布局样式-程序员宅基地

文章浏览阅读748次。<form class="form-horizontal" role="form"> <fieldset> <legend>配置数据源</legend> <div class="form-gr_bootstrap form-group 样式

雅克比矩阵求导推导_雅可比求导-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏10次。首先,引入雅克比矩阵公式:J=[u1u2⋯une1e2⋯en]\mathbf{J}=\left[\begin{array}{c}\begin{array}{lll}\mathbf{u}_{1} & \mathbf{u}_{2} & \cdots & \mathbf{u}_{n}\end{array} \\\begin{array}{lll}\mathbf{e}_{1} & \mathbf{e}_{2} & \cdots & \mathbf{e}_{n}\_雅可比求导

数据结构与算法——每日一练(7月)_第行不能编译通过,因为只有一个-程序员宅基地

文章浏览阅读2.1k次。文章目录每日一练7.17.27.37.47.57.67.87.77.97.107.117.127.137.147.157.167.177.187.197.207.217.227.237.247.257.267.277.287.297.307.31每日一练7.1以下叙述中,正确的是()。A. 只要无向连通图中没有权值相同的边,则其最小生成树唯一B. 只要无向图中有权值相同的边,则其最小生成树一定不唯一C. 从n个顶点的连通图中选取n-1条权值最小的边,即可构成最小生成树D. 设连通图G含有n_第行不能编译通过,因为只有一个

SpringBoot Jpa +Oracle ORA-00001: 违反唯一约束条件 自增序列_jpa 唯一约束违规-程序员宅基地

文章浏览阅读2.2k次。@Entity@Data@Table(name = "PERSON")@SequenceGenerator(name="PersonSeq",sequenceName="PERSON_ID")public class Person { //主键自增长 @GeneratedValue(generator="PersonSeq") @Id private Long id; pr..._jpa 唯一约束违规

2015最新WebQQ3.0协议解析与实现-程序员宅基地

文章浏览阅读124次。2015最新WebQQ3.0协议解析与实现(一)2015最新webqq密码加密分析2015最新WebQQ3.0协议解析与实现(三)2015最新WebQQ3.0协议解析与实现(四)webqq协议综合篇,这个不是关于最新WebQQ的,但是内容很全。转载于:https://www.cnblogs.com/xwz0528/p/4800129.html..._webqq2015

VSCode 调试C/C++设置_vscode debug c++ setup commands-程序员宅基地

文章浏览阅读649次。进入 vscode 文件夹,找到 “.vscode” 文件夹,对配置文件配置文件 launch.json 和 tasks.json 进行设置(没有就新建):launch.json:需修改一处:将"miDebuggerPath" 选项设置为你的调试器(gdb.exe)所在位置,即 mingw64 的安装位置{ "version": "0.2.0", "configurations": [ { "name": "C/C++", _vscode debug c++ setup commands

随便推点

【计算机网络】适合考研人一看就会的 静态划分信道 详解_发送0时发送芯片序列的反码-程序员宅基地

文章浏览阅读1.1k次,点赞4次,收藏7次。静态划分信道一信道划分介质访问控制信道划分介质访问控制:将使用介质的每个设备与来自同一信道上的其他设备的通信隔离开,把时域和频域资源合理地分配给网络上的设备。多路复用技术:把多个信号组合在一条物理信道上进行传输,使得多个计算机或终端设备共享信道资源,提高信道利用率。把一条广播信道,逻辑上分成几条用于两个节点之间通信的互不干扰的子信道,实际就是把广播信道转变为点对点信道。频分多路复用FDM(并行)用户在分配到一定的频带后,在通信过程中自始至终都占用这个频带。频分复用的所有用户在同样的时间占用不同的_发送0时发送芯片序列的反码

雁过留痕 - 值得“在此一游”的网络资源(持续更新中)_雁过留痕可以表示来玩过吗-程序员宅基地

文章浏览阅读390次。有时候偶尔会发现一些很不错的网站,但时间长了,当想在网络上学习学习,开阔开阔视野,却总是不长记性。在这里记录一下,没准还能造福他人。技术类:Ray Wenderlich Tutorials for developers & gamers_雁过留痕可以表示来玩过吗

c++模拟鼠标事件_通过鼠标事件进行三维建模c++开发案例-程序员宅基地

文章浏览阅读1.6w次。Q: How can I emulate mouse events in an application?A:There are two API fucntions that you can use:'mouse_event()'. 'SendInput()'. Which of the two API functions should I use?The 'mouse_event()' function has been superseded by 'SendInput()' on Window NT/20_通过鼠标事件进行三维建模c++开发案例

Matlab2019b中配置最小均方误差滤波器(dsp.LMSFilter)详细设置-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏35次。主动降噪设计中涉及的最小均方误差算法(LMS)2019b版本中AudioToolbox添加的新功能设置注意:本程序与2016b版本以前不兼容主动降噪设计中最核心的算法莫过于LMS了,实在是太经典了,目前主流的多为LMS算法演化。后面会介绍LMS function的编写,在这里仅介绍如何快速的建立LMS滤波器并进行仿真设计。%% Least mean square filter 自适应滤波器工..._dsp.lmsfilter

51单片机时间戳相关函数_unix时间戳c51单片机-程序员宅基地

文章浏览阅读4.2k次,点赞5次,收藏9次。函数使用了long变量,比较占RAM,单片机要是空间紧张就别用了,会把mcu算糊涂的。/******* timestamp时间戳函数 开始**********/#define SECOND_OF_DAY 86400 //一天多少秒idata uchar DayOfMon[]={31,28,31,30,31,30,31,31,30,31,30,31};/*******************..._unix时间戳c51单片机

C语言之指针篇,快速上手系列-C语言之指针篇(一)-程序员宅基地

文章浏览阅读205次。指针的灵活运用使得c语言更加强大,指针是C语言中十分重要的部分,可以说指针是C语言的灵魂。当然指针不是万能的,但没有指针是万万不能的,有些操作没有指针是办不到的,如动态内存分配。鉴于学习指针的必要性,从现在开始介绍指针方面的知识,本篇主要介绍指针相关概念及指针的定义与应用两方面的内容:指针相关概念1、指针:我们使用的计算机内存为8G,系统为了更好地管理我们的内存,就为内存区的每一个字节都分配一个编..._c语言指针项目练手

推荐文章

热门文章

相关标签