来源:嵌入式小萧

如今是一码在手通行无忧的天下。在这疫情管控的特殊时期更加显得二维码的重要性。不管到哪都需要你出示你的二维码以表示你没有到过危险区域,如果你到过有风险的区域停留过二维码就会显示为黄码,黄码在手哪都去不了,只能去做核酸出结果后恢复绿码。这样算是比较严格的管控了,但是非常有用,也是对更多人民群众安全的负责。

现在的世界大街小巷都是二维码的身影,作为一个嵌入式的开发人员当然是少不了对于二维码的相关学习。对于二维码的最深层的原理只要了解个大概就会,关键的还是先学会如果使用为主。

二维码的原理

二维条码/二维码(dimensional barcode)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息;在代码编制上巧妙地利用构成计算机内部逻辑基础的"0"、"1"比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。

二维码的应用

二维码的应用相对来说还是比较简单,因为有一些二维码的使用项目已经开源了,这就意味着项目中使用二维码不需要花费相应的资金去处理版权之类的事情。在嵌入式的开发中使用的比较多的编程语言还是C语言居多,所有在嵌入式中使用比较多的第三方开源二维码生成库是qrencode。下面使用该库的使用过程,希望可以提供一些使用上的思路和方法。

基于emWin之上的二维码生成对于最新版的emWin来说二维码的生成非常简单,因为新版的emWin已经把二维码生成包含在emWin之内,只需要调用相应的函数就可以实现,如下:
基于emWin5.48源码电脑仿真模拟
void MainTask(void) {
  •     GUI_HMEM QR_CODE;
  •     GUI_Init();
  •     if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
  •         GUI_ErrorOut("Not enough memory available.");
  •         return;
  •     }
  •     GUI_SetBkColor(GUI_DARKGRAY);
  •     GUI_Clear();
  •     //生成QR_CODE代码的句柄
  •     QR_CODE = GUI_QR_Create("abxsd", 8, GUI_QR_ECLEVEL_Q, 0);
  •     GUI_QR_Draw(QR_CODE, 30, 30);//显示二维码
  •     GUI_QR_Delete(QR_CODE);//释放存储二维码的内存空间
  •     while (1)
  •     {
  •     GUI_Delay(100);
  •     }
  • }
  • 复制代码
    fd7f13d691174a99867d8544b3e517ad?from=pc.jpg

    新版emwin还没有在STM32上面使用过。要移植的话还是要花点时间去处理。嫌麻烦的话那么就使用开发板提供的emwin相关项目模板去测试二维码的话就需要使用到qrencode开源项目文件。

    移植到STM32前最好是在电脑上先模拟仿真完成后再移到STM32上运行,这个的话更快一些,毕竟在电脑上更容易处理出现的各种问题。

    电脑Emwin仿真,二维码显示效果
    20ca884abf314a1fa8c0570839865e99?from=pc.jpg

    PC仿真移植过程

    在emwinPC仿真项目创建新的文件夹(用于放置qrencode相关文件和例程文件)再把qrencode库头文件(.h)和c文件(.c)复制到新创建的文件夹中。创建例程C文件。

    相关文件如下所示:
    a412eade7d7149338eb8bdb27f34468b?from=pc.jpg

    使用到的这些文件跟下载下来的有一定的区别,因为这些文件中有一个文件是前辈写的一个实现方法。

    d3d4548596b74c9eaf473340abdd9db7?from=pc.jpg
    使用软件生产emwin控件布局文件。
    9d74a622c38a4b7a89f1003582494bd6?from=pc.jpg
    生成文件的内容复制到PC端emwin项目内,修改相应函数。
    45e3e2cdf2804b17a8e6d4abc4f0ebe0?from=pc.jpg
    添加完后就是处理相关的报错问题。在电脑上编译没问题后把相关文件移植到STM32的程序项目。
    40f2216c31f34bc3998c4959f08b339a?from=pc.jpg
    编译验证。
    83f658a771ca4048a999e48f72bdc09c?from=pc.jpg
    qrencode同样在QT开发中的应用也是可以的。实现过程类似,相关的详细教程在网上可以找到,在这我就不说了。下面是我在QT中使用的过程相关截图。
    9461e0dbd1b84708a636124be3b15e17?from=pc.jpg
    721df50d42ad4628b4f06c93f6418ecf?from=pc.jpg
    1f835d28261f4bac8400d47f9f288c80?from=pc.jpg
    48fb6df892a3489d85b30b8ba1fbb40b?from=pc.jpg
    5b4d8e12f97d4c158cc327695de94899?from=pc.jpg
    ca91a61d92604333ba5f25a90a2a722a?from=pc.jpg
    来源:嵌入式小萧