weiwei4dk 发表于 2022-3-21 22:36

【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倍,具体大小根据你的显示屏分辨进行调整到合适。
    下面是工程代码,只需复制替换例程里的文件即可进行测试
   

豌豆爹 发表于 2022-3-23 09:49

这二维码生成看起来也挺简单的

muyichuan2012 发表于 2022-3-23 17:35

这么强

usysm 发表于 2022-12-5 22:40

这个二维码是怎么显示的?            

uptown 发表于 2022-12-6 14:40

oled好像只是能生成小像素的,怎么生成大的图片?

juliestephen 发表于 2022-12-6 16:40

动态生成图片的吗?            

weifeng90 发表于 2022-12-8 17:52

这个想法不错,简单实用。

q3158521294 发表于 2025-6-8 16:38

sscom串口调试软件怎么显示出二维码?谢谢。

chenqianqian 发表于 2025-6-11 22:01

不错,这种处理方式很简单。

ZenithSeeker 发表于 2025-6-13 13:01

程序里i++这段没看懂啊,这个生产的图片用记事本就能打开吗?

weiwei4dk 发表于 2025-6-21 14:55

ZenithSeeker 发表于 2025-6-13 13:01
程序里i++这段没看懂啊,这个生产的图片用记事本就能打开吗?

有条件可以自己运行一遍程序看看,或者使用SSCOM软件 自发自收 0xa8 0x80 两个数据,就可以知道二维码的方形黑块是怎么来的了
页: [1]
查看完整版本: 【AT-START-F425测评】串口printf + 二维码生成和串口打印