這篇文章,是因為要做專題所做的筆記
不囉嗦,切入正題
1.下載 inpout32_source_and_bins.zip 找到裡面的 inpout32.dll ,放到 C:\Windows\System32\ 目錄下
2.開始寫程式碼
1 2 3 4 5 6 7 8 9 10 11 12 | using System.Runtime.InteropServices; //記得在最上面要加上這行 public class PortAccess //產生一個名為 PortAccess的類別 { [DllImport("inpout32.dll", EntryPoint = "Out32")] public static extern void Output(int adress, int value); //Output( I/O位置, 輸出值 ); [DllImport("inpout32.dll", EntryPoint = "Inp32")] public static extern int Input(int adress); //傳回一個整數 Input( I/O位置 ); } |
接下來就是開始寫應用了,假如要讓 LPT Port 輸出 4,I/O位置是 0x378H ,就寫
1 | Output( 888, 4); // 0x378 換成十進位就是 888 |
如果要讀取 LPT Port 的值,要記得先改變 ECR 暫存器的值,將暫存器設定為雙向模式
位 元 功 能
=========================================================
7,6,5
0 0 0 SPP標準模式(Standard Mode)
0 0 1 雙向模式(byte mode)
0 1 0 並列緩衝模式(Parallel Port FIFO Mode)
0 1 1 ECP緩衝模式(ECP FIFO Mode)
1 0 0 EPP模式
1 0 1 保留
1 1 0 緩衝試驗模式
1 1 1 輪廓模式
———————————————————
4 ECP中斷位元
3 DMA致能位元
2 ECP服務位元
1 FIFO緩衝器已滿
0 FIFO緩衝器已空
=========================================================
ECR 暫存器位置為 0x77AH,換算為十進位就是1914
1 | Output( 1914, 32); // 設定雙向模式 |
然後把 LPT Port 設為輸入模式,將 0x37AH 第 5 位元設為 1
1 | Output( 890, 32); // 設定為輸入腳 |
最後就是讀取啦~
1 | int i = Input( 888); // 記得會回傳一個 int 的輸入值 |
如果要輸出的話,記得將第 5 位元設為 0
好了,教學到此結束~
自己寫了一個測試程式,有需要可以用(不過不含原始碼)
參考資料:
How to check print port’s mode – Delphi K.Top討論區
要如何從使用ASM來擷取LPT中的訊號呢? – Delphi K.Top討論區
延伸閱讀:
I/O Ports Uncensored – 1 – Controlling LEDs (Light Emiting Diodes) with Parallel Port
I/O Ports Uncensored Part 2 – Controlling LCDs (Liquid Crystal Displays) and VFDs (Vacuum Fluorescent Displays) with Parallel Port
Delphi K.Top … 好懷念的討論區
當初在玩 Delphi 的時候常跑這個站呢..
0.0
您好
請問當A儀器的LPT輸出端子 可以接在B電腦的LPT接收資料嗎?
例如:A儀器的LPT列印出”1234″但不要把輸出端子連接印表機而是改連B電腦 ,B電腦可接收到”1234″嗎?
因為 Pin 2 ~ Pin 8 是雙向阜,所以照理來講應該可以
但也要看傳送與接收的程式是如何設計的
(是否有用到 Control / Status Port 之類的,如果有用到的話就需要跳線,因為 Status Port 電腦端只能寫入不能讀取,Control Port 則反之)
如果要互傳資料,還是用 RS232 會比較省事
以上資料或許會有錯,因為我只是個不專業的死大學生 XD
[…] http://www.sllk.net/wordpress/?p=433 […]
C# 热敏打印机获取状态不知道您会吗 我用的是并口 不知道怎么获取打印机传回来的状态
位置設定 889 ( 16 進位為 0x379h,這個位置為 Status Port )
之後讀取 Port 的值應該就可以了
( 讀取狀態這我沒有實作過,但是應該差不多 )
非常感谢你的回复,我用的是发送ESC/POS指令的方法获取打印机返回的状态,现在是不知道用C# 怎么获取,用input()可以吗?该怎么发送下面的指令呢?我是这样写的output(888,16);output(888,4);output(888,1);int i=input(889), 获取到的i值不对
DLE EOT
[Name] Transmit real-time status
[Format]
ASCII DLE EOT n [a]
Hex 10 04 n [a]
Decimal 16 4 n [a]
[…] 回答: http://www.sllk.net/wordpress/?p=433 […]
POS 系統指令沒用過,所以幫不上忙 Sorry 囉ˊˋ
您好~~
我依照您的教學但讀取 LPT port data 讀不到!麻煩您幫忙釋疑,感謝~~
程式如下:
private void Form1_Load(object sender, EventArgs e)
{
PortAccess.Output(1914, 32);
PortAccess.Output( 890, 32); // 設定為輸入腳
int A = 3;
// int A = 252;
int D = PortAccess.Input(888); //Read LPT Port
D = D & A;
PortAccess.Output(890, 00); // 設定為輸出腳
PortAccess.Output(888,D);
this.Close();