【AT-START-F425测评】串口printf + 二维码生成和串口打印
最近在项目上想用上二维码生成并在显示屏显示,于是就找了些关于二维码生成的资料和程序,在这里也将二维码的程序加入到PRINTF例程里并直接通过串口将二维码打印了出来进行了测试。首先,打开printf工程,将下图中的QR_Encode.c加入工程
1.readme.txt 文档里有相关的说明,如果想更多了解相关内容,可以查看该文档。
二维码生成的程序用起来也很容易,实际工程使用程序如下
#include "at32f425_board.h"
#include "at32f425_clock.h"
#include "QR_Encode.h"
/** @addtogroup AT32F425_periph_examples
* @{
*/
/** @addtogroup 425_USART_printf USART_printf
* @{
*/
__IO uint32_t time_cnt = 0;
/**
* @briefmain function.
* @paramnone
* @retval none
*/
int main(void)
{
unsigned char i = 0;
unsigned char x,y;
char p="www.21ic.com";
system_clock_config();
at32_board_init();
uart_print_init(115200);
/* output a message on hyperterminal using printf function */
printf("usart printf example: retarget the c library printf function to the usart\r\n");
while(1)
{
printf("usart printf counter: %u\r\n",time_cnt++);
delay_sec(1);
if(!i)
{
EncodeData(p); //Generate QR code
i++;
}
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, 0x0d);
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, 0x0a);
for(x=0;x<MAX_MODULESIZE;x++)
{
for(y=0;y<MAX_MODULESIZE;y++)
{
if(m_byModuleData)
{
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, 0xa8);
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, 0x80);
}
else
{
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, ' ');
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, ' ');
}
if(y==MAX_MODULESIZE-1)
{
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, 0x0d);
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, 0x0a);
}
}
}
}
} 只需使用图中所示的程序行即可直接生成二维码数据
二维码数据全部存在 m_byModuleData 数据里面,数组里每个数据 是 非0即1 的值。
至于显示么,就用串口打印出来显示一下看看是否正常吧
for(x=0;x<MAX_MODULESIZE;x++)
{
for(y=0;y<MAX_MODULESIZE;y++)
{
if(m_byModuleData)
{
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, 0xa8);
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, 0x80);
}
else
{
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, ' ');
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, ' ');
}
if(y==MAX_MODULESIZE-1)
{
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, 0x0d);
while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
usart_data_transmit(PRINT_UART, 0x0a);
}
}
} 打印方法是将1的数据打印输出“■” ,0的数据打印输出“ ”(空格),实际输出的效果如下
使用手机扫描正常,之后加上LCD显示屏就可以显示二维码了。
但是要在LCD上显示二维码要注意的是,直接显示的话,二维码太小了,需要对二维码进行等比放大后再显示,比如放大2倍或3倍,具体大小根据你的显示屏分辨进行调整到合适。
下面是工程代码,只需复制替换例程里的文件即可进行测试
这二维码生成看起来也挺简单的 这么强 这个二维码是怎么显示的? oled好像只是能生成小像素的,怎么生成大的图片? 动态生成图片的吗? 这个想法不错,简单实用。 sscom串口调试软件怎么显示出二维码?谢谢。 不错,这种处理方式很简单。 程序里i++这段没看懂啊,这个生产的图片用记事本就能打开吗? ZenithSeeker 发表于 2025-6-13 13:01
程序里i++这段没看懂啊,这个生产的图片用记事本就能打开吗?
有条件可以自己运行一遍程序看看,或者使用SSCOM软件 自发自收 0xa8 0x80 两个数据,就可以知道二维码的方形黑块是怎么来的了
页:
[1]