摘要本文介紹了在嵌入式系統下,使用PCL指令集將漢字的點陣數據通過網絡通信接口發送給無硬件字庫卡的網絡打印機,以實現漢字字符打印的方法。
關鍵詞 字庫卡 漢字 網絡打印
中圖分類號:TP391.1文獻標識碼:A
Implementation The Window Widgets in the Embedded Graphics Library
LI Ming, LI Kefeng
(He'nan Academy of Engineering, Zhengzhou, He'nan 450000)
AbstractThe article describes the embedded system, using the PCL command set to the dot matrix character data sent to network printerwithout hardware font card , through the network communication interface, to achieve the method of Chinese character printing.
Key wordsfont card; Chinese character; network printing
0 前言
目前,市面上的打印機大多配置有硬件字庫卡,但帶字庫卡的打印機比不帶字庫卡的打印機價格高很多,因此,在嵌入式系統作為終端的設備中,且打印格式固定的情況下,可以采用不帶字庫卡的打印機,使用打印機語言實現漢字字符的打印。
不同的打印機所采用的打印指令集,打印機通過接收來自嵌入式系統終端的控制命令來完成打印操作。本文主要說明的如何使用PCL指令集對帶有網絡服務端的HP激光打印機編寫打印驅動程序。
1 基本思路
在嵌入式系統中,讀取點陣字庫,獲取漢字的點陣數據的字模,然后通過PCL指令集,組織需要打印的漢字數據,通過網絡命令發送到不帶硬件字庫卡的激光打印機的網絡服務端,網絡打印機接收到打印指令后,實現打印操作。
表1
2 PCL指令集
PCL ( Printer Command Language )是 HP 針對打印機產品推出的一種打印頁面描述語言,PCL打印機語言為各種應用程序提供一種經濟適用的方法,控制打印機的各種打印功能。
PCL 打印機語言提供了使用打印機功能的方式,通常有四種:控制代碼、 PCL命令、HP-GL/2 命令、PJL 命令。其中,控制代碼是啟動某個打印機功能的字符,如回車(CR)、換行(LF)、換頁(FF)等等。PCL命令可提供對打印機PCL 控制結構的訪問。PLC指令集有固定格式,一個PCL命令由兩個以上的字符構成。表一中列舉了常用的PCL控制命令。
3 漢字字模
在標準漢字庫中,漢字編碼是以機內碼的形式存在的,每個漢字由兩個字節組成,因此漢字區位碼與機內碼的換算關系為:
區碼 = 漢字機內碼第一個字節 - 128 - 32= 漢字機內碼第一個字節 - 0xA0,
位碼 = 漢字機內碼第二個字節 - 128 - 32= 漢字機內碼第二個字節 - 0xA0,
這樣,點陣數據在字庫文件中的偏移 = ((區碼-1) * 94 + 位碼-1) *一個點陣字模占用的字節數。在得到偏移地址后,即可讀取漢字的點陣數據到緩沖區。
以下是根據機內碼獲取16*16漢字的點陣數據的實現代碼:
unsignedint * get_hz_bit(char hz[2])
{
char* hzBuf[100];/*定義字模存儲緩沖區*/
intqh,wh;
intoffset;
FILE* fp;
qh = hz[0]-0xA0;/*獲取區位碼*/
wh = hz[1]-0xA0;
offset = ((qh-1)*94+wh-1)*32;/*獲取漢字在字庫中的偏移量*/
fp=fopen(\"HZK16\",\"r\");
fseek(fp,offset,SEEK_SET);/*根據偏移量尋址*/
fread(hzBuf,1,32,fp);/*讀取點陣數據*/
fclose(fp);
return hzBuf;
}
4 網絡發送
Hp打印機的內置打印服務器作為服務端,在9100端口上偵聽、接收網絡上的打印數據,處理后通過打印機接口送至打印機,實現數據打印。本文中采用TCP/IP協議中的socket套接字接口來實現網絡數據的發送。
創建套接字—socket()
int socket(int af, int type, int protocol);
參數af為地址族,設置為AF_INET。參數type為要創建的套接字類型,設置為流模式SOCK_STREAM。Protocol通信協議類型,通常默認為0。
建立套接字連接──connect()
int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
參數sockfd為socket()返回的套接字描述符。結構sockaddr_in指定了協議族、服務器IP、服務器端口。
部分實現代碼如下:
serv_Size = sizeof (struct sockaddr_in);
memset ((char *) serv_Addr, 0,serv_Size);
serv_Addr.sin_family = AF_INET;
serv_Addr.sin_port = htons (9100);
serv_Addr.sin_addr.s_addr = inet_addr(\"192.168.0.110\");
sock=socket(AF_INET,SOCK_STREAM,0);
if (connect(sock, (struct sockaddr *) clientAddr, clientSize)==OK)
{
if((num=send(sock, print_Buf, sbuffer,0))==ERROR)
{
close(sock);
return(ERROR);
}
}
else
{
close(sock);
return(ERROR);
}
5 結束語
在具體的驅動編程中,需要設置使用PCL設置打印機控制參數,然后將要PCL指令和打印字的漢字字符串放在一個較大的數據緩沖區中,通過socket套接字發送至打印機服務端就可以了。本文來源于一次工程項目,打印驅動在設備上運行良好。
參考文獻
[1]惠普公司. PCL 5 Printer LanguageTechnicalReference Manual. 1994修訂版.
[2]王士元.C作圖與C漢字技術.天津大學出版社,1995.
[3]詹俊鵠,于衛.實戰Linux Socket 編程.西安電子科技大學出版社,2002.
“本文中所涉及到的圖表、公式、注解等請以PDF格式閱讀”