串口传输文件+ubuntu系统点阵汉字的字模读取与显示

串口传输文件的练习与点阵汉字字模读取 将两台笔记本电脑,借助 usb转rs232 模块和杜邦线,建立起串口连接。然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件(图片、视频和压缩包软件)传输到另外一台电脑,预算文件大小、波特率和传输时间三者之间的关系,并对比实际传输时间。 阅读详情

一、汉字点阵库使用原理

  1. 汉字编码
    1.1 区位码
    在国标 GD2312—80 中规定,所有的国标汉字及符号分配在一个 94 行、94 列的方阵中,方阵的每一行称为一个“区”,编号为 01 区到 94 区,每一列称为一个“位”,编号为01 位到 94 位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯数字就是它们的“区位码”。区位码的前两位是它的区号,后两位是它的位号。用区位码就可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着一个唯一的区位码。汉字“母”字的区位码是 3624,表明它在方阵的 36 区 24 位,问号“?”的区位码为0331,则它在 03 区 3l 位。
    1.2 机内码
    汉字的机内码是指在计算机中表示一个汉字的编码。机内码与区位码稍有区别。如上所述,汉字区位码的区码和位码的取值均在 1~ 94 之间,如直接用区位码作为机内码,就会与基本 ASCII 码混淆。为了避免机内码与基本 ASCII 码的冲突,需要避开基本 ASCII 码中的控制码(00H~1FH),还需与基本 ASCII 码中的字符相区别。为了实现这两点,可以先在区码和位码分别加上 20H,在此基础上再加 80H(此处“H”表示前两位数字为十六进制数)。经过这些处理,用机内码表示一个汉字需要占两个字节,分别 称为高位字节和低位字节,这两位字节的机内码按如下规则表示:
    高位字节 = 区码 + 20H + 80H(或区码 + A0H)
    低位字节 = 位码 + 20H + 80H(或位码 + A0H)
  2. 点阵字库结构
    在汉字的点阵字库中,每个字节的每个位都代表一个汉字的一个点,每个汉字都是由一个矩形的点阵组成,0 代表没有,1 代表有点,将 0 和 1 分别用不同颜色画出,就形成了一个汉字。
  3. 汉字点阵获取
    汉字点阵字库是根据区位码的顺序进行存储的,因此,我们可以根据区位来获取一个汉字的点阵,它的计算公式如下:
    点阵起始位置 = ((区码- 1)*94 + (位码 – 1)) * 汉字点阵字节数

二、实现代码

  • 这里面用的是2424的汉字库,而ASCII库用的是816的字库,因为用的字库不一样,所以汉字和ASCII码对应的字符需要分别判断,具体的运算思路代码备注里是写了的
#include<iostream>

#include<opencv/cv.h>

#include"opencv2/opencv.hpp"

#include<opencv/cxcore.h>

#include<opencv/highgui.h>

#include<math.h>

using namespace cv;

using namespace std;

void paint_chinese(Mat& image,int x_offset,int y_offset,unsigned long offset);

void paint_ascii(Mat& image,int x_offset,int y_offset,unsigned long offset);

void put_text_to_image(int x_offset,int y_offset,String image_path,char* logo_path);

int main(){

    String image_path="tearsgirl.png";

    char* logo_path="logo1.txt";

    put_text_to_image(20,300,image_path,logo_path);

    return 0;

}



void paint_ascii(Mat& image,int x_offset,int y_offset,unsigned long offset){

    //绘制的起点坐标

	Point p;

	p.x = x_offset;

	p.y = y_offset;

	 //存放ascii字膜

	char buff[16];           

	//打开ascii字库文件

	FILE *ASCII;

	if ((ASCII = fopen("Asci0816.zf", "rb")) == NULL){

		printf("Can't open ascii.zf,Please check the path!");

		//getch();

		exit(0);

	}

	fseek(ASCII, offset, SEEK_SET);

	fread(buff, 16, 1, ASCII);

	int i, j;

	Point p1 = p;

	for (i = 0; i<16; i++)                  //十六个char

	{

		p.x = x_offset;

		for (j = 0; j < 8; j++)              //一个char八个bit

		{

			p1 = p;

			if (buff[i] & (0x80 >> j))    /*测试当前位是否为1*/

			{

				/*

					由于原本ascii字膜是8*16的,不够大,

					所以原本的一个像素点用4个像素点替换,

					替换后就有16*32个像素点

					ps:感觉这样写代码多余了,但目前暂时只想到了这种方法

				*/

				circle(image, p1, 0, Scalar(0, 0, 255), -1);

				p1.x++;

				circle(image, p1, 0, Scalar(0, 0, 255), -1);

				p1.y++;

				circle(image, p1, 0, Scalar(0, 0, 255), -1);

				p1.x--;

				circle(image, p1, 0, Scalar(0, 0, 255), -1);

				

			}						

			p.x+=2;            //原来的一个像素点变为四个像素点,所以x和y都应该+2

		}

		p.y+=2;

	}

}



void paint_chinese(Mat& image,int x_offset,int y_offset,unsigned long offset){//在图片上画汉字

    Point p;

    p.x=x_offset;

    p.y=y_offset;

    FILE *HZK;

    char buff[72];//72个字节,用来存放汉字的

    if((HZK=fopen("HZKf2424.hz","rb"))==NULL){

        printf("Can't open HZKf2424.hz,Please check the path!");

        exit(0);//退出

    }

    fseek(HZK, offset, SEEK_SET);/*将文件指针移动到偏移量的位置*/

    fread(buff, 72, 1, HZK);/*从偏移量的位置读取72个字节,每个汉字占72个字节*/

    bool mat[24][24];//定义一个新的矩阵存放转置后的文字字膜

    int i,j,k;

    for (i = 0; i<24; i++)                 /*24x24点阵汉字,一共有24行*/

	{

		for (j = 0; j<3; j++)                /*横向有3个字节,循环判断每个字节的*/

			for (k = 0; k<8; k++)              /*每个字节有8位,循环判断每位是否为1*/

				if (buff[i * 3 + j] & (0x80 >> k))    /*测试当前位是否为1*/

				{

					mat[j * 8 + k][i] = true;          /*为1的存入新的字膜中*/

				}

				else {

					mat[j * 8 + k][i] = false;

				}

	}

    for (i = 0; i < 24; i++)

	{

		p.x = x_offset;

		for (j = 0; j < 24; j++)

		{		

			if (mat[i][j])

				circle(image, p, 1, Scalar(255, 0, 0), -1);		  //写(替换)像素点

			p.x++;                                                //右移一个像素点

		}

		p.y++;                                                    //下移一个像素点

	}

}



void put_text_to_image(int x_offset,int y_offset,String image_path,char* logo_path){//将汉字弄上图片
//x和y就是第一个字在图片上的起始坐标
    //通过图片路径获取图片

    Mat image=imread(image_path);

    int length=18;//要打印的字符长度

    unsigned char qh,wh;//定义区号,位号

    unsigned long offset;//偏移量

    unsigned char hexcode[30];//用于存放记事本读取的十六进制,记得要用无符号

    FILE* file_logo;

    if ((file_logo = fopen(logo_path, "rb")) == NULL){

		printf("Can't open txtfile,Please check the path!");

		//getch();

		exit(0);

	}

    fseek(file_logo, 0, SEEK_SET);

    fread(hexcode, length, 1, file_logo);

    int x =x_offset,y = y_offset;//x,y:在图片上绘制文字的起始坐标

    for(int m=0;m<length;){

        if(hexcode[m]==0x23){

            break;//读到#号时结束

        }

        else if(hexcode[m]>0xaf){

            qh=hexcode[m]-0xaf;//使用的字库里是以汉字啊开头,而不是以汉字符号开头

            wh=hexcode[m+1] - 0xa0;//计算位码

            offset=(94*(qh-1)+(wh-1))*72L;

            paint_chinese(image,x,y,offset);

            /*

            计算在汉字库中的偏移量

            对于每个汉字,使用24*24的点阵来表示的

            一行有三个字节,一共24行,所以需要72个字节来表示

            如赵字

            区位码是5352

            十六进制位3534

            机内码就是d5d4

            d5-af=38(十进制),因为是从汉字啊开始的,所以减去的是af而不是a0,38+15等于53与区码相对应

            d4-a0=52

            */

            m=m+2;//一个汉字的机内码占两个字节,

            x+=24;//一个汉字为24*24个像素点,由于是水平放置,所以是向右移动24个像素点

        }

        else{//当读取的字符为ASCII码时

        wh=hexcode[m];

        offset=wh*16l;//计算英文字符的偏移量

        paint_ascii(image,x,y,offset);

        m++;//英文字符在文件里表示只占一个字节,所以往后移一位就行了

        x+=16;

        }



    }

    cv::imshow("image", image);

    cv::waitKey();

}

  • 这样就已经可以啦
    在这里插入图片描述

三、串口传输文件

  • 准备两个USB TO TTL和杜邦线若根,将两个USB TO TTL的RX,TX引脚交叉连接,并将两个USB接口接上一台笔记本电脑(模拟两台计算机之间的串口传输)。
  • 利用可以传输文件的串口调试助手(在这里我采用的是SSCOM V5.13.1),打开两个窗口,每个窗口打开一个串口(两个USB TO TTL连接产生的串口),这里可以看见串口COM4和COM3
    在这里插入图片描述
  • 这里选择的波特率是115200,数据位8,停止位1,无校验位。
    点击打开文件,选择提前准备好的图片
    在这里插入图片描述
  • 接收串口勾选“接受数据到文件”,发送串口点击发送文件
    在这里插入图片描述
  • 保存目录下,修改接收文件后缀为.png
    在这里插入图片描述
  • 修改后的文件
    在这里插入图片描述
  • 修改比特率再次传输
    在这里插入图片描述
  • 两次传输对比,可以发现同样的文件,比特率越大传输时间越短

四、总结

利用汉字点阵在图片上打印汉字还是蛮简单的,过程总结一下就是从txt文件里读取数据,然后以16进制存放在数组里,而16进制对应的就是机内码,就可以由此分辨出汉字和字符,也可以通过这个来计算汉字区位码读取字符阵,而opencv的作用就是根据点阵图利用circle函数画实心圆代替像素点来绘字和字符。而利用串口传输文件,传输时间与文件大小成正比,与比特率成反比。


参考链接

https://blog.youkuaiyun.com/junseven164/article/details/121130735

STM32的串口传输文件和点阵汉字的字模读取与显示 文章目录一、串口传输文件1.题目要求2.实验过程二、汉字点阵原理1.汉字编码2.点库字库结构3.汉字点阵获取三、Ubuntu下显示图片和文字1.实验要求2.实验准备3.编写代码4.编译运行四、总结五、参考资料 一、串口传输文件 1.题目要求 串口传输文件的练习。将两台笔记本电脑,借助 usb转rs232 模块和杜邦线,建立起串口连接。然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件(图片、视频和压缩包软件)传输到另外一台电脑,预算文件大小、波特率和传输时间三者之间的关系,并对比实际传输时 阅读详情

相关推荐

点阵汉字的字模读取与显示

一、串口传输文件 1.串口连接 (1)首先下载串口调试助手: 链接:https://pan.baidu.com/s/1T-7cHCwenyQCfyJSyRusKg 提取码:jack (2)使用两台电脑连接:使用借助 usb转rs232 模块和杜邦线,建立起串口连接,连线为GND接GND,电源接电源,TDX和RDX反接 (3)传输: 打开图中的第一个软件 在发送电脑里:选择你需要打开的文件,选择完毕之后,点击打开串口,以及调整波特率,然后直接点击发送文件即可 在接受电脑:从接...

qq_61850094的博客 2654

图片上打印汉字(C++、OPENCV+字库)

呦呦鹿鸣一、汉字点阵库使用原理1.1 汉字编码1.1.1区位码1.1.2 机内码1.2 点阵字库结构1.3汉字点阵获取二、实现代码三、总结四、参考 一、汉字点阵库使用原理 1.1 汉字编码 1.1.1区位码 在国标 GD2312—80 中规定,所有的国标汉字及符号分配在一个 94 行、94 列的方阵中,方阵的每一行称为一个“区”,编号为 01 区到 94 区,每一列称为一个“位”,编号为01 位到 94 位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯数字就是它们的“区位码”。区位码

junseven164的博客 5284

PC端串口通信&点阵字模读写

目录 一、PC端串口通信 1.目的 2.准备工具 3.操作 二、点阵字模读写 1.目的 2.动手 2.1创建文本文件 2.2打开虚拟机 总结 参考: 一、PC端串口通信 1.目的 将两台笔记本电脑,借助 usb转rs232 模块和杜邦线,建立起串口连接。然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件(图片、视频和压缩包软件)传输到另外一台电脑,预算文件大小、波特率和传输时间三者之间的关系,并对比实际传输时间。 2.准备工具 软件...

run___5661651的博客 6283

Opencv中在图片上显示文本

字体和文字 最后一种形式的绘图是绘制文字。当然,文字创建了一套自己的复杂格式,但是,在这类事情上,OpenCV一如既往地更关心提供一个简单的"一招解决问题"的方案,这个方案只适用于一些简单应用,而不适用于一个稳定的和完整的应用(这将降低由其他库提供的功能)。 OpenCV有一个主要的函数,叫cvPutText()。这个函数可以在图像上输出一些文本。参数text所指向的文本将打印到图像上

LLXLQY的博客 3846

串口文件传输及点阵汉字字模的读取与显示

一、串口文件传输 二、汉字点阵字库原理 (一)汉字编码 1.区位码 在国标 GD2312—80 中规定,所有的国标汉字及符号分配在一个 94 行、94 列的方 阵中,方阵的每一行称为一个“区”,编号为 01 区到 94 区,每一列称为一个“位”,编号为 01 位到 94 位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉 伯数字就是它们的“区位码”。区位码的前两位是它的区号,后两位是它的位号。在区位码中,01-09区为特殊字符,10-55区为一级汉字(3755个最常用的汉字,按拼音

qq_57841179的博客 545

在OpenCV中显示中文汉字

首先,我们需要确保我们的系统中已经安装了合适的字体文件,以便支持中文字符的显示。该函数加载字体文件,并使用PIL库在图像上绘制中文字符,最后将图像转换回OpenCV格式并返回结果图像。通过加载合适的字体文件并使用PIL库进行绘制,我们可以实现在OpenCV中显示中文字符的功能。接下来,我们需要使用Python和OpenCV来加载字体文件并在图像中显示中文字符。运行这段代码,你将会看到一个黑色背景的图像中显示了中文字符"你好,OpenCV!接下来,我们创建一个黑色背景的图像,并定义要显示的中文字符和位置。

UtiExamples的博客 3775

串口传输&点阵汉字的字模读取与显示

目录一.串口连接二.传输文件三.总结 一.串口连接 准备两个USB TO TTL和杜邦线若根,将两个USB TO TTL的RX,TX引脚交叉连接,并将两个USB接口接上一台笔记本电脑(模拟两台计算机之间的串口传输)。 二.传输文件 传输文件: 利用可以传输文件的串口调试助手,选择端口,这里可以看见串口COM4,这里选择的波特率是115200,数据位8,停止位1,无校验位。 接收文件: 选择端口,这里可以看见端口COM5,两个端口波特率需要设置相同,所以也为115200 选择文件,点击发送,可以看

qq_45937732的博客 2251

基于C++与opencv在图像上显示中文方案设计与实现

基于C++与opencv在图像上显示中文方案设计与实现

串口传输文件及点阵汉字的字模读取与显示

串口传输文件及点阵汉字的字模读取与显示一、实验要求二、串口传输文件1、串口连接2、传输文件1)设置波特线为1152002)设置波特线为20000003、结果分析三、点阵汉字的字模读取与显示1、点阵的了解2、汉字编码1)区位码2)机内码3、点阵字库结构1)点阵字库存储2)16*16点阵字库3)14*14与12*12点阵字库4、汉字点阵获取1)利用区位码获取汉字2)利用汉字机内码获取汉字5、实验步骤1)实验准备2)撰写代码3)编译运行4)运行截图四、总结五、参考文献 一、实验要求 1、串口传输文件的练习。将两台

m0_48609250的博客 1338

aarch64 下支持中文字体的opencv_4.2.0

aarch64 下支持中文字体的opencv_4.2.0 ,支持再单通道、双通道的MAT上绘制中文,来实现在NV12或NV21上的文字渲染。可以在边缘计算平台达到不需要转RGB即可在YUV上绘制。极大缩减资源消耗以及响应时间。

论文阅读——Bayesian Knowledge Fusion(贝叶斯知识融合)

该篇论文解决了不确定环境中的信息融合问题。想象一下,有多位专家针对同一情况构建概率模型,我们希望汇总他们提供的信息。直接合并每个信息可能会遇到几个问题。例如,专家们可能不同意某个事件发生的概率,或者他们可能不同意两个事件之间因果关系的方向(例如,一个人认为 A 导致 B,而另一个人认为 B 导致 A)。他们甚至可能不同意概率网络中一组变量之间的整个依赖结构。

qq_64164071的博客 1497

两台电脑利用串口传输文件以及点阵汉字的字模读取与显示

两台电脑利用串口传输文件以及点阵汉字的字模读取与显示 两台电脑利用串口传输文件以及点阵汉字的字模读取与显示两台电脑利用串口传输文件以及点阵汉字的字模读取与显示一、题目要求二、两台电脑利用串口传输文件1.实验准备2.实验过程三、点阵汉字的字模读取与显示1.汉字点阵的原理(一)点阵的定义(二)区位码以及机内码(三)点阵字库的存储(四)汉字点阵获取2.在Ubuntu下调用opencv显示图片和文字四、实验总结五、参考文献 一、题目要求 串口传输文件的练习。将两台笔记本电脑,借助 usb转rs232 模块和杜邦线

qq_48641886的博客 1922

Protege新手入门:5分钟搞定本体建模基础(附实战案例)

本文为Protege本体建模新手提供了一份快速入门指南。通过构建一个关于“披萨”的实战案例,详细讲解了从环境准备、定义核心类(Classes)、建立对象属性(Object Properties)到设置数据属性(Data Properties)和创建个体的完整流程。文章旨在帮助读者绕过复杂理论,在5分钟内直观掌握本体建模的基础操作,快速建立知识图谱构建的信心。

weixin_28335283的博客 283

点阵汉字的字模读取与显示(附加串口传输文件练习)

文章目录 一、串口传输文件练习 二、汉字点阵字库原理 1、汉字的区位码、机位码编码规则 2、字形数据的存储格式 三、Ubuntu下用C++调用opencv库编程读取汉字 四、总结 一、串口传输文件练习 1、连接串口 选用两个USB串口模块,将两个USB串口的RXD、TXD接口交叉连接,即 USB1RXD接USB2TXD USB1TXD接USB2RXD 分别将两个USB串口接入两台电脑,以实现通过串口的文件传输 2、传输文件 1)发送文件 ①打开串口调试助手 ②有关设置 打开串口 设置波特率 ③打开文

qq_45893802的博客 2173

7 series FPGAs Transceiver Wizard IP核使用和测试

学习FPGA一段时间了,前面一直没有系统的总结,这学期把在项目中用到的IP核和一些调试过程中遇到的问题总结一下发出来,坚持下去,一起进步! 今天总结一下的GTH核的使用和测试。 软件版本:Vivado 2017.4 IP核版本:7 Series FPGAs Transceivers Wizard (3.6) FPGA:xc7vx690tfft1927 实现功能: 四路光纤数据接收,由于GTX IP...

qq_39921762的博客 1万+

linux 内核vxlan收发包流程

1.vxlan口收包处理流程 前面几章详细介绍了vxlan接口的使用,而且已经知道vxlan是 MAC IN UDP中的封装,因此,在解封装之前,一切按照原有流程走,在此复习一下内核收发包流程(驱动层的数据处理这次不再解析,直接从__netif_receive_skb_core开始) #物理网卡处理中断,触发softirq i40e_intr └─napi_schedule_irqoff #i40e softirq把包放到per cpu backlog,触发softirq i40e_napi_p

魏言华的博客 3826

借助USB转RS232 模块串口传输练习、基于Ubuntu调用Opencv的点阵汉字字模读取

借助USB转RS232 模块串口传输练习、基于Ubuntu调用Opencv的点阵汉字字模读取 文章目录借助USB转RS232 模块串口传输练习、基于Ubuntu调用Opencv的点阵汉字字模读取1 两台电脑串口文件传输实例1.1 电路连线1.2 软件调试1.3 调试结果1.4 发送更大的文件并比较2. 汉字点阵字库原理2.1 汉字编码2.2 点阵字库结构2.3 汉字点阵获取3 汉字点阵字模读取实例参考文献 1 两台电脑串口文件传输实例 题目: 串口传输文件的练习。将两台笔记本电脑,借助 usb转rs232

qq_46470208的博客 2577

QT播放器插件内嵌浏览器配合流媒体实现国标摄像头网页端播放

基本原理在浏览器⽹页中的指定播放窗口的位置和⼤⼩,实现⼀个内嵌到⽹页中显⽰的播放窗⼝,前端还必须可对这个内嵌播放窗⼝进⾏控制,⽽且播放窗⼝必须跟随浏览器窗⼝的移动和缩放、⽹页滚动、标签页切换、关闭等操作进⾏⾃动联动。播放器可以通过QT实现。这个播放窗⼝同时提供Web Socket的服务端和JSON打包命令的解析执⾏模块,前端就可以通过Web Socket连接后发送JSON打包的控制命令实现控制播放窗⼝。

cameravision的博客 562
上一篇: 人脸特征提取(dlib+opencv+python3.8)
下一篇: LibSVM工具实现决策树训练
羚漆
博客等级 码龄5年 31粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值