新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于ARM9和Linux的嵌入式打印終端系統(tǒng)

基于ARM9和Linux的嵌入式打印終端系統(tǒng)

作者: 時間:2012-04-11 來源:網(wǎng)絡(luò) 收藏

3.1.3 初始化端口

初始化機(jī)第一個要做的事情就是要對GPIO口進(jìn)行初始化,初始化函數(shù)如下:

static void weida_init(void){
devfs_register(); /*注冊設(shè)備驅(qū)動*/
set_gpio_ctrl(WEIDA_STB|GPIO_PULLUP_DIS|GPIO_MODE_OUT); /*設(shè)置STB口*/
write_gpio_bit(WEIDA_STB,1);
weida_printer_io_port_init();
/*設(shè)置其它IO口,以及賦初值*/ }

其中,WEIDA_STB為連接機(jī)選通口初始化為高電平,GPIO_PULL_DIS是設(shè)置是否需要上拉電阻,GPIO_MODE_OUT 設(shè)置GPIO口為輸出口。最后使用module_init(weida_printer_init);采用模塊方式加載驅(qū)動。[2]

3.1.4 接口函數(shù)設(shè)計

ioctl()函數(shù)主要完成打印機(jī)字體、行距等參數(shù)的設(shè)置,在設(shè)計過程中必須解決用戶數(shù)據(jù)和內(nèi)核數(shù)據(jù)之間如何傳遞。從用戶態(tài)讀取數(shù)據(jù),然后在內(nèi)核態(tài)運行,可以使用copy_from_user函數(shù)來完成傳遞數(shù)據(jù)。

weida_printer_write ( )先對打印機(jī)是否在線,是否忙,是否準(zhǔn)備好做進(jìn)一步的判斷,然后再進(jìn)行打印。在打印的時候要注意每發(fā)一個字符要延遲150毫秒,因為如果打印數(shù)據(jù)發(fā)得過快打印機(jī)的來不急處理,所以要設(shè)置延時。

open/close函數(shù)打開/關(guān)閉文件,因為在LINUX下設(shè)備都是當(dāng)作文件來操作的,所以需要open和close這兩個接口函數(shù)。

3.2 掃描儀串口的設(shè)置

移動打印中使用到的掃描儀是串口掃描儀,這種掃描儀相對于USB接口的掃描儀來說,控制較簡單,在掃描儀掃描后,可以直接從串口讀取數(shù)據(jù)。

3.2.1 串口設(shè)置[3]

設(shè)置串口速率函數(shù):set_speed(int fd, int speed),其中fd 為打開的設(shè)備文件,speed為速率。

設(shè)置串口參數(shù):set_parity(int fd,int databits,int stopbits,int parity),databits為有多少個數(shù)據(jù)位,stopbit為設(shè)置多少個停止位,parity為奇偶校驗位設(shè)置。設(shè)置串口波特率為9600,數(shù)據(jù)位為8位,一位停止位,沒有校驗位。

3.2.2 編寫讀取掃描儀數(shù)據(jù)函數(shù)

首先打開設(shè)備文件,該中使用的串口為串口2,因此打開函數(shù)為:

open(“/dev/ttyS1”,O_RDWR|O_NONBLOCK|O_NDELAY);其中,O_RDWR表示可讀可寫,O_NONBLOCK表示非堵塞模式,O_NDELAY表示沒有延遲,立即發(fā)出去。

3.2.3 客戶端和服務(wù)器的socket編寫

打印采用C/S的模式,把PC機(jī)作為服務(wù)器,開發(fā)板作為客戶端,通過以太網(wǎng)連接。客戶端建立一個socket連接去尋找PC機(jī)上的服務(wù)程序。PC機(jī)上同時也運行一個socket用來listen請求和綁定。采用的是TCP的連接方式。

3.4 主應(yīng)用程序的設(shè)計

開發(fā)板上的應(yīng)用程序Main函數(shù)注冊兩個線程p1和p2,兩個全局?jǐn)?shù)組c1和c2。

線程p1將從串口讀到的數(shù)據(jù)放入c1中,然后sent socket直接從c1中取走數(shù)據(jù)發(fā)送給服務(wù)器。線程p2負(fù)責(zé)將received socket數(shù)據(jù)放入c2數(shù)組中,然后直接從c2取走數(shù)據(jù)交給打印機(jī)去打印。

這里對線程使用了兩個信號量,并初始化為:sem_init(sem1,0,1); sem_init(sem2,0,0); [4]

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

linux相關(guān)文章:linux教程


三維掃描儀相關(guān)文章:三維掃描儀原理


評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉