[活动专区] 【AT-START-F425测评】串口printf + 二维码生成和串口打印

[复制链接]
 楼主| weiwei4dk 发表于 2022-3-21 22:36 | 显示全部楼层 |阅读模式
    最近在项目上想用上二维码生成并在显示屏显示,于是就找了些关于二维码生成的资料和程序,在这里也将二维码的程序加入到PRINTF例程里并直接通过串口将二维码打印了出来进行了测试。
    首先,打开printf工程,将下图中的QR_Encode.c加入工程
    QR1.png
    1.readme.txt 文档里有相关的说明,如果想更多了解相关内容,可以查看该文档。
    二维码生成的程序用起来也很容易,实际工程使用程序如下
  1. #include "at32f425_board.h"
  2. #include "at32f425_clock.h"
  3. #include "QR_Encode.h"

  4. /** @addtogroup AT32F425_periph_examples
  5.   * @{
  6.   */
  7.   
  8. /** @addtogroup 425_USART_printf USART_printf
  9.   * @{
  10.   */

  11. __IO uint32_t time_cnt = 0;

  12. /**
  13.   * [url=home.php?mod=space&uid=247401]@brief[/url]  main function.
  14.   * @param  none
  15.   * @retval none
  16.   */
  17. int main(void)
  18. {
  19.         unsigned char i = 0;
  20.         unsigned char x,y;
  21.         char p[12]="www.21ic.com";
  22.   system_clock_config();
  23.   at32_board_init();
  24.   uart_print_init(115200);

  25.   /* output a message on hyperterminal using printf function */
  26.   printf("usart printf example: retarget the c library printf function to the usart\r\n");

  27.   while(1)
  28.   {
  29.     printf("usart printf counter: %u\r\n",time_cnt++);
  30.     delay_sec(1);
  31.                 if(!i)
  32.                 {
  33.                         EncodeData(p);    //Generate QR code
  34.                         i++;
  35.                 }
  36.                
  37.                 while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  38.                 usart_data_transmit(PRINT_UART, 0x0d);
  39.                 while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  40.                 usart_data_transmit(PRINT_UART, 0x0a);
  41.                 for(x=0;x<MAX_MODULESIZE;x++)
  42.                 {
  43.                         for(y=0;y<MAX_MODULESIZE;y++)
  44.                         {
  45.                                 if(m_byModuleData[x][y])
  46.                                 {
  47.                                         while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  48.                                         usart_data_transmit(PRINT_UART, 0xa8);
  49.                                         while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  50.                                         usart_data_transmit(PRINT_UART, 0x80);
  51.                                 }
  52.                                 else
  53.                                 {
  54.                                         while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  55.                                         usart_data_transmit(PRINT_UART, ' ');
  56.                                         while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  57.                                         usart_data_transmit(PRINT_UART, ' ');
  58.                                 }
  59.                                 if(y==MAX_MODULESIZE-1)
  60.                                 {
  61.                                         while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  62.                                         usart_data_transmit(PRINT_UART, 0x0d);
  63.                                         while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  64.                                         usart_data_transmit(PRINT_UART, 0x0a);
  65.                                 }
  66.                                
  67.                         }
  68.                 }
  69.                
  70.   }
  71. }
     只需使用图中所示的程序行即可直接生成二维码数据
      QR2.png
    二维码数据全部存在 m_byModuleData[MAX_MODULESIZE][MAX_MODULESIZE] 数据里面,数组里每个数据 是 非0即1 的值。
   至于显示么,就用串口打印出来显示一下看看是否正常吧

  1. for(x=0;x<MAX_MODULESIZE;x++)
  2.                 {
  3.                         for(y=0;y<MAX_MODULESIZE;y++)
  4.                         {
  5.                                 if(m_byModuleData[x][y])
  6.                                 {
  7.                                         while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  8.                                         usart_data_transmit(PRINT_UART, 0xa8);
  9.                                         while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  10.                                         usart_data_transmit(PRINT_UART, 0x80);
  11.                                 }
  12.                                 else
  13.                                 {
  14.                                         while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  15.                                         usart_data_transmit(PRINT_UART, ' ');
  16.                                         while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  17.                                         usart_data_transmit(PRINT_UART, ' ');
  18.                                 }
  19.                                 if(y==MAX_MODULESIZE-1)
  20.                                 {
  21.                                         while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  22.                                         usart_data_transmit(PRINT_UART, 0x0d);
  23.                                         while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  24.                                         usart_data_transmit(PRINT_UART, 0x0a);
  25.                                 }
  26.                                
  27.                         }
  28.                 }
   打印方法是将1的数据打印输出“■” ,0的数据打印输出“ ”(空格),实际输出的效果如下    QR3.png
    使用手机扫描正常,之后加上LCD显示屏就可以显示二维码了。
    但是要在LCD上显示二维码要注意的是,直接显示的话,二维码太小了,需要对二维码进行等比放大后再显示,比如放大2倍或3倍,具体大小根据你的显示屏分辨进行调整到合适。
    下面是工程代码,只需复制替换例程里的文件即可进行测试
    printf.rar (5.12 MB, 下载次数: 43)

豌豆爹 发表于 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 两个数据,就可以知道二维码的方形黑块是怎么来的了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

1439

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部