鄧高旭,鄧琛,王一鳴
(上海工程技術大學 電子與電氣工程學院,上海201620)
?
藍牙通信中的漢字編碼研究與字符點陣顯示
鄧高旭,鄧琛,王一鳴
(上海工程技術大學 電子與電氣工程學院,上海201620)
單片機的I/O端口控制特性主要是通過對二進制碼的控制來實現(xiàn)對I/O端口的電平高低特性的八字節(jié)的輸入和輸出,傳輸?shù)臄?shù)據(jù)通常為單字節(jié)的數(shù)字和英文字符。本文基于Android智能手機的藍牙控制APP與單片機藍牙模塊的通信,主要針對由兩個字節(jié)組成的漢字的單發(fā)、多發(fā)和通信編碼問題進行了研究,實現(xiàn)了漢字在點陣上的顯示。
藍牙4.0通信;Android APP;MCU;漢字編碼;點陣
隨著視頻控制領域擴展、圖像處理的發(fā)展、光纖技術的應用[1],已經(jīng)研發(fā)出了全彩顯示屏,尤其應用于體育場館、會展中心等大型場所。通常要修改這些顯示的內(nèi)容,必須在上位機進行修改,為了方便文字的修改和操作,實現(xiàn)動態(tài)顯示漢字,本文在實現(xiàn)算法上對漢字的編碼進行研究,并設計手機APP通過藍牙顯示屏進行操作。
藍牙采用串行通信協(xié)議,單片機的通信方式也是串口數(shù)據(jù)傳輸,所以可以很好地將藍牙模塊應用到單片機上,串行通信是基于幀的協(xié)議,串行口發(fā)送信號時,信號是一幀一幀發(fā)送的,通信鏈路[2]中所有的內(nèi)容都將包含在這樣的一個幀中,信號幀的格式如下所示:
幀 首設備地址幀類型功能代碼數(shù)據(jù)長度數(shù)據(jù)校驗碼幀尾1Byte1Byte1Byte1Byte1Byte不確定1Byte1Byte
幀中包含了多個信號數(shù)據(jù)部分,包括幀首、設備地址、幀類型、功能代碼、數(shù)據(jù)長度、數(shù)據(jù)校驗碼以及幀尾,串口通信的幀數(shù)據(jù)傳遞保證了通信的可靠和安全。
藍牙串行通信的軟件實現(xiàn)如下:
void init(); //藍牙串口初始化函數(shù)
void send(unsigned char a); //單字節(jié)發(fā)送函數(shù)
void ctrl(); //接收處理函數(shù)[3]
Android APP控制點陣漢字顯示的軟件框圖如圖1所示。
圖1 軟件框圖
由于CPU和MCU都是以二進制的形式進行運算和處理的,對于數(shù)字、英文字母和一些特殊字符都有相應的ASCII碼對應,這樣使得程序員可以和計算機進行方便的交流,使得機器語言和人類語言聯(lián)系了起來,而且由于計算機在中國普及較晚,漢字復雜且數(shù)量多,不可能直接進行ASCII碼編碼[4],GB2312碼編碼方式很好地解決了漢字與計算機語言的轉化。GB2312碼是一種以矩陣的形式從字母A到Z對中國常用的漢字進行了排序,行和列分別代表漢字GB2312碼的高字節(jié)和低字節(jié),GB2312碼也稱為漢字的機內(nèi)碼,GB2312碼的編碼表B部分如表1所列。
表1 GB2312編碼表B部分
通過PC串口助手,將手機APP發(fā)送端發(fā)送的漢字的轉化碼以十六進制形式顯示了出來,比如“啊”字,顯示的十六進制為0xB0、0xA1,與GB2312碼編碼表中漢字編碼矩陣的“啊”字的編碼0xB0A1的高8位字節(jié)和低8位字節(jié)對應。
Android手機的APP通過藍牙和單片機的藍牙模塊[5]進行通信,方式均為串口通信,通信協(xié)議主要通過軟件編程來搭建。
對于單片機和計算機,要使用這些漢字的編碼,該漢字的矩陣碼就構成了一個漢字字庫,并將其封裝在芯片中,使用者只需要在字庫里調用該漢字字庫芯片的對應編碼即可。
字庫芯片采用的是GT21L系列芯片,字庫芯片讀取函數(shù)會將傳進去的兩個字節(jié)逐個讀取并尋找漢字所在的矩陣的位置[6],然后返回漢字字模的首地址,通過字模讀取函數(shù)將字模逐個讀取并存放到字模數(shù)組中,單片機對字庫芯片讀取的軟件實現(xiàn)為:
(1) 向GT21L系列芯片送一個字節(jié)數(shù)據(jù)
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系列芯片得到一個字節(jié)數(shù)據(jù)
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系列芯片讀出所要的漢字點陣數(shù)據(jù)存于數(shù)組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]);
}
}
這時數(shù)組里存放的數(shù)據(jù)就是根據(jù)一個漢字的GB2312碼所讀取的字庫芯片里的漢字點陣字模編碼。
圖2 藍牙APP用戶界面圖
Android 是基于Linux內(nèi)核的軟件平臺操作系統(tǒng),包括操作系統(tǒng)、用戶界面和應用程序,用戶界面主要由控件實現(xiàn),也可以直接在xml腳本文件中實現(xiàn);應用程序主要由Java編寫,開發(fā)環(huán)境為eclipse,主要實現(xiàn)的功能有藍牙的通信連接;APP用戶界面,主要使用包編程方式[7],藍牙的通信主要使用到了Android BluetoothDevice 包和BluetoothAdapter 包,如圖2所示。界面包括顯示所有被搜索到的藍牙用戶的列表界面和控制功能界面,在藍牙配對后由用戶列表界面轉入到功能界面,與單片機藍牙模塊通信的關鍵程序為:
//獲取本機的藍牙適配器
mBtAdapter = BluetoothAdapter.getDefaultAdapter();
//獲取當前所打開的藍牙設備
Set
//如果得到藍牙設備的連接狀態(tài)時,啟動藍牙的數(shù)據(jù)發(fā)送和接
//收服務if (mChatService.getState() == BluetoothChatService.STATE_NONE)
ChatService.start();
//初始化內(nèi)容發(fā)送按鈕
mSendButton = (Button) findViewById(R.id.button_send);
mSendButton.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
//在內(nèi)容編輯控件里編輯發(fā)送內(nèi)容
TextView view = (TextView) findViewById(R.id.edit_text_out);
String message = view.getText().toString();
sendMessage(message);
}
};
Android手機APP使用的是藍牙串口,可以直接搜索單片機的藍牙并進行配對,配對后由APP發(fā)送漢字GB2312碼到單片機,單片機會連續(xù)接收兩個字節(jié)并保存到數(shù)組里,由于單片機的串口協(xié)議是單字節(jié)接收[8]的,所以直接利用串口協(xié)議不能實現(xiàn)兩個字節(jié)的接收,這時就需要用到單片機的串口中斷,手機APP每發(fā)送一個漢字就觸發(fā)一次單片機串口中斷,通過對串口控制寄存器和配置寄存器進行配置,并設置串口中斷標志位,因此單片機只有接收到一個漢字后才會觸發(fā)一次串口中斷,然后先將一個字節(jié)的數(shù)據(jù)存放在緩存寄存器SBUF里,只要中斷標志位沒有改變,就默認是一個漢字字節(jié)的接收,然后連續(xù)分兩次存放在數(shù)組里。單片機的串口中斷讀取兩個字節(jié)的軟件實現(xiàn)函數(shù)為:
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的點陣正好只能一次顯示一個漢字,所以在多漢字發(fā)送時,單片機只能對第一個漢字進行處理,其他漢字都會被忽略。如果想要顯示多漢字,則必須將多個16×16點陣進行串聯(lián),然后只要改變點陣的列控制程序即可。
16×16點陣是由4個8×8的點陣組成[9],分別由芯片控制行和列,可以完全與字庫芯片中讀取的十六進制的字模相對應,字模的一位對應點陣的每一個LED,先發(fā)送行信號,然后發(fā)送列信號,再送第二行的字模和選通信號[10],這樣循環(huán)掃描8次,行控制和列控制的點陣就會顯示漢字。只要控制循環(huán)的次數(shù)就可以使點陣的顯示不會有視覺暫留的效果,直到接收到下一個漢字,數(shù)組中的漢字字模[11]才會發(fā)生變化,點陣才會顯示下一個漢字。單片機對點陣行控制和列控制的軟件實現(xiàn)為:
void SendSer(unsigned char dat1,unsigned char dat2){
//列控制函數(shù)
SendByte(dat1);
SendByte(dat2);
LATCH=1;
_nop_();
LATCH=0;
}
void SendSeg(unsigned int a){
//行控制函數(shù)
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