利用usb傳輸 控制8051晶片 用久會發生錯誤 |
答題得分者是:nisson
|
mirood
一般會員 發表:10 回覆:27 積分:7 註冊:2007-02-28 發送簡訊給我 |
利用以下的code,
呼叫port1, 但是不斷的執行此port, 久了會發生錯誤, 請問是不是記憶體的暫存沒有釋放問題, 電腦從新開機就可以解決, 要如何解決此問題呢? 謝謝各位大哥~ [code cpp] #define P0_1 0x0001 if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; } else { if(Port_out&P0_1) Port_out-=P0_1; else Port_out|=P0_1; WriteIOData(Port_out); CheckPort(); } [/code] |
nisson
一般會員 發表:2 回覆:12 積分:22 註冊:2008-01-31 發送簡訊給我 |
|
mirood
一般會員 發表:10 回覆:27 積分:7 註冊:2007-02-28 發送簡訊給我 |
我是使用bcb撰寫的~ 原本以為利用動態連結檔的方法控制~ 也可以簡單達到控制目的~ 但是就是會有當機的或錯誤的發生~ USBIO 檔案名稱 : DevLink.dll 1. Link USB Driver (聯結USB Driver取得Driver的Handle) 函式原型 BOOL OpenLinkDevice(DWORD) 參數1 : DWORD hInst 裝置選擇Device0à9 預設為0 例: pfnOpenUSB(0) 注意 : 當USB Port有被開啟,離開應用程式必須呼叫CloseDevice() 2. Write Data to USBIO 函式原型BOOL WriteIOData(DWORD,LPBYTE,DWORD,LPDWORD) 參數1 : DWORD dwDevice 裝置編號 參數2 : LPBYTE pSrc Data Pointer 8051有2個Port byte[0]=Port1,byte[1]=Port2 參數3 : DWORD dwSize dwSize=2 , 2個Port 參數4 : DWORD dwRet 傳回寫入的大小 其中必須寫兩個byte至USBIO,因有兩個PORT,Port1 Port2 不能只寫一個byte給USBIO,否則會發生USBIO等待第二個 Byte的情形 3. Read data form USBIO 函式原型BOOL ReadIOData(DWORD,LPBYTE,DWORD,LPDWORD) 參數1 : DWORD dwDevice 裝置編號 參數2 : LPBYTE pDst Data Pointer 8051有2個Port 傳回的資料buffer byte[0]=Port1,byte[1]=Port2 參數3 : DWORD dwSize dwSize=2 , 2個Port 參數4 : DWORD dwRet 傳回寫入的Size 讀取資料必須要配好大於兩個byte的空間,讀取Port1與Port2的資料 4. Read Series Number form USBIO 函式原型BOOL ReadSeriesNo(DWORD,LPBYTE,DWORD,LPDWORD) 參數1 : DWORD dwDevice 裝置編號 參數2 : LPBYTE pDst 傳回Series Number字串 參數3 : DWORD dwSize dwSize=8 例 “12345678” 參數4 : DWORD dwRet 傳回讀出的Size 5. CloseDevice 函式原型BOOL CloseDevice (DWORD) 參數1 : DWORD dwDevice 裝置編號 Delete USB 的控制物件 關於如何呼叫DevLink.dll的程式有4個範例程式可參考 IO51 MFC與SDK DemoIO的範例程式 IO51是使用MFC所撰寫的範例程式 DemoIO是使用SDK所撰寫的範例程式 USBIO Visual Basic程式範例 Visual Basic呼叫動態聯結檔的宣告 Sample: Dim hDevice As Integer Private Declare Function OpenLinkDevice Lib _ "DevLink.dll" ( _ ByVal hInst As Integer, _ ) As Byte Private Declare Function WriteIOData Lib _ "DevLink.dll" ( _ ByVal hInst As Integer, _ ByRef pSrc As Byte, _ ByVal dwSize As Integer, _ ByRef dwRet As Integer _ ) As Byte Private Declare Function ReadIOData Lib _ "DevLink.dll" ( _ ByVal hInst As Integer, _ ByRef pSrc As Byte, _ ByVal dwSize As Integer, _ ByRef dwRet As Integer _ ) As Byte Private Declare Function CloseDevice Lib _ "DevLink.dll" (ByVal hInst As Integer) As Byte 更詳細部份請參考Visual Basic Sample Code USBIO 動態聯結檔(dll)使用方法
編輯記錄
mirood 重新編輯於 2008-02-16 19:25:29, 註解 無‧
|
mirood
一般會員 發表:10 回覆:27 積分:7 註冊:2007-02-28 發送簡訊給我 |
//--------------------------------------------------------------------------- #include #pragma hdrstop #include #include "Main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" // Port 1 #define PDIR1_0 0x0001 #define PDIR1_1 0x0002 #define PDIR1_2 0x0004 #define PDIR1_3 0x0008 #define PDIR1_4 0x0010 #define PDIR1_5 0x0020 #define PDIR1_6 0x0040 #define PDIR1_7 0x0080 // Port 2 #define PDIR2_0 0x0100 #define PDIR2_1 0x0200 #define PDIR2_2 0x0400 #define PDIR2_3 0x0800 #define PDIR2_4 0x1000 #define PDIR2_5 0x2000 #define PDIR2_6 0x4000 #define PDIR2_7 0x8000 TAPIMAIN *APIMAIN; #define DEVICE0 0 #define DEVICE1 1 // Call dll function declare. typedef BOOL (__stdcall *PFNOPENUSB)(DWORD) ; typedef BOOL (__stdcall *PFNWRITEIODATA)(DWORD,LPBYTE,DWORD,LPDWORD) ; typedef BOOL (__stdcall *PFNREADIODATA)(DWORD,LPBYTE,DWORD,LPDWORD) ; typedef VOID (__stdcall *PFNCLOSEDEVICE)(DWORD) ; //--------------------------------------------------------------------------- __fastcall TAPIMAIN::TAPIMAIN(TComponent* Owner) : TForm(Owner) { bPortOpen = FALSE; } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::ExitClick(TObject *Sender) { if(bPortOpen != FALSE) { CloseUSBPort(); bPortOpen = FALSE; } APIMAIN->Close(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::FormCreate(TObject *Sender) { hDll = NULL; PIOmask=0; Pdirmask=0; SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::SetPortEditText() { wsprintf(buffer,"0xx",(PIOmask & 0xFF)); IDC_EDITP1->Text = CharUpper(buffer); wsprintf(buffer,"0xx",((PIOmask & 0xFF00)>>8)); IDC_EDITP2->Text = CharUpper(buffer); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::OpenUSBClick(TObject *Sender) { if(bPortOpen != FALSE) { return; } if(hDll != NULL) { FreeLibrary(hDll); hDll = NULL; } PFNOPENUSB pfnOpenUSB = NULL; hDll = LoadLibrary("DevLink.dll"); if(hDll == NULL) { StatusBar1->Panels->Items[0]->Text = "狀態 : 找不到DevLink.dll或聯結錯誤" ; return; } pfnOpenUSB = (PFNOPENUSB)GetProcAddress(hDll,"OpenLinkDevice"); if(pfnOpenUSB ==NULL) { FreeLibrary(hDll); hDll = NULL; StatusBar1->Panels->Items[0]->Text = "狀態 : 讀取DevLink.dll函式OpenLinkDevice錯誤" ; return; } // Argument1 is device number if(!pfnOpenUSB(0)) { DWORD dwErrCode; dwErrCode = GetLastError(); wsprintf(buffer,"狀態 : 開啟USBPort失敗,系統錯誤碼 %d",dwErrCode); StatusBar1->Panels->Items[0]->Text = buffer; FreeLibrary(hDll); hDll = NULL; return; } bPortOpen = TRUE; StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort 開啟" ; } //--------------------------------------------------------------------------- bool __fastcall TAPIMAIN::WriteIOData(WORD wData) { BYTE pSrc[4]; DWORD dwRet; pSrc[0] = (BYTE)wData & 0x00FF; pSrc[1] = (BYTE)((wData & 0xFF00) >>8); PFNWRITEIODATA pfnWriteIoData = NULL; if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return FALSE; } pfnWriteIoData = (PFNWRITEIODATA)GetProcAddress(hDll,"WriteIOData"); if(pfnWriteIoData ==NULL) { StatusBar1->Panels->Items[0]->Text = "狀態 : 讀取DevLink.dll函式WriteIOData錯誤" ; return FALSE; } if(!pfnWriteIoData(DEVICE0,pSrc,2,&dwRet)) { DWORD dwErrCode; dwErrCode = GetLastError(); wsprintf(buffer,"狀態 : 寫資料失敗,系統錯誤碼 %d",dwErrCode); StatusBar1->Panels->Items[0]->Text = buffer; return FALSE; } return TRUE; } //--------------------------------------------------------------------------- bool __fastcall TAPIMAIN::ReadIOData(BYTE *pDst,LPDWORD dwRet) { PFNREADIODATA pfnReadIoData =NULL; if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return FALSE; } pfnReadIoData = (PFNREADIODATA)GetProcAddress(hDll,"ReadIOData"); if(pfnReadIoData ==NULL) { StatusBar1->Panels->Items[0]->Text = "狀態 : 讀取DevLink.dll函式ReadIOData錯誤" ; return FALSE; } if(!pfnReadIoData(DEVICE0,pDst,2,dwRet)) { DWORD dwErrCode; dwErrCode = GetLastError(); wsprintf(buffer,"狀態 : 讀資料失敗,系統錯誤碼 %d",dwErrCode); StatusBar1->Panels->Items[0]->Text = buffer; return FALSE; } return TRUE; } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR10Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR1_0) { Pdirmask &= ~PDIR1_0; PDIR10->Caption = "O"; } else { Pdirmask |= PDIR1_0; PDIR10->Caption = "I"; PIOmask |= PDIR1_0; PSTATE10->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR11Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR1_1) { Pdirmask &= ~PDIR1_1; PDIR11->Caption = "O"; } else { Pdirmask |= PDIR1_1; PDIR11->Caption = "I"; PIOmask |= PDIR1_1; PSTATE11->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR12Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR1_2) { Pdirmask &= ~PDIR1_2; PDIR12->Caption = "O"; } else { Pdirmask |= PDIR1_2; PDIR12->Caption = "I"; PIOmask |= PDIR1_2; PSTATE12->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR13Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR1_3) { Pdirmask &= ~PDIR1_3; PDIR13->Caption = "O"; } else { Pdirmask |= PDIR1_3; PDIR13->Caption = "I"; PIOmask |= PDIR1_3; PSTATE13->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR14Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR1_4) { Pdirmask &= ~PDIR1_4; PDIR14->Caption = "O"; } else { Pdirmask |= PDIR1_4; PDIR14->Caption = "I"; PIOmask |= PDIR1_4; PSTATE14->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR15Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR1_5) { Pdirmask &= ~PDIR1_5; PDIR15->Caption = "O"; } else { Pdirmask |= PDIR1_5; PDIR15->Caption = "I"; PIOmask |= PDIR1_5; PSTATE15->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR16Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR1_6) { Pdirmask &= ~PDIR1_6; PDIR16->Caption = "O"; } else { Pdirmask |= PDIR1_6; PDIR16->Caption = "I"; PIOmask |= PDIR1_6; PSTATE16->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR17Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR1_7) { Pdirmask &= ~PDIR1_7; PDIR17->Caption = "O"; } else { Pdirmask |= PDIR1_7; PDIR17->Caption = "I"; PIOmask |= PDIR1_7; PSTATE17->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR20Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR2_0) { Pdirmask &= ~PDIR2_0; PDIR20->Caption = "O"; } else { Pdirmask |= PDIR2_0; PDIR20->Caption = "I"; PIOmask |= PDIR2_0; PSTATE20->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR21Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR2_1) { Pdirmask &= ~PDIR2_1; PDIR21->Caption = "O"; } else { Pdirmask |= PDIR2_1; PDIR21->Caption = "I"; PIOmask |= PDIR2_1; PSTATE21->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR22Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR2_2) { Pdirmask &= ~PDIR2_2; PDIR22->Caption = "O"; } else { Pdirmask |= PDIR2_2; PDIR22->Caption = "I"; PIOmask |= PDIR2_2; PSTATE22->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR23Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR2_3) { Pdirmask &= ~PDIR2_3; PDIR23->Caption = "O"; } else { Pdirmask |= PDIR2_3; PDIR23->Caption = "I"; PIOmask |= PDIR2_3; PSTATE23->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR24Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR2_4) { Pdirmask &= ~PDIR2_4; PDIR24->Caption = "O"; } else { Pdirmask |= PDIR2_4; PDIR24->Caption = "I"; PIOmask |= PDIR2_4; PSTATE24->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR25Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR2_5) { Pdirmask &= ~PDIR2_5; PDIR25->Caption = "O"; } else { Pdirmask |= PDIR2_5; PDIR25->Caption = "I"; PIOmask |= PDIR2_5; PSTATE25->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR26Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR2_6) { Pdirmask &= ~PDIR2_6; PDIR26->Caption = "O"; } else { Pdirmask |= PDIR2_6; PDIR26->Caption = "I"; PIOmask |= PDIR2_6; PSTATE26->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PDIR27Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(Pdirmask & PDIR2_7) { Pdirmask &= ~PDIR2_7; PDIR27->Caption = "O"; } else { Pdirmask |= PDIR2_7; PDIR27->Caption = "I"; PIOmask |= PDIR2_7; PSTATE27->Caption = "1"; WriteIOData(PIOmask); SetPortEditText(); } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE10Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR1_0 & Pdirmask) // Read Mode return; if(PIOmask & PDIR1_0) { PIOmask &= ~PDIR1_0; PSTATE10->Caption = "0"; } else { PIOmask |= PDIR1_0; PSTATE10->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE11Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR1_1 & Pdirmask) // Read Mode return; if(PIOmask & PDIR1_1) { PIOmask &= ~PDIR1_1; PSTATE11->Caption = "0"; } else { PIOmask |= PDIR1_1; PSTATE11->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE12Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR1_2 & Pdirmask) // Read Mode return; if(PIOmask & PDIR1_2) { PIOmask &= ~PDIR1_2; PSTATE12->Caption = "0"; } else { PIOmask |= PDIR1_2; PSTATE12->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE13Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR1_3 & Pdirmask) // Read Mode return; if(PIOmask & PDIR1_3) { PIOmask &= ~PDIR1_3; PSTATE13->Caption = "0"; } else { PIOmask |= PDIR1_3; PSTATE13->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE14Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR1_4 & Pdirmask) // Read Mode return; if(PIOmask & PDIR1_4) { PIOmask &= ~PDIR1_4; PSTATE14->Caption = "0"; } else { PIOmask |= PDIR1_4; PSTATE14->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE15Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR1_5 & Pdirmask) // Read Mode return; if(PIOmask & PDIR1_5) { PIOmask &= ~PDIR1_5; PSTATE15->Caption = "0"; } else { PIOmask |= PDIR1_5; PSTATE15->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE16Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR1_6 & Pdirmask) // Read Mode return; if(PIOmask & PDIR1_6) { PIOmask &= ~PDIR1_6; PSTATE16->Caption = "0"; } else { PIOmask |= PDIR1_6; PSTATE16->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE17Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR1_7 & Pdirmask) // Read Mode return; if(PIOmask & PDIR1_7) { PIOmask &= ~PDIR1_7; PSTATE17->Caption = "0"; } else { PIOmask |= PDIR1_7; PSTATE17->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE20Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR2_0 & Pdirmask) // Read Mode return; if(PIOmask & PDIR2_0) { PIOmask &= ~PDIR2_0; PSTATE20->Caption = "0"; } else { PIOmask |= PDIR2_0; PSTATE20->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE21Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR2_1 & Pdirmask) // Read Mode return; if(PIOmask & PDIR2_1) { PIOmask &= ~PDIR2_1; PSTATE21->Caption = "0"; } else { PIOmask |= PDIR2_1; PSTATE21->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE22Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR2_2 & Pdirmask) // Read Mode return; if(PIOmask & PDIR2_2) { PIOmask &= ~PDIR2_2; PSTATE22->Caption = "0"; } else { PIOmask |= PDIR2_2; PSTATE22->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE23Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR2_3 & Pdirmask) // Read Mode return; if(PIOmask & PDIR2_3) { PIOmask &= ~PDIR2_3; PSTATE23->Caption = "0"; } else { PIOmask |= PDIR2_3; PSTATE23->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE24Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR2_4 & Pdirmask) // Read Mode return; if(PIOmask & PDIR2_4) { PIOmask &= ~PDIR2_4; PSTATE24->Caption = "0"; } else { PIOmask |= PDIR2_4; PSTATE24->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE25Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR2_5 & Pdirmask) // Read Mode return; if(PIOmask & PDIR2_5) { PIOmask &= ~PDIR2_5; PSTATE25->Caption = "0"; } else { PIOmask |= PDIR2_5; PSTATE25->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE26Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR2_6 & Pdirmask) // Read Mode return; if(PIOmask & PDIR2_6) { PIOmask &= ~PDIR2_6; PSTATE26->Caption = "0"; } else { PIOmask |= PDIR2_6; PSTATE26->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::PSTATE27Click(TObject *Sender) { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; return; } if(PDIR2_7 & Pdirmask) // Read Mode return; if(PIOmask & PDIR2_7) { PIOmask &= ~PDIR2_7; PSTATE27->Caption = "0"; } else { PIOmask |= PDIR2_7; PSTATE27->Caption = "1"; } WriteIOData(PIOmask); SetPortEditText(); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::ReadClick(TObject *Sender) { BYTE dst[4]; DWORD dwRet; if(!ReadIOData(dst,&dwRet)) { return; } int i; WORD bitmark=0x01; WORD wMask=0; WORD wDirect=0x01; wMask |= dst[1]; wMask <<= 8; wMask |= dst[0]; for(i=0; i<16; i ) { if(Pdirmask & wDirect) { if(wMask & bitmark) PIOmask |= bitmark; else PIOmask &= ~bitmark; } bitmark = bitmark << 1; wDirect = wDirect << 1; } SetPortEditText(); SetPortText(PIOmask); } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::SetPortText(WORD wData) { int i; int ControlIdx=0; WORD bitmark=0x01; TButton *ChildControl; // Port1 ControlIdx=0; while(true) { ChildControl = (TButton*)GroupPort1->Controls[ControlIdx]; if(ChildControl->Name == "PSTATE10") break; ControlIdx ; } for(i=0; i<8; i ) { ChildControl = (TButton*)GroupPort1->Controls[ControlIdx]; if(PIOmask & bitmark) ChildControl->Caption = "1"; else ChildControl->Caption ="0"; bitmark = bitmark <<1; ControlIdx ; } // Port2 ControlIdx=0; while(true) { ChildControl = (TButton*)GroupPort2->Controls[ControlIdx]; if(ChildControl->Name == "PSTATE20") break; ControlIdx ; } for(i=0; i<8; i ) { ChildControl = (TButton*)GroupPort2->Controls[ControlIdx]; if(PIOmask & bitmark) ChildControl->Caption = "1"; else ChildControl->Caption ="0"; bitmark = bitmark <<1; ControlIdx ; } } //--------------------------------------------------------------------------- void __fastcall TAPIMAIN::CloseUSBPort() { if(bPortOpen == FALSE) { return; } PFNCLOSEDEVICE pfnCloseUSBPort = NULL; hDll = LoadLibrary("DevLink.dll"); if(hDll == NULL) { StatusBar1->Panels->Items[0]->Text = "狀態 : 找不到DevLink.dll或聯結錯誤" ; return; } pfnCloseUSBPort = (PFNCLOSEDEVICE)GetProcAddress(hDll,"OpenLinkDevice"); if(pfnCloseUSBPort ==NULL) { FreeLibrary(hDll); hDll = NULL; StatusBar1->Panels->Items[0]->Text = "狀態 : 讀取DevLink.dll函式OpenLinkDevice錯誤" ; return; } pfnCloseUSBPort(DEVICE0);
bPortOpen = FALSE; if(hDll != NULL) { FreeLibrary(hDll); hDll = NULL; } }
編輯記錄
mirood 重新編輯於 2008-02-16 19:38:40, 註解 無‧
mirood 重新編輯於 2008-02-16 19:39:28, 註解 無‧ mirood 重新編輯於 2008-02-16 19:40:09, 註解 無‧ mirood 重新編輯於 2008-02-16 19:40:52, 註解 無‧ mirood 重新編輯於 2008-02-16 19:43:54, 註解 無‧ mirood 重新編輯於 2008-02-16 19:45:44, 註解 無‧ mirood 重新編輯於 2008-02-16 19:47:28, 註解 無‧ mirood 重新編輯於 2008-02-16 19:48:30, 註解 無‧ |
nisson
一般會員 發表:2 回覆:12 積分:22 註冊:2008-01-31 發送簡訊給我 |
看完你給的資料後大概知道你的問題在那裡
以下提供你另外一種寫法步驟如下 1.到bcb\bin底下找到implib.exe這個程式,然後copy到c:\底下. 2.到c:\底下執行implib.exe DevLink.lib DevLink.dll之後, 你可以在c:\底下找到DevLink.lib然後copy到你的專案底下. 3.開啟你的專案然後選擇project => add to project把 DevLink.lib加進來. 4.假設你的Form是Form1然後加入底下程式碼 TForm1 *Form1; extern "C" __declspec(dllimport) BOOL OpenLinkDevice(DWORD hInst); extern "C" __declspec(dllimport) BOOL WriteIOData(DWORD dwDevice,LPBYTE pSrc,DWORD dwSize,LPDWORD dwRet); extern "C" __declspec(dllimport) BOOL CloseDevice (DWORD dwDevice); bool openusb; 5.假設你有一個按鍵叫btnOpenUSB那麼請你在Click輸入以下程式碼 openusb = OpenLinkDevice(0); if (openusb) showMessage("USB open!"); else showMessage("USB cannot open!"); 6.假設你有一個按鍵叫btnwriteUSB那麼請你在Click輸入以下程式碼 DWORD wData(1234);//這是你要輸出到USB的data BYTE pSrc[4]; DWORD dwRet; pSrc[0] = (BYTE)wData & 0x00FF; pSrc[1] = (BYTE)((wData & 0xFF00) >>8); if (openusb) { bool wrusb = WriteIOData(0,pSrc,2,&dwRet); if (wrusb) showMessage("write ok!"); else showMessage("write no!"); CloseDevice(0); } 如有問題請將DevLink.dll附上再說明. |
mirood
一般會員 發表:10 回覆:27 積分:7 註冊:2007-02-28 發送簡訊給我 |
|
nisson
一般會員 發表:2 回覆:12 積分:22 註冊:2008-01-31 發送簡訊給我 |
|
mirood
一般會員 發表:10 回覆:27 積分:7 註冊:2007-02-28 發送簡訊給我 |
是只有open write 少了 close嗎?
那我在後面加上 void __fastcall Tpp::Button3Click(TObject *Sender) //Port_1 { if(bPortOpen ==FALSE) { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; } else { if(Port_out&P0_1) Port_out-=P0_1; else Port_out|=P0_1; WriteIOData(Port_out); CheckPort(); } CloseUSBPort(); } 是否就可以關掉此port 嗎 |
nisson
一般會員 發表:2 回覆:12 積分:22 註冊:2008-01-31 發送簡訊給我 |
void __fastcall Tpp::Button3Click(TObject *Sender) //Port_1
{ if(bPortOpen ==FALSE)如果此行是你的OpenIO的話那就正確了 { StatusBar1->Panels->Items[0]->Text = "狀態 : USBPort未開啟" ; } else { if(Port_out&P0_1) Port_out-=P0_1; else Port_out|=P0_1; WriteIOData(Port_out); CheckPort(); } CloseUSBPort(); } 去測試看看吧! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |