移动设备课程设计

2022-03-23 08:30:14下载本文作者:会员上传
简介:写写帮文库小编为你整理了这篇《移动设备课程设计》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《移动设备课程设计》。

武汉轻工大学

数学与计算机学院

移动设备课程设计

设计题目:ARM开发板上通过转换函数实现汉字显示

专 业 计算计科学与技术

班 级 1802

学 号 1801070108

姓 名 毛佳文

指导教师 易逵

2021 年 7 月5 日

一、实验环境

开发板:iTOP-4412

操作系统:Windows 10

虚拟机:VMware Workstation Pro 15 Ubuntu12.04.2_V2.0

数据传输工具:Xshell 7

驱动软件:驱动精灵

二、实验要求

ARM开发板上实现汉字显示

三、实验原理

当前流行的字符编码格式有:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16、GBK、GB2312等,其中GBK、GB2312是专门处理中文编码的。而libiconv是一个常用的编码转换库,支持常用的多种编码之间的转换。在Linux下,工具链gcc有专门的libiconv库,所有不用移植,但在arm-linux下就没那么幸运了,需要我们额外移植libiconv库,不过,过程还是比较简单的。

字符编码转换libiconv库介绍

Libiconv是一个常用的编码转换库,支持常用的多种编码之间的转换。

iconv_open是打开一个编码流,类似于打开一个编码管道(通道),出错则返回-1;

iconv用于具体输入的转换,如果出错,则返回-1,否则返回 0;

iconv_close是关闭该管道(通道)。

如果对于大量需要转换的编码,上述函数covert不适合该方式,一是内存的限制不能一次调用,二是若分多次调用会频繁打开一个编码管道(通道),导致资源浪费,最好的办法还是拆开该函数根据情况使用。

存在的问题

开发环境为ubuntu11.10,开发板为ARM开发板,交叉编译器版本为arm-linux-4.4.3.相同的C源程序,在ubuntu11.10上能够正常执行,而在ARM开发板则不能正常执行,调用iconv_open(“utf-8”, “gb2312”)返回失败,错误信息为“Invalid argument”.经过查询资料得知iconv相关函数为libc中的函数,初步分析得出结论为有可能是libc版本中

iconv相关函数的版本不同造成的,因此要更新iconv相关函数。

更新iconv相关函数有两种方法:

第一,更新libc库;

第二,更新libiconv库。

第一种方法更新libc库比较麻烦,因为我们用的是编译好的交叉编译器,这种方法需要重新编译生成交叉编译器,并且也需要使用新编译生成的交叉编译工具重新编译应用程序,因此本方法代价太大,因此我们采用第二种方法。

GBK对汉字的编码

GBK的中文编码是双字节来表示的,英文编码是用ASCII码表示的,既用单字节表示。但GBK编码表中也有英文字符的双字节表示形式,所以英文字母可以有2种GBK表示方式。为区分中文,将其最高位都定成1。英文单字节最高位都为0。当用GBK解码时,若高字节最高位为0,则用ASCII码表解码;若高字节最高位为1,则用GBK编码表解码。

字符有一字节和双字节编码,00–7F范围内是第一个字节,和ASCII保持一致,此范围内严格上说有96个文字和32个控制符号。之后的双字节中,前一字节是双字节的第一位。总体上说第一字节的范围是81–FE(也就是不含80和FF),第二字节的一部分领域在40–7E,其他领域在80–FE。

“"

四、实验步骤

1.搭建实验环境

确保iTop-4412已经搭载了最小Linux子系统。

2.更新libiconv动态链接库

下载最新库文件并且编译安装: libiconv-1.14.tar.gz

tar-vxf libiconv-1.14.tar.gz //解压缩libiconv-1.14.tar.gz

cd jpeg-9d

./configure--host=arm-none-linux-gnueabi //配置交叉编译器

make //编译

make install //安装

将preloadable_libiconv.so 这个动态库安装在开发板的根目录下的 /lib文件夹下:

”“

图1 libiconv编译后的lib库文件

”“

图2 开发板下的 lib库文件

从虚拟机中将文件preloadable_libiconv.so cp iTopeet-4412/lib下

1,编写实验代码

文件结构如下:

”“

图3 代码结构图

其中ascii.h、HZK16均为资源文件,而mode_print_CH_String.c才是最关键的文件(实现了本实验的全部功能:输入一串中文字符就可以在开发板屏幕上显示)

具体代码如下:

(1)ascii.h

”“

图4 ascii.h源码部分截图

其中ascii_bitmaps[]的每16个数据元就存放一个ASCII字符的编码信息(前面有大量无法显示的字符,故为0x00)

(2)mode_print_CH_String.c

#include

#include

#include

#include

#include

#include

#include

#include ”ascii.h“

#include

#include

#include

int *fbmem;//数据帧缓存

unsigned char *hzkmem;汉字字符串缓存

int w, h;

unsigned char *string = ”张多鱼国家排核废水

#define OUTLEN 128

void fb_point(int x, int y, int color)//画点函数

{

fbmem[y * w + x] = color;

}

void fb_hline(int x1, int x2, int y, int color)//画线函数

{

int i;

for(i=x1;i

fb_point(i, y, color);

}

void show_ascii(int x, int y, unsigned char c, int color)

{

/* 得到字符点阵在数组中的起始位置 */

// unsigned char *dots =(unsigned char *)&ascii_bitmaps[c*16];

unsigned char *dots = &ascii_bitmaps[c*16];

int i,j;

unsigned char byte;

for(i = 0;i < 16;i ++){

/* 取出一个字节 */

byte = dots[i];

for(j = 7;j >= 0;j--)

{

if(byte &(1 << j)){

/* 传入参数的值是lcd要显示的起点坐标 这里每个点的坐标每描一个点要移动一次 */

fb_point(x + 7-j, y + i, color);

}

}

}

}

void show_chinese(int x, int y, unsigned char *str,int d,int w,int color)

//d w 分别是放大倍数和点阵密度倍数,两者需保持一致 可放大字体倍数

{

unsigned int area = str[0]-0xa1;

unsigned int where = str[1]-0xa1;

unsigned char *dots = hzkmem +(area * 94 + where)* 32;

unsigned char byte;

// int i,j,k;

int i, j, b,m,n;

for(i = 0;i < 16;i++){

for(j = 0;j < 2;j++){

byte = dots[i*2 + j];

for(b = 7;b >=0;b--){

if(byte &(1<

/* show 加粗显示*/

for(m=0;m< d;m++){

for(n=0;n

fb_point((x+(7-b+j*8)*w)+m,(y+i*w)+n, color);

}//for n

}//for m

} //if

}

}

}/

x+=16*w+20;//按照行来显示,中间空20个pixs

y+=0;

}

int main()

{

int i, j, k;

int fd, fd_hzk;

struct fb_var_screeninfo fb_var;

struct stat hzk_stat;

iconv_t cd;

int inbuf_len = strlen(string);

char outbuf[OUTLEN];

char *pin = string;

char *pout = &outbuf[0];//用“pout=&outbuf” 会引发SIGSERV信号,导致段错误

int outbuf_len = OUTLEN;

fd = open(“/dev/fb0”, O_RDWR);//打开缓冲设备

if(fd < 0){

printf(“open errorn”);

return-1;

}

fd_hzk = open(“HZK16”, O_RDONLY);//打开字库文件

if(fd_hzk < 0)

{

printf(“cant open HZK16n”);

return-1;

}

/* 得到这个件的统计信息当然也包含了大小 */

if(fstat(fd_hzk, &hzk_stat))

{

printf(“cant get hzk_stat!n ”);

return-1;

}

if(ioctl(fd, FBIOGET_VSCREENINFO, &fb_var))/* 获得可变信息 */

{

/* 正常获得信息的话 ioctl 会返回0 如果返回值不为0时表示出错 */

printf(“cant get var!n”);

return-1;

}

w = fb_var.xres;

h = fb_var.yres;

k = fb_var.bits_per_pixel;

printf(“framebuffer: %d * %d * %dn”, w, h, k);

fbmem = mmap(0, w*h*4, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

hzkmem =(unsigned char *)mmap(NULL, hzk_stat.st_size, PROT_READ, MAP_SHARED, fd_hzk, 0);

memset(outbuf, 0, OUTLEN);//清空输出缓存,否则会有意外结果的 printf(“Originial Data:n”);//打印转换前的一些参数和信息,以进行比较

printf(“tpin str: %s, outbuf str:%sn”, pin, outbuf);

printf(“tinbuf_len=%d, outbuf_len=%dn”, inbuf_len, outbuf_len);

printf(“tstrlen(outbuf)= %dn”, strlen(outbuf));

cd = iconv_open(“GB2312”, “UTF-8”);

if(cd == 0)

return EXIT_FAILURE;

int count = iconv(cd, &pin, &inbuf_len, &pout, &outbuf_len);

printf(“iconv count : %dn”, count);//观察iconv返回值,理解不可逆转换含义

iconv_close(cd);

printf(“After Converted Data:n”);//注意发生变化的变量

printf(“tpin str: %s, gb2312 str:%sn”, pin, outbuf);

printf(“tinbuf_len=%d, outbuf_len=%dn”, inbuf_len, outbuf_len);

printf(“tstrlen(outbuf)= %dn”, strlen(outbuf));

for(i = 0;i < strlen(outbuf);i += 2)

{

show_chinese(100+32*i, 300, outbuf+i,2,2, 0xffff00);

//使用HZK16字库显示GB2312编码的中文点阵

}

return 0;

}

对该文件进行交叉编译:

arm-none-linux-gnueabi-gcc mode_print_CH_String.c

2.配置preloadable_libiconv.so的环境变量

在超级终端在输入:

export LD_PRELOAD=/lib/preloadable_libiconv.so

五、实验运行

    挂载

“"

图5 挂载(将带有运行程序的TF卡挂载到/mnt/disk)

    运行程序:

”“

”“

图6 运行程序:./mode_print_CH_String

    运行结果截图

”“

六、实验总结

经过本学期的移动设备开发学习,我了解到嵌入式Linux开发的基本流程,对xshell软件等的使用有了了解,发现自己知识水平有待提高,在今后的学习里,我会更加地努力,提升自我的知识素养。

下载移动设备课程设计word格式文档
下载移动设备课程设计.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    高温设备课程设计教学大纲

    无机非金属材料工程专业实践教学大纲 课程名称:高温设备课程设计 Course Design to High Temperature Equipments 一、本课程设计所占学时、学分 学时:2周;学分:2学分。 二、本......

    热处理设备课程设计总结

    热处理设备课程设计总结热处理设备课程为金属材料专业的一门理论加实践的基础课程,它是继金属学基础、热处理原理课程学习完以后又一门专业课。通过热处理设备的设计,可以让学......

    移动通信课程设计报告要点

    成都学院(成都大学)课程设计报告 直接序列扩频通信系统Simulink的仿真设计 摘要:本次设计的是直接序列扩频通信系统,主要利用了Matlab/Simulink对直接序列扩频系统进行仿真,并详......

    《装修户内设备移动申请》

    装修户内设备移动申请 金辉锦江物业 物业服务中心(项目名称): 本人系(受) (房号)的业主 (之委托),因室内装饰装修需要,户内以下设施需作移动,特此申请: □ 移动室内对讲可视话机 申请人:......

    煤矿井下移动设备管理办法

    煤矿井下移动设备管理制度 设备安全可靠运行是矿建工程完成施工生产任务的重要保证,设备运行管理就是通过一系列的制度、措施、手段的有效实施,规范和约束设备管理者、操作者......

    最新移动短信群发设备

    最新移动短信群发设备徴 / 电 147 ~ 58420 ~ 937一个基站的选择,需从性能、配套、兼容性及使用要求等各方面综合考虑,其中特别注意的是基站设备必须与移动交换中心相兼容或配套,......

    移动设备投资租赁项目计划书

    移动设备投资租赁项目计划书 一:项目简介 本项目根据现代社会进程环境及资源矛盾的日益冲突,立足节能、环保、服务社会基础建设的理念,成立移动设备投资租赁公司。提供移动破碎......

    移动存储设备保密管理规定

    一、本单位u盘、移动设备要进行编号,不得借于他人使用,若需借于他人的,必须征得单位领导同意,并进行时间、借还时间、借用人、审批人等详细登记。二、新购计算机、移动硬盘、u盘......