您尚未登录。

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

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

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

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

qrcode_20220321-1803.png


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

离线

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

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

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

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

sudo minicom -R utf8 -D /dev/ttyUSB0 

离线

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

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

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;
}

离线

#3 2022-03-21 18:16:52

yelong98
会员
注册时间: 2020-06-03
已发帖子: 83
积分: 50.5

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

牛逼坏了,这个白色是什么字符叠加起来的效果?

离线

#4 2022-03-21 18:20:07

cube
会员
注册时间: 2021-03-11
已发帖子: 262
积分: 176.5

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

道理我都懂,但是那个图片是怎么生成的?没有看明白。

离线

#5 2022-03-21 18:29:50

echo
会员
注册时间: 2020-04-16
已发帖子: 217
积分: 229.5

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

超级终端是白底黑字。二维码方便手机这类设备直接扫描,PC的话,直接就Ctrl+C Ctrl+V了

离线

#6 2022-03-21 18:35:28

cube
会员
注册时间: 2021-03-11
已发帖子: 262
积分: 176.5

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

cube 说:

道理我都懂,但是那个图片是怎么生成的?没有看明白。

看了楼上的代码,基本明白了,感谢楼主的骚操作。

离线

#7 2022-03-22 09:36:36

touchey
会员
注册时间: 2020-05-18
已发帖子: 105
积分: 22

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

@xboot
脑洞真大👍

离线

页脚

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

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