51单片机、STM32中生成QRCode二维码

2019-04-15 18:23发布

因QRCode 二维码的优越性,近几年来二维码在生活中的各处应用得到快速发展。它在生活中的应用相信大家都随处可见,在此不做详细介绍。随着应用的增多,最近很多朋友都问我,在很多论坛中也发现:有人问能不能再资源比较紧缺的MCU中生成QRCode二维码。很多时候它们在选定方案时候都拿不定主意,在此我给大家一个明确的信息,到底可以不可以在51单片机中生成(当然在51单片机中可行的话,在像STM32这样的MCU中肯定可行了),答案当然是肯定了,可以在51单片机中生成QRCode二维码。但是51单片机至少要具有多少资源呢?比如说有些51单片机只有1K不到的RAM,那肯定是不够的。下面我们从二维码的原理及需要多少资源开始往下讲。 二维码简介:(下面原理部分非原创,参考了网络资料文档) 大家知道二维码有些地方都是一样的,不管怎么变化,它们都不变。它有一些固定的信息,具体的信息内容大家可以去阅读QRCode标准文档,介绍的很清楚,有中文版本的,大家可以去网上找一下,如果找不到也可以像我索取Q1732158020。格式信息在这只简单介绍一下。

1、QRCode二维码总共40个版本,所以的版本编译原理格式都是一样的,只是存储内容不一样,方块数量不一样,当然点阵越多能存储的数据信息就越多,版本1起始21*21个方       块,之后每个版本每行增加4个方块,每列增加4个方块,版本2就是25*25。 2、寻位图 7*7 5*5 3*3 方块 1:1:3:1:1 3、分隔符在寻位图周围 都位浅 {MOD} 4、低位图 第6行,第6列 首位都是深 {MOD}
5、校正图 5*5 3*3 1*1 版本1没有 其他都具有校正图 6、空白区 围绕周围的空白边缘 7、多种编码模式A数字模式10位表示3个字符                B字母数字模式11位表示2个字符                C 8位字模式 一个字符8位                D日本汉字模式 每个双字节字符用11位表示                E混合模式。。。。
这里特别说明一下,可以消除一些朋友在看文档不够仔细认真的时候,或者直接移植了别人的代码,生成了二维码之后发现数据字节数一样,容错率也一样怎么图像大               小不一样呢?举个列子来说吧,比如一个二维码中包含01245678998765432101234567890,另外一个包含ABCDEFGHIJKLMNOPQRSTUVWXYZ0000,都是30个字               符,而他们方块数大小可能完全不一样,这是因为在编码的时候数字占有的空间数跟字母及汉字占有的空间数不一样,如果实际中遇到了这个问题的时候知道就行了。
数据编码:

ECI模式编码

输入数据变成位流
缺省模式:位流开头为第一模式的指示符
非缺省模式:ECI标头+一个或多个不同模式段(ECI标头:ECI模式指示符4位+ECI指定符8或16或24位),由ECI模式指示符最高位开始,指定符最低位结束
位流的其余部分第一段组成:模式指示符(4位)+字符计数指示符+数据位流 (每个模式段以模式指示符最高开始,数据流最低位结束)

字母数字模式编码
每2个字符11位表示,最后剩余1个字符6位表示
第1位*45+第2位结果转换为11位二进制
模式表示符(0010)+计数指示符(版本6及以下为9位)+将数据连接起来+终止符(0000,不够可以切短或省略)
所有得到的数据位流都将按8位分配到一个码字,如果最后一个不足8位在最后补零,(高位在前,低位在后)然后根据板号交替的填充
11101100和00010001(目的把剩余空间填满,具体填多少个根据版本容量和纠错等级查表剩余的数量来确定)有些版本容量不能被8整除
在最后需填写补零

格式信息:15位  bit0~1:纠错等级  bit2~4:掩模参考图行  bit5~bit14:按附录C的方法计算10位纠错数据 
 将上述得到的15位数据与101010000010010异或(相同位0,不同为1)得到的数据为图形符号上面的数据。

版本信息:6位数据位(表示7~40版本号)+12位纠错位(通过BCH(18,6)计算出来)(1~6不包含版本信息,7~40才包含包含版本信息)版本信息不进行掩模处理,
          本项目用不到这么高的版本先不做深入学习
结构链接:RQ码可以将16个不同的图形按一定顺序链接起来。扫描的时候不一定按顺序扫描,能自动按顺序排列。项目用不到暂不深入学习。

符号印制:尺寸可以根据实际调整,方块必须为矩形,外围空白区域为大于4倍矩阵宽度。
QRCode二维码介绍就到这里了,其实二维码的生成运算是一个很复杂的过程,中间有很多个步骤:1)固定格式信息数据的排布填充;2)数据取值转换;3)容错数的计算生成;4)把所有数据按数据流转换;5)按QRCode协议格式排列数据进行填充;6)对生成的图像进行掩膜;7)对所有掩膜生成的图像进行评分;8)评选得分最高的;9)最终确定生成的图像。
资源的需要: 这个可能是做单片机,ARM的朋友最想知道了解的了,因为在很论坛中有朋友问到,随机应用的推广,很多电子产品上都急需加上二维码的应用。下面就对RAM资源做个大概的预估。 首先根据你的项目需求,比如说我的二维码图像里面要存放100个字符或这个更多,这个时候可能就需要跟多的RAM空间了,在掩膜等各种计算的时候需要的缓存空间也响相应增大。还有一个方面容错率设置(容错率分为4个等级),如果容错率设置的越高,在二维码缺省的情况下,能译码的概率越大,这换来的代价就是要占用更多的资源,所以如果容错率设置的越高需要的RAM空间也会增大。当然RAM的消耗在编程处理中跟个人编程习惯,处理技巧也有关系,在是实践项目中,以50个字符为例,大概需要2K左右的RAM。50个字符的应用应该能适用于以51单片机为MCU的核心的所有应用了。2K RAM的51单片机市场上应该很常见了。
结语:感谢大家,有不妥之处请广大朋友留言给于指正,谢谢!交流企鹅:1732158020