全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2576
推到 Plurk!
推到 Facebook!

並列埠以&379取得輸入值

尚未結案
sehilly
一般會員


發表:5
回覆:2
積分:1
註冊:2005-01-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-24 16:19:47 IP:61.219.xxx.xxx 未訂閱
我以BCB6撰寫一個程式,運用printport &378傳輸一8 bit的值,供硬體判斷完後回傳1 bit的值要以&379取得,請問要如何撰寫? 我在printport空接時,將379的信號印出得到的值是127,請問為什麼會這樣呢?另外state register只有5隻pin可以用,那信號是該如何推算,例如&378的255是指11111111,但&379該如何推算呢?只有五隻pin。
Leeway
一般會員


發表:2
回覆:18
積分:4
註冊:2003-06-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-25 01:29:28 IP:61.70.xxx.xxx 未訂閱
小弟剛好前陣子遇到個Case,必須利用 Printer Port 的 D0 腳位來控制燈號閃爍或熄滅(電源從 PC 另外拉).    首先必須確認您的 OS,若為 Win98,則I/O不受限制,但若為 WinNT(Win2K/WinXP/Win.Net) 則:    lcsboy 版主有提供 【BCB】【發表】Win2K/WinXP/Win.Net 環境下讀寫IO的solution http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21427 以下小弟提供的 Code, Win98 部分以 OutPortb(Word Addr,Byte Data) 對 Address 直接操作 ,WinNT 部分即使用 lcsboy 版主之 WinIO 牛刀小試,希望對你有所幫助:
 
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
#include "winio.hpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int WinNT = 0;
//---------------------------------------------------------------------------
 void OutPortb(Word Addr,Byte Data)
{
   __asm{
         mov dx,Addr
         mov al,Data
         out dx,al
        }
}
//---------------------------------------------------------------------------
byte InPortb(Word Addr)
{
   byte result;
   __asm{
          mov dx,Addr
          in al,dx
          mov result,al
        }
        return(result);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if (WinNT)
  {
    r.type=IOACCESS_WRITE_BYTE;
    r.m_dx=0x378;
    r.m_al=0x01;
    WinIO();
  }
  else 
  {
    OutPortb(0x378,0x01);
  }
  Label2->Caption = "閃爍!";
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button2Click(TObject *Sender)
{
  if (WinNT)
  {
    r.type=IOACCESS_WRITE_BYTE;
    r.m_dx=0x378;
    r.m_al=0x00;
    WinIO();
  }
  else
  OutPortb(0x378,0x00);
  Label2->Caption = "熄滅!";
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormCreate(TObject *Sender)
{
  OSVERSIONINFO osv;
        osv.dwOSVersionInfoSize = sizeof(osv);
        GetVersionEx(&osv);
        // 判斷目前使用的OS, 是否為WinNT 系列
        if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT)
        {
          // 如果是WinNT系列, 動態啟動WDM Driver
          WinNT=1;
          if (!OpenDriver())
          {
            ShowMessage("Driver not ready!!!");
            CloseDriver();
            Application->Terminate();
          }          
        }
}
//---------------------------------------------------------------------------    
發表人 - leeway 於 2005/02/25 03:41:11
Leeway
一般會員


發表:2
回覆:18
積分:4
註冊:2003-06-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-25 01:43:39 IP:61.70.xxx.xxx 未訂閱
補充一下:    axsoft 版主也提供了 io.dll 2002 http://delphi.ktop.com.tw/topic.php?topic_id=23311 文章中另外介紹了 Parallel Port Monitor 這個軟體,小弟覺得非常好用(Debug時),監控 D0 ~ D7 的狀態遊刃有餘 ^^ 以下節錄 axsoft 版主的介紹: 如果有朋友須要監測Printer Port這裡有個Tools可以幫一些忙! Parallel Port Monitor Your Attention Please! A bug was found in Parallel Port Monitor that caused the error "Unable to start the IO.SYS service" to occur on Windows 2000/XP machines. This bug has been found and was fixed on 08/06/02. If you are using an older version of the software, you will want to upgrade now! (圖見 http://delphi.ktop.com.tw/topic.php?topic_id=23311) The Parallel Port Monitor is a utility for viewing and manipulating the state of a parallel port on a Windows 95/98/ME/NT/2000 computer. Download http://geekhideout.com/downloads/parmon.zip (209k ) 發表人 - leeway 於 2005/02/25 03:41:46
Leeway
一般會員


發表:2
回覆:18
積分:4
註冊:2003-06-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-25 03:24:35 IP:61.70.xxx.xxx 未訂閱
另外, 關於 379 讀回 127 的問題,請見:    Mini HOWTO:Linux I/O port programming http://www.linux.org.tw/CLDP/MiniHOWTO/prog/IO-Port-Programming/IO-Port-Programming-6.html 以下節錄: /*******************************************************/ 並列埠的基本埠位址 (以下稱之為 ``BASE'') 之於 /dev/lp0 是 0x3bc , 之於 /dev/lp1 是 0x378 , 之於 /dev/lp2 是 0x278 . . . . . . . 埠位址 BASE 1 (狀態埠) 是個僅讀 (read-only) 的埠, 會將下面的輸入信號位準讀回: Bits 0 和 1 保留不用. Bit 2 IRQ 的狀態 Bit 3 ERROR (1=高位準) Bit 4 SLCT (1=高位準) Bit 5 PE (1=高位準) Bit 6 ACK (1=高位準) Bit 7 -BUSY (0=高位準) /*******************************************************/
zeek
一般會員


發表:11
回覆:3
積分:2
註冊:2004-11-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-28 17:22:41 IP:220.136.xxx.xxx 未訂閱
可以問個題外話嗎? 我的Printer Port好像壞了~ 情況是這樣的~ 我從0X378丟FF出來~量到的只有10011010 後來才發現唯有BIT 1 3 4 7 可以動~其他完全不行~ 可是同樣的CODE換到另一台電腦~丟什麼就出來什麼~ 請問這是PORT壞了嗎?? 我前陣子買了個二手的印表機~插PRINTER PORT的~ 不能用~唯一印出來的一張就是那測試頁~ 如果說PORT壞了~卻為何能列印出測試頁呢~~ PS.列印出來的測試頁過了很久才印出來的~@@ 煩請各位先進幫忙解答一下~謝謝^^感恩~
sehilly
一般會員


發表:5
回覆:2
積分:1
註冊:2005-01-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-28 18:38:53 IP:61.219.xxx.xxx 未訂閱
親愛的seek。關於你的問題我倒是沒遇過,但你可以先試著換一條printport的傳輸線看看,再來就是把你的電腦中的printport的驅動程式移掉再自動抓回來看看。如果還是有一樣的問題存在或許就是燒壞了...
zeek
一般會員


發表:11
回覆:3
積分:2
註冊:2004-11-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-02 23:10:01 IP:218.168.xxx.xxx 未訂閱
Sehilly前輩~我叫Zeek拉~ 不是SEEK@@ 我是過您的方法了~~還是不行...@@ 而且這次我沒透過CABLE線~我直接量後面的接腳~@@ 後來我用LABVIEW~ 一樣透過0X378丟~透過0X378讀回~~ 讀回的值卻沒錯@@真是見鬼ㄌ.... 我想可能真的是燒壞了吧~~~不過為何讀回會正確咧~難道REGISTER沒壞~ 壞的是REGISTER接出來的PAD?@@ 總之謝謝Sehilly前輩嚕^^
系統時間:2024-05-04 18:36:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!