摘要 提出一種在嵌入式系統(tǒng)上由硬件同時(shí)實(shí)現(xiàn)中文手寫輸入法和觸摸屏控制器的設(shè)計(jì)方案,給出硬件結(jié)構(gòu)圖以及軟件從底層到應(yīng)用層所實(shí)現(xiàn)功能的概要說(shuō)明;同時(shí)對(duì)設(shè)計(jì)過(guò)程中出現(xiàn)的問(wèn)題給出了合理的解決方案,并驗(yàn)證了該設(shè)計(jì)方案的可行性和實(shí)用性。
關(guān)鍵詞 中文手寫芯片 HW006 觸摸屏 進(jìn)程通信 Qtopia
引言
在PDA和中高端手機(jī)等手持設(shè)備中,觸摸屏已經(jīng)成為一種比較常用的輸入設(shè)備,用戶可以通過(guò)在觸摸屏上的點(diǎn)擊和寫劃完成與手持設(shè)備的交互。此外,由于基于觸摸屏的中文手寫輸入法更符合我國(guó)各個(gè)文化層次的人使用,因此越來(lái)越多地出現(xiàn)在時(shí)下流行的各種手持設(shè)備中。大多數(shù)中文手寫輸入法完全由軟件來(lái)實(shí)現(xiàn),將輸入法界面程序和后臺(tái)識(shí)別算法集成到一起。其好處是不改變系統(tǒng)的硬件結(jié)構(gòu),而且便于升級(jí);然而,使用商用的手寫識(shí)別算法,較為高昂的費(fèi)用和繁重的移植工作,會(huì)大大增加開(kāi)發(fā)成本和延長(zhǎng)開(kāi)發(fā)周期。若使用開(kāi)源的手寫識(shí)別源代碼(如kanjipad)進(jìn)行移植開(kāi)發(fā),則一方面涉及移植的工作量問(wèn)題,另一方面識(shí)別率比較低。針對(duì)以上這些由軟件實(shí)現(xiàn)中文手寫輸入法所帶來(lái)的一系列問(wèn)題,本文提出一種在“PXA255微處理器+Linux+Qtopia圖形界面”上由HW006芯片同時(shí)實(shí)現(xiàn)中文手寫輸入及觸摸屏控制的設(shè)計(jì)方案。該方案有以下幾個(gè)優(yōu)點(diǎn):
◇ 軟件方面將觸摸屏驅(qū)動(dòng)和手寫識(shí)別的工作合二為一。
◇ 完全在用戶空間實(shí)現(xiàn)觸摸屏的驅(qū)動(dòng),減少了硬件平臺(tái)的依賴性,降低了驅(qū)動(dòng)設(shè)計(jì)的難度,分層的驅(qū)動(dòng)設(shè)計(jì)思想也不會(huì)破壞原有程序的完整性。
◇ 硬件方面,省去了專用的觸摸屏控制器芯片,降低了成本。
因此,該方案在工作量、成本、難度方面均有著明顯的優(yōu)勢(shì),從而大大縮短了開(kāi)發(fā)周期,增強(qiáng)了實(shí)用性。
1? HW006簡(jiǎn)介
HW006是一款漢王手寫芯片,它內(nèi)置了觸摸屏控制電路和對(duì)外的UART接口,同時(shí)提供了靈活的控制命令接口,可以滿足觸摸屏LCD分離型、觸摸屏LCD一體型等不同情況下的各種應(yīng)用需求。
1.1? HW006主要功能
◇ 支持6 763個(gè)簡(jiǎn)體中文(GB2312)、52個(gè)英文大小寫字母、10個(gè)數(shù)字、12個(gè)常用符號(hào)的手寫識(shí)別輸入,并可自由組合,設(shè)置識(shí)別范圍;
◇ 支持點(diǎn)擊模式、手寫模式和混合模式;
◇ 內(nèi)嵌觸摸屏控制硬件和軟件,可直接與觸摸屏相連接;
◇ 支持異步串行通信接口(UART),通信波特率可設(shè)置,便于與各種CPU進(jìn)行通信;
◇ 在手寫狀態(tài)下,識(shí)別參數(shù)可設(shè)置。
可見(jiàn),HW006完全可以實(shí)現(xiàn)預(yù)想的功能。根據(jù)實(shí)際需要,選用混合模式。
1.2? HW006的通信協(xié)議
HW006為從設(shè)備,主設(shè)備對(duì)該芯片發(fā)送控制命令,HW006可以執(zhí)行相應(yīng)的功能。
(1)? 主設(shè)備向手寫芯片發(fā)送命令
格式如下:
(2)? 手寫芯片向主設(shè)備發(fā)送數(shù)據(jù)
這里主要介紹混合模式下的數(shù)據(jù)格式,如下:
在混合模式下,手寫芯片先發(fā)送軌跡坐標(biāo),屬性表示該點(diǎn)的狀態(tài):0x00,落筆;0x05,移筆;0x0f,抬筆。EOF表示發(fā)送軌跡結(jié)束標(biāo)志,其值為0xff。之后發(fā)送識(shí)別字的編碼,低字節(jié)在前,高字節(jié)在后。
1.3? 命令碼的簡(jiǎn)單介紹
對(duì)HW006進(jìn)行操作控制的主要命令碼如表1所列。
2? 硬件框圖以及通信格式簡(jiǎn)介
硬件框圖如圖1所示。
UART通信格式: 上電默認(rèn)波特率,9 600 bps;數(shù)據(jù)位,8位;校驗(yàn)位,無(wú);停止位,1位;先低位后高位。觸摸屏采用了4線電阻屏,在觸摸屏與HW006連線處,需要加上濾波電容。
上電初始化時(shí),默認(rèn)工作模式為點(diǎn)擊模式。用戶可根據(jù)應(yīng)用需要,設(shè)置相應(yīng)工作模式。使用混合模式時(shí)必須通過(guò)UART給系統(tǒng)發(fā)送4個(gè)數(shù)據(jù)X1、Y1、X2、Y2,以確定矩形手寫區(qū)域的范圍。
3? 手寫輸入法及觸摸屏驅(qū)動(dòng)的實(shí)現(xiàn)
選用的圖形界面系統(tǒng)Qtopia是由Trolltech公司所開(kāi)發(fā)的專門用于嵌入式Linux操作系統(tǒng)電子設(shè)備的應(yīng)用平臺(tái),這里使用開(kāi)放源代碼的Qtopia PDA版。它具有可定制的用戶界面和集成的組件,其組件包括窗口操作界面、游戲和多媒體、PIM應(yīng)用程序、輸入法、本地化支持和無(wú)線支持等。對(duì)于輸入法,它提供了一系列的通用API,便于開(kāi)發(fā)用戶自己的輸入法。
Qtopia軟件平臺(tái)可分為4個(gè)層次,如圖2所示。
圖2? Qtopia軟件平臺(tái)層次結(jié)構(gòu)
其中在Qt/Embedded層提供了觸摸屏的API,在Qtopia層提供了輸入法的API。需要完成的工作: ①? 在Linux層編寫觸摸屏庫(kù),提供給Qt/Embedded層調(diào)用;② ?改寫Qt/Embedded層的觸摸屏API;③ ?在Qtopia層利用輸入法API完成手寫輸入法的手寫顯示和識(shí)別字顯示的界面。下面詳細(xì)介紹以上步驟。
3.1? 在Linux層編寫觸摸屏庫(kù)
主要是提供設(shè)置HW006工作模式、讀/寫HW006數(shù)據(jù)以及對(duì)讀到的數(shù)據(jù)進(jìn)行發(fā)送的接口函數(shù),最終編譯成動(dòng)態(tài)鏈接庫(kù),可供上層的應(yīng)用程序調(diào)用。主要的接口函數(shù)及程序的主要代碼如下:
(1) ?打開(kāi)串口
int *ts_open(const char * device) {
…
*fd=open(device,O_RDWR| O_NONBLOCK);
if ( (*fd) < 0 ){
printf("open error!\n");
return NULL;
}
return fd;
}
(2) ?設(shè)置HW006的混合工作模式
void ts_config(int* fd) {
…
write(*fd,&SET_96,2); //設(shè)置HW006波特率為9600bps
write(*fd,&SET_X1,2);
write(*fd,&SET_Y1,2);
write(*fd,&SET_X2,2);
write(*fd,&SET_Y2,2);//設(shè)置手寫區(qū)域4個(gè)角的坐標(biāo)
write(*fd,&WAIT_T,2);//設(shè)置漢字識(shí)別等待時(shí)間
write(*fd,®_SCOPE,2);//設(shè)置識(shí)別范圍
write(*fd,®_CAN,2);//設(shè)置識(shí)別字候選個(gè)數(shù)
…
}
(3) ?讀串口
int ts_read(int *fd,unsigned char *buf) {
int res;
res=read(*fd,buf,3);
return res;
}
(4) 發(fā)送到有名管道
void sendFifo(unsigned char* buf,int i) {
…
fd=open("/dev/myfifo",O_WRONLY | O_NONBLOCK);
write(fd,buf,i);
close(fd);
}
3.2? 改寫Qt/Embedded層的觸摸屏API
對(duì)讀到的原始數(shù)據(jù)進(jìn)行處理,包括變換、校正、分發(fā)等。Qt/Embedded中提供觸摸屏API的文件是qwsmouse_qws.cpp,其中的類QCalibratedMouseHandler實(shí)現(xiàn)了對(duì)觸摸屏數(shù)據(jù)的讀取及其處理。本文所用的HW006是8位的,而顯示分辨率是640×480,因此在讀到觸摸屏數(shù)據(jù)時(shí)還要進(jìn)行轉(zhuǎn)換。又因?yàn)镠W006工作在混合模式狀態(tài)下,因此需要把所讀到的坐標(biāo)數(shù)據(jù)和漢字碼分開(kāi),將坐標(biāo)數(shù)據(jù)進(jìn)行轉(zhuǎn)換后送給圖形界面,并將漢字碼送給輸入法,這涉及到了不同進(jìn)程之間通信的問(wèn)題。不同進(jìn)程之間的通信主要有管道、共享內(nèi)存、消息隊(duì)列等幾種方式。其中: 共享內(nèi)存速度最快,在傳送大量數(shù)據(jù)時(shí)比較有優(yōu)勢(shì);管道最容易實(shí)現(xiàn),這里需要傳送的數(shù)據(jù)量不大,因此選用管道的通信方式。
在qwsmouse_qws.cpp中,定義了一個(gè)對(duì)觸摸屏數(shù)據(jù)進(jìn)行處理的類——QSitsangTPanelHandlerPrivate。該類繼承了QCalibratedMouseHandler。在它的構(gòu)造函數(shù)中,利用Linux層提供的函數(shù)打開(kāi)串口,設(shè)置HW006工作模式;再利用QT特有的信號(hào)和槽機(jī)制,定義一個(gè)QSocketNotifier類把串口描述符和QSitsangTPanelHandlerPrivate類的成員函數(shù)——讀觸摸屏數(shù)據(jù)函數(shù)readTSData()連接起來(lái),實(shí)現(xiàn)對(duì)串口數(shù)據(jù)的自動(dòng)監(jiān)視與讀取。
部分代碼如下:
QSitsangTPanelHandlerPrivate::QSitsangTPanelHandlerPrivate(MouseProtocol, QString) {
fd=ts_open("/dev/ttyS1");
…
ts_config(fd);
QSocketNotifier *mouseNotifier;
TS_Notifier=new QSocketNotifier(*fd, QSocketNotifier::Read, this);
connect(TS_Notifier, SIGNAL(activated(int)),this, SLOT(readTSData()));
}
讀觸摸屏數(shù)據(jù)函數(shù)readTSData()的程序流程如圖3所示。
3.3? 完成手寫顯示和識(shí)別字顯示界面
手寫輸入法的具體實(shí)現(xiàn)是在Qtopia層,利用Qtopia提供的API來(lái)完成中文手寫輸入法的手寫顯示及識(shí)別字顯示。在這里利用輸入法插件接口——InputMethodInterface類,通過(guò)對(duì)該類的繼承以及對(duì)該類成員函數(shù)的重載,完成手寫輸入法,最終編譯成鏈接庫(kù)形式,被Qtopia服務(wù)器自動(dòng)調(diào)用。
class QTOPIA_PLUGIN_EXPORT UniKeyboardImpl : public InputMethodInterface {
public:
…
Q_REFCOUNT
virtual QWidget*inputMethod(QWidget*parent, Qt::WFlags f);
//需要重載的虛函數(shù),在該函數(shù)中可以添加用戶自定義的輸入法類
…
private:
HandWrKeyboard *input;
//HandWrKeyboard是手寫輸入法的類
…
};
函數(shù)virtual QWidget *inputMethod( QWidget *parent, Qt::WFlags f )重載為:
QWidget *UniKeyboardImpl::inputMethod( QWidget *parent, Qt::WFlags f ) {
if ( !input )
input=new HandWrKeyboard( parent, "HandWriting", f );
return input;
}
從功能上手寫輸入法軟件部分可分為兩種:顯示筆劃軌跡與顯示識(shí)別候選字。
觸摸屏和HW006連接部分是完全的模擬量,由于液晶逆變器高頻高壓的干擾,筆劃軌跡變得明顯,與實(shí)際所寫軌跡不符。除了需要在硬件上加濾波電容外,軟件中也需要進(jìn)行一定的修正。這里,采用3點(diǎn)均值濾波的方式來(lái)減小噪聲干擾的影響。
在讀到第一個(gè)點(diǎn)時(shí),不做處理;讀到2個(gè)點(diǎn)時(shí),取這2個(gè)值的平均。這樣,得到的坐標(biāo)數(shù)據(jù)量不會(huì)不足,而且均值濾波可以很好地消除噪聲的影響。
讀漢字碼是通過(guò)讀有名管道來(lái)實(shí)現(xiàn)的。經(jīng)過(guò)實(shí)驗(yàn),發(fā)現(xiàn)HW006在發(fā)送漢字碼時(shí),偶爾會(huì)出現(xiàn)發(fā)送的個(gè)數(shù)與所設(shè)置的不符。我們?cè)O(shè)置的識(shí)別字個(gè)數(shù)是5個(gè),共10字節(jié)的數(shù)據(jù)。但如果所寫的漢字比較簡(jiǎn)單,HW006可能識(shí)別不了5個(gè)漢字,這樣發(fā)送給管道的數(shù)據(jù)不足10字節(jié),結(jié)果會(huì)造成最終顯示錯(cuò)誤。為此,在讀取漢字碼的開(kāi)始和結(jié)束處分別加一個(gè)起始位和結(jié)束位,這樣根據(jù)讀取管道得到的漢字碼個(gè)數(shù)和起始位、結(jié)束位來(lái)判斷識(shí)別結(jié)束,將最終得到的識(shí)別漢字正確地顯示出來(lái)。
4 ?結(jié)論
在“PXA255+Linux+Qtopia”平臺(tái)上的運(yùn)行及測(cè)試結(jié)果表明手寫識(shí)別率能達(dá)到95%以上。由于HW006也實(shí)現(xiàn)了觸摸屏控制器的功能,在硬件結(jié)構(gòu)上完全可以代替原來(lái)的觸摸屏控制器,因此并沒(méi)有增加硬件的成本和復(fù)雜度。從上面的分析可以清楚地看出,此設(shè)計(jì)方案具有實(shí)用性和普遍意義,完全可以應(yīng)用于其他嵌入式平臺(tái)上。
參考文獻(xiàn)
[1]? 倪繼利. Qt及Linux操作系統(tǒng)窗口設(shè)計(jì)[M]. 北京:電子工業(yè)出版社,2006.
[2]? Rubini A. Linux設(shè)備驅(qū)動(dòng)程序[M]. 聊鴻斌,等譯. 北京:中國(guó)電力出版社,2000.
[3] ?Richard W Stevens. UNIX網(wǎng)絡(luò)編程第2卷:進(jìn)程間通信[M]. 楊繼張,譯. 北京:清華大學(xué)出版社,1999.
楊自鋒(碩士),主要研究方向?yàn)榍度胧较到y(tǒng);
趙建業(yè)(教授),主要研究方向?yàn)?a href="http://www.www27dydycom.cn/tags/神經(jīng)網(wǎng)絡(luò)/" target="_blank">神經(jīng)網(wǎng)絡(luò)、DSP、嵌入式系統(tǒng)。
(收修改稿日期:2007-01-21)
評(píng)論