转:并口编程参考资料
并行接口的分類: SPP(標準并行接口) ,EPP(增強型并行接口),ECP(擴展型并行端口)
標準并行端口(SPP)也是最早的端口定義,主要功能如下,1:并行端口提供了8個數(shù)據(jù)線以進行并行的字節(jié)傳輸,2:計算機能夠通過數(shù)據(jù)線向打印機發(fā)送選能信號,以通知打印機已經(jīng)準備好接收數(shù)據(jù),3:打印機招收到數(shù)據(jù)后,向計算機發(fā)送一個回應信號(NACK)。其各位信號線所代表的意義詳見下表。
增強型并行端口(EPP)的出現(xiàn)提供了一種更高性能的連接方式,并東路向下兼容所有在此之前存在的并行接口及外設。與SPP不同之處在于原來17個信號中的重新定義,在這17個信號中,EPP使用了其中的14個信號進行傳輸,握手和選通,剩下的3個信號可以由外設設計者有來自定義。
? 并行接口的大致結(jié)構(gòu):
????? 并行口一般有25個引腳,其中包括8位數(shù)據(jù)線,5位打印機狀態(tài)線,4位控制線.下面將對這些引腳予以詳細說明:
? (注:1:>出,表示由計算機發(fā)向打印機;入,表示由打印機發(fā)向計算機,
????? 2:>低電平有效信號用上劃線或星號表示(如S7*),高電平有效信號則沒有上劃線或星號)
??????
| 引腳號
| 名稱
| 數(shù)據(jù)位 | 寄存器 | 數(shù)據(jù)方向
| 定義
|
| 1 | /STROBE | C0* | 出 | 選通信號,低電平有效信號,表明線上有數(shù)據(jù)到達. | |
| 2 | D0 | DATA_1-DATA_8
? | D1-D8 | 出 | ?
?
? 八位數(shù)據(jù)線,只有在SPP指令下才有能輸出數(shù)據(jù). ?
?
?
?
|
| 3 | D1 | 出
| |||
| 4 | D2 | 出 | |||
| 5 | D3 | 出 | |||
| 6 | D4 | 出 | |||
| 7 | D5 | 出 | |||
| 8 | D6 | 出 | |||
| 9 | D7 | 出 | ?
| ||
| 10 | /ACK | S6 | Status | 入 | 應答,以插入低電平的形式出現(xiàn),表明最后一個字符已招收完畢。 |
| 11 | BUSY | S7* | Status | 入 | 繁忙通知,以插入高電平的方式出現(xiàn),表明打印機處于忙狀態(tài)不能再接收數(shù)據(jù)。 |
| 12 | PE | S5 | Status | 入 | 沒有打印機紙。 |
| 13 | SELECT | S4 | Status | 入 | 選擇輸入,以插入高電平的方式出現(xiàn),表明打印機處于在線待命狀態(tài)。 |
| 14 | AUTO FEED | C1* | Control | 出 | 自動饋送,低電平有效信號民,通知打印機對于每遇到一個回車進行自動換行。 |
| 15 | /ERROR | S3 | Status | 入 | 錯誤,該信號由打印機發(fā)向計算機,表明打印機處于錯誤狀態(tài)。 |
| 16 | /INIT | C2 | Control | 出 | 初始化,低電平有效信號,該信號用來對打印機進行復位。 |
| 17 | /SELIN | C3* | Control | 出 | 選擇輸入,低電平有效信號,表明已經(jīng)選中的打印機。 |
| 18 | GND | --- | 信號接地 | ||
| 19 | GND | --- | 信號接地 | ||
| 20 | GND | --- | 信號接地 | ||
| 21 | GND | --- | 信號接地 | ||
| 22 | GND | --- | 信號接地 | ||
| 23 | GND | --- | 信號接地 | ||
| 24 | GND | --- | 信號接地 | ||
| 25 | GND | --- | 信號接地 |
??? 打印機常用端口: 對于LPT1:0X378 為數(shù)據(jù)發(fā)送地址,0X379為打印機狀態(tài)地址,0X37A為計算機向打印機控制地址, 通常為了使程序具有通用性我們可以從注冊表中取得這個地址,對于WINDOWS CE 而言,這個值被存儲在{HKEY_LOCAL_MACHINE//DRIVERS//BUILTIN//PARALLEL//IOBASE}.然后我們就可以通過對此三個端口進行控制達到簡單的并口編程的目的.
下面是對打印機狀態(tài)端口及打印機控制端口作一詳細解釋:
控制端口:
| 0x37A | 1 | 1 | 輸入控制 | 中斷 | 17線 | 16 線 | 14 線 | 1? 線 |
這個0x37A計算機控制打印機的地址,可以產(chǎn)生對打印機進行控制的必要信號,可寫,兩高位(7和8)沒什么用,第6位寫1表示可以向并口輸出數(shù)據(jù)。第五位中斷信號(IRQ EN),利用此信號線,驅(qū)動程序可以在STATUS端口信號(nAck)的幫助下,使用該信號對中斷信號的產(chǎn)生與否進行控制。第3,2,1,0位分別控制第17線,第16線,第14線和第1線。(可以控制它們的狀態(tài))具體作用可參見前表
狀態(tài)端口:
| 0x379 | (S7)11 忙 | (S6)10應答 | (S5)12缺紙 | (S4)13聯(lián)機 | (S3)15 錯誤 | ? S2 | S1?
| S0?
|
?
0x379為打印機狀態(tài)地址,可讀,通過個端口打印機適配器可以很方便的讀取打印機的狀態(tài)。
標記為S7的信號表示最高位,SO表示為最低位,只有S3-S7五個信號才是真正有用的信號。他們的具體信號功能解釋如下:
S7*(busy):打印機使用該信號表示打印機正處于忙狀態(tài),不能再接收數(shù)據(jù)。需要強調(diào)的是,該信號通過適配器板時,進行了反相處理,因此連接器上的低電平到微處理器時就變成了高電平。
S6(nAck):當適配器發(fā)出選通信號時,打印機就會產(chǎn)生該信號作為響應。通常情況下,該信號是高電平,選通打印機之后,打印機首先把該信號設為低電平,然后再返回高電平。
S5(PE):當打印機缺紙時,它就會產(chǎn)生一個這樣的信號,通常情況下,該信號由打印機保持為低電平,打印機紙使用完之后,該信號就會變成高電平。
S4(SELECT):當打印機恢復正常操作時,它就會插入一個高電平的該信號。當打印機處于無效狀態(tài)時,訪信號就會變成低電平。
S3(NERROR):當打印機出現(xiàn)錯誤時就會產(chǎn)生這種郵錯信號。產(chǎn)生出錯的原因很多,如打印紙堵了或產(chǎn)生了內(nèi)部錯誤。產(chǎn)生錯誤時該信號就會設置成低電平。
以下為在Windows CE 下打印機各種狀態(tài)時,所對應的狀態(tài)寄存器的(AL)的值:
1:>在沒接入打印機時寄存器AL值為127,對應二進制是:1111111
2:>打印機在缺紙燈不亮時寄存器AL值為144,對應二進制是:10010000
3:>打印機在缺紙燈亮時寄存器AL值為 119;對應二進制值是:11101111
4:>打印機在不缺紙的情況下寄存器AL值 223,對應二進制值是:11011111
5:>打印機在沒開機的情況下得到AH值為207,對應二進制值是:11001111
下面介紹對并口的編程控制:
(編程控制示例)(為匯編代碼)
// 此段代碼為并口向打印機進行寫數(shù)據(jù),并發(fā)送控制信息。
#define LPT_CLEAR_MASK 0x40
#define LPT_STROBE_HI 0x0D
#define LPT_STROBE_LO 0x0C
#define LPT_STATUS_BITS 0xF8
#define LPT_BITS_INVERT 0x48
#define LPT_NOTBUSY 0x80
#define LPT_PAPEROUT 0x20
#define LPT_SELECT 0x10
#define LPT_NFAULT 0x08
#define LPT_TimeOut 0x01
void OutByte(ULONG dataport, BYTE databyte) {
#if x86
_asm {
mov dx, word ptr [dataport]
mov al, byte ptr [databyte]
out dx, al
out dx, al
add dx, 2
in al, dx
and al, LPT_CLEAR_MASK
mov cl, al
or al, LPT_STROBE_HI
out dx, al
out dx, al
out dx, al
out dx, al
or cl, LPT_STROBE_LO
mov al, cl
out dx, al
}
#else
WRITE_PORT_UCHAR((PUCHAR)dataport,databyte);
dataport+=2;
databyte = (READ_PORT_UCHAR((PUCHAR)dataport) & LPT_CLEAR_MASK)
| LPT_STROBE_HI;
WRITE_PORT_UCHAR((PUCHAR)dataport,databyte);
databyte = (READ_PORT_UCHAR((PUCHAR)dataport) & LPT_CLEAR_MASK)
| LPT_STROBE_LO;
WRITE_PORT_UCHAR((PUCHAR)dataport,databyte);
#endif
}
// 此段代碼為讀取打印機當前狀態(tài)。
BYTE CheckStatus(unsigned port) {
BYTE bRet;
#if x86
_asm {
mov dx, word ptr[port]
Checkme:
in al, dx
mov ah, al
nop
nop
in al, dx
cmp al, ah
jnz Checkme
and ah, LPT_STATUS_BITS
xor ah, LPT_BITS_INVERT
test ah, LPT_PAPEROUT or LPT_NFAULT
jnz CS_HasError
test ah, LPT_SELECT
jz CS_HasError
and ah, LPT_NOTBUSY
jz CS_HasError
xor eax, eax
CS_HasError:
mov [bRet],al
}
#else
BYTE bStatus;
do {
bRet= bStatus= READ_PORT_UCHAR((PUCHAR)port);
} while (bStatus != READ_PORT_UCHAR((PUCHAR)port));
bStatus&= LPT_STATUS_BITS;
bStatus^= LPT_BITS_INVERT;
if (!(bStatus & (LPT_PAPEROUT | LPT_NFAULT)) &&
(bStatus & LPT_SELECT) && (bStatus & LPT_NOTBUSY))
bRet=0;
#endif
return bRet;
}
// The End
總結(jié)
以上是生活随笔為你收集整理的转:并口编程参考资料的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运营商认证是什么东西
- 下一篇: 3月第3周新闻回顾:3Com案三日动荡