前言
朋友毕设需要用到扫码模块,但是网上这方面的资源比较少,下载源码还需要收费。所以自己写了一个简单实用的,大家可以来我这下载源码。
功能介绍
本案例主要实现的功能是,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文件文章来源:https://uudwc.com/A/b1yR9
/*=======================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
下载操作:
文章来源地址https://uudwc.com/A/b1yR9