您尚未登录。

楼主 # 2022-03-21 18:04:11

xboot
会员
注册时间: 2019-10-15
已发帖子: 675
积分: 421

发现一个蛮有创意的二维码生成及展示方式,超级终端模式,我用来在系统上电时通过串口来展示芯片唯一ID了。

偶然发现的,觉得蛮有创意,就集成进xboot,每次上电开机,串口都会通过二维码的形式展示芯片唯一ID。

qrcode_20220321-1803.png


还见到另外一个创意,也觉得蛮有意思,PC跟手机传文件,写个命令行的程序,运行参数带文件路径,运行后开启http服务,并通过终端展示二维码,然后手机微信扫码,就直接下载了。也觉得蛮有用。

离线

楼主 #1 2022-03-21 18:05:44

xboot
会员
注册时间: 2019-10-15
已发帖子: 675
积分: 421

Re: 发现一个蛮有创意的二维码生成及展示方式,超级终端模式,我用来在系统上电时通过串口来展示芯片唯一ID了。

补充下,需要终端开启UTF8支持,对于minicom可以通天 -R参数来选择utf8

sudo minicom -R utf8 -D /dev/ttyUSB0 

离线

楼主 #2 2022-03-21 18:13:46

xboot
会员
注册时间: 2019-10-15
已发帖子: 675
积分: 421

Re: 发现一个蛮有创意的二维码生成及展示方式,超级终端模式,我用来在系统上电时通过串口来展示芯片唯一ID了。

生成串口二维码的代码,不复杂,就4种字符,其中一个是空格,其他是UTF8字符。支持反显,大部分linux终端,都是黑底白字,所有需要反色显示,当然对于微信,无所谓,正反都可以,但阿里的app,就不支持反显扫码了,这一点,还是微信做的好点。

/* ▀▄█ */
#define UTF8_EMPTY(inv)			do{ if(inv) { *p++ = 0xe2; *p++ = 0x96; *p++ = 0x88; } else { *p++ = 0x20; } } while(0)
#define UTF8_TOPHALF(inv)		do{ if(inv) { *p++ = 0xe2; *p++ = 0x96; *p++ = 0x84; } else { *p++ = 0xe2; *p++ = 0x96; *p++ = 0x80; } } while(0)
#define UTF8_BOTTOMHALF(inv)	do{ if(inv) { *p++ = 0xe2; *p++ = 0x96; *p++ = 0x80; } else { *p++ = 0xe2; *p++ = 0x96; *p++ = 0x84; } } while(0)
#define UTF8_FULL(inv)			do{ if(inv) { *p++ = 0x20; } else { *p++ = 0xe2; *p++ = 0x96; *p++ = 0x88; } } while(0)
#define UTF8_NEWLINE()			do{ *p++ = '\r'; *p++ = '\n'; } while(0)
#define UTF8_END()				do{ *p++ = '\0'; } while(0)

char * qrcgen_tostring(const char * txt, int invert)
{
	uint8_t qrc[QRCGEN_BUFFER_LEN_MAX];
	uint8_t tmp[QRCGEN_BUFFER_LEN_MAX];
	int qrs, x, y, i;
	int t, b;
	char *s, *p;

	if(qrcgen_encode_text(txt, tmp, qrc, QRCGEN_ECC_MEDIUM, QRCGEN_VERSION_MIN, QRCGEN_VERSION_MAX, QRCGEN_MASK_AUTO, 1))
	{
		qrs = qrcgen_get_size(qrc);
		if(qrs > 0)
		{
			p = s = malloc(((qrs + 4) * 3 + 2) * (qrs / 2 + 1 + 2) + 1);
			if(s)
			{
				for(i = 0; i < qrs + 4; ++i)
					UTF8_EMPTY(invert);
				UTF8_NEWLINE();
				for(y = 0; y < qrs; y += 2)
				{
					UTF8_EMPTY(invert);
					UTF8_EMPTY(invert);
					for(x = 0; x < qrs; x++)
					{
						t = qrcgen_get_pixel(qrc, x, y);
						b = 0;
						if(y + 1 < qrs)
							b = qrcgen_get_pixel(qrc, x, y + 1);
						if(t)
						{
							if(b)
								UTF8_FULL(invert);
							else
								UTF8_TOPHALF(invert);
						}
						else
						{
							if(b)
								UTF8_BOTTOMHALF(invert);
							else
								UTF8_EMPTY(invert);
						}
					}
					UTF8_EMPTY(invert);
					UTF8_EMPTY(invert);
					UTF8_NEWLINE();
				}
				for(i = 0; i < qrs + 4; i++)
					UTF8_EMPTY(invert);
				UTF8_NEWLINE();
				UTF8_END();
				return s;
			}
		}
	}
	return NULL;
}

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn