APP下载

蓝牙通信中的汉字编码研究与字符点阵显示

2017-02-09邓高旭邓琛王一鸣

单片机与嵌入式系统应用 2017年1期
关键词:字库字节蓝牙

邓高旭,邓琛,王一鸣

(上海工程技术大学 电子与电气工程学院,上海201620)



蓝牙通信中的汉字编码研究与字符点阵显示

邓高旭,邓琛,王一鸣

(上海工程技术大学 电子与电气工程学院,上海201620)

单片机的I/O端口控制特性主要是通过对二进制码的控制来实现对I/O端口的电平高低特性的八字节的输入和输出,传输的数据通常为单字节的数字和英文字符。本文基于Android智能手机的蓝牙控制APP与单片机蓝牙模块的通信,主要针对由两个字节组成的汉字的单发、多发和通信编码问题进行了研究,实现了汉字在点阵上的显示。

蓝牙4.0通信;Android APP;MCU;汉字编码;点阵

引 言

随着视频控制领域扩展、图像处理的发展、光纤技术的应用[1],已经研发出了全彩显示屏,尤其应用于体育场馆、会展中心等大型场所。通常要修改这些显示的内容,必须在上位机进行修改,为了方便文字的修改和操作,实现动态显示汉字,本文在实现算法上对汉字的编码进行研究,并设计手机APP通过蓝牙显示屏进行操作。

1 蓝牙通信协议

蓝牙采用串行通信协议,单片机的通信方式也是串口数据传输,所以可以很好地将蓝牙模块应用到单片机上,串行通信是基于帧的协议,串行口发送信号时,信号是一帧一帧发送的,通信链路[2]中所有的内容都将包含在这样的一个帧中,信号帧的格式如下所示:

帧 首设备地址帧类型功能代码数据长度数据校验码帧尾1Byte1Byte1Byte1Byte1Byte不确定1Byte1Byte

帧中包含了多个信号数据部分,包括帧首、设备地址、帧类型、功能代码、数据长度、数据校验码以及帧尾,串口通信的帧数据传递保证了通信的可靠和安全。

蓝牙串行通信的软件实现如下:

void init(); //蓝牙串口初始化函数

void send(unsigned char a); //单字节发送函数

void ctrl(); //接收处理函数[3]

2 Android APP控制点阵汉字显示的软件框图

Android APP控制点阵汉字显示的软件框图如图1所示。

图1 软件框图

3 汉字编码

由于CPU和MCU都是以二进制的形式进行运算和处理的,对于数字、英文字母和一些特殊字符都有相应的ASCII码对应,这样使得程序员可以和计算机进行方便的交流,使得机器语言和人类语言联系了起来,而且由于计算机在中国普及较晚,汉字复杂且数量多,不可能直接进行ASCII码编码[4],GB2312码编码方式很好地解决了汉字与计算机语言的转化。GB2312码是一种以矩阵的形式从字母A到Z对中国常用的汉字进行了排序,行和列分别代表汉字GB2312码的高字节和低字节,GB2312码也称为汉字的机内码,GB2312码的编码表B部分如表1所列。

表1 GB2312编码表B部分

通过PC串口助手,将手机APP发送端发送的汉字的转化码以十六进制形式显示了出来,比如“啊”字,显示的十六进制为0xB0、0xA1,与GB2312码编码表中汉字编码矩阵的“啊”字的编码0xB0A1的高8位字节和低8位字节对应。

Android手机的APP通过蓝牙和单片机的蓝牙模块[5]进行通信,方式均为串口通信,通信协议主要通过软件编程来搭建。

对于单片机和计算机,要使用这些汉字的编码,该汉字的矩阵码就构成了一个汉字字库,并将其封装在芯片中,使用者只需要在字库里调用该汉字字库芯片的对应编码即可。

4 单片机和字库芯片通信的实现

字库芯片采用的是GT21L系列芯片,字库芯片读取函数会将传进去的两个字节逐个读取并寻找汉字所在的矩阵的位置[6],然后返回汉字字模的首地址,通过字模读取函数将字模逐个读取并存放到字模数组中,单片机对字库芯片读取的软件实现为:

(1) 向GT21L系列芯片送一个字节数据

void Send_Byte(unsigned char out){

unsigned char i=0;

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

if ((out & 0x80) == 0x80)

SPID_H();

else

SPID_L();

SPICLK_L();

out = (out << 1);

SPICLK_H();

}

}

(2) 从GT21L系列芯片得到一个字节数据

unsigned char Get_Byte(){

unsigned char i = 0, in = 0, temp = 0;

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

SPICLK_L();

in = (in << 1);

SPICLK_H();

temp = SPID_DO;

if (temp == 1)

in = in | 0x01;

}

return in;

}

(3) 快速从GT21L系列芯片读出所要的汉字点阵数据存于数组upperfont_32void HighSpeed_Read_Cont(unsigned long Dst,unsigned long no_bytes){

unsigned long i = 0;

unsigned long j = 0;

SPICS_L();

Send_Byte(0x0B);

Send_Byte(((Dst & 0xFFFFFF) >> 16));

Send_Byte(((Dst & 0xFFFF) >> 8));

Send_Byte(Dst & 0xFF);

Send_Byte(0xFF);

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

upperfont_32[i] = Get_Byte();

}

SPICS_H();

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

rev_font[j] = reverse(upperfont_32[j]);

}

}

这时数组里存放的数据就是根据一个汉字的GB2312码所读取的字库芯片里的汉字点阵字模编码。

5 Android APP界面的实现

图2 蓝牙APP用户界面图

Android 是基于Linux内核的软件平台操作系统,包括操作系统、用户界面和应用程序,用户界面主要由控件实现,也可以直接在xml脚本文件中实现;应用程序主要由Java编写,开发环境为eclipse,主要实现的功能有蓝牙的通信连接;APP用户界面,主要使用包编程方式[7],蓝牙的通信主要使用到了Android BluetoothDevice 包和BluetoothAdapter 包,如图2所示。界面包括显示所有被搜索到的蓝牙用户的列表界面和控制功能界面,在蓝牙配对后由用户列表界面转入到功能界面,与单片机蓝牙模块通信的关键程序为:

//获取本机的蓝牙适配器

mBtAdapter = BluetoothAdapter.getDefaultAdapter();

//获取当前所打开的蓝牙设备

Set pairedDevices = mBtAdapter.getBondedDevices();

//如果得到蓝牙设备的连接状态时,启动蓝牙的数据发送和接

//收服务if (mChatService.getState() == BluetoothChatService.STATE_NONE)

ChatService.start();

//初始化内容发送按钮

mSendButton = (Button) findViewById(R.id.button_send);

mSendButton.setOnClickListener(new OnClickListener(){

public void onClick(View v) {

//在内容编辑控件里编辑发送内容

TextView view = (TextView) findViewById(R.id.edit_text_out);

String message = view.getText().toString();

sendMessage(message);

}

};

6 单片机多字节接收问题

Android手机APP使用的是蓝牙串口,可以直接搜索单片机的蓝牙并进行配对,配对后由APP发送汉字GB2312码到单片机,单片机会连续接收两个字节并保存到数组里,由于单片机的串口协议是单字节接收[8]的,所以直接利用串口协议不能实现两个字节的接收,这时就需要用到单片机的串口中断,手机APP每发送一个汉字就触发一次单片机串口中断,通过对串口控制寄存器和配置寄存器进行配置,并设置串口中断标志位,因此单片机只有接收到一个汉字后才会触发一次串口中断,然后先将一个字节的数据存放在缓存寄存器SBUF里,只要中断标志位没有改变,就默认是一个汉字字节的接收,然后连续分两次存放在数组里。单片机的串口中断读取两个字节的软件实现函数为:

void read_mess(void) interrupt 4{

if(RI==1){

uchar tmp;

tmp =SBUF;

a[flag]=tmp;

if(flag==1){

flag=0;

}

flag++;

RI=0;

}

}

16×16的点阵正好只能一次显示一个汉字,所以在多汉字发送时,单片机只能对第一个汉字进行处理,其他汉字都会被忽略。如果想要显示多汉字,则必须将多个16×16点阵进行串联,然后只要改变点阵的列控制程序即可。

7 16×16点阵汉字的连续显示

16×16点阵是由4个8×8的点阵组成[9],分别由芯片控制行和列,可以完全与字库芯片中读取的十六进制的字模相对应,字模的一位对应点阵的每一个LED,先发送行信号,然后发送列信号,再送第二行的字模和选通信号[10],这样循环扫描8次,行控制和列控制的点阵就会显示汉字。只要控制循环的次数就可以使点阵的显示不会有视觉暂留的效果,直到接收到下一个汉字,数组中的汉字字模[11]才会发生变化,点阵才会显示下一个汉字。单片机对点阵行控制和列控制的软件实现为:

void SendSer(unsigned char dat1,unsigned char dat2){

//列控制函数

SendByte(dat1);

SendByte(dat2);

LATCH=1;

_nop_();

LATCH=0;

}

void SendSeg(unsigned int a){

//行控制函数

SendByte1(a>>8);

SendByte1(a);

LATCH_B=1;

_nop_();

LATCH_B=0;

}

结 语

[1] 潘矜矜.一种LED点阵汉字显示屏的制作[J].福建电脑,2006(3).

Chinese Character Coding and Dot Matrix Display of Bluetooth Communication

Deng Gaoxu,Deng Chen,Wang Yiming

(School of Electronic and Electrical Engineering,Shanghai University of Engineering Science,Shanghai 201620,China)

The I/O port control features of the MCU are realized through the control of the binary code to realize the input and output of the I/O ports,the data transfered is usually a single-byte and english characters.In the paper,based on the Android smartphone bluetooth control APP and the single-chip microcomputer communication,the problems that the single and multiple and communication coding of the characters are researched which are consist of two byters. The display of Chinese characters on the dot matrix is realized.

Bluetooth4.0 communication;Android APP;MCU;Chinese code;dot matrix

TP391.9

A

猜你喜欢

字库字节蓝牙
蓝牙音箱的直线之美
No.8 字节跳动将推出独立出口电商APP
No.2 喜茶联合汉仪字库推出微型书和书签
No.10 “字节跳动手机”要来了?
简单、易用,可玩性强Q AcousticsBT3蓝牙音箱
适合自己的才是最好的 德生(TECSUN) BT-50蓝牙耳机放大器
论计算机字库单字的著作权保护
——以方正诉宝洁案为例
简谈MC7字节码
紧急:蓝牙指尖陀螺自燃!安全隐患频出
老家的惜字库