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

利用usb傳輸 控制8051晶片 用久會發生錯誤

答題得分者是:nisson
mirood
一般會員


發表:10
回覆:27
積分:7
註冊:2007-02-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-02-12 14:27:54 IP:203.160.xxx.xxx 訂閱
利用以下的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]
編輯記錄
mirood 重新編輯於 2008-02-12 14:28:29, 註解 無‧
mirood 重新編輯於 2008-02-12 14:29:08, 註解 無‧
mirood 重新編輯於 2008-02-12 14:30:15, 註解 無‧
mirood 重新編輯於 2008-02-12 14:30:41, 註解 無‧
mirood 重新編輯於 2008-02-12 14:31:25, 註解 無‧
nisson
一般會員


發表:2
回覆:12
積分:22
註冊:2008-01-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-02-16 18:30:28 IP:218.174.xxx.xxx 訂閱
你使用了人家的IODriver 中的WriteIOData,
基本上一定有一個初始函數(例如InitIOData)跟釋放函數(例如CloseIOData).
現在不管初始化,操作完IO一定要釋放Handle,你的程式碼中並沒有釋放動作,
如此windows會不斷產生Handle難怪會當掉.如果你不知道那一個函數是釋
放Handle請你把driver內的所有函數列出來讓大家幫你找.
mirood
一般會員


發表:10
回覆:27
積分:7
註冊:2007-02-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-02-16 19:21:37 IP:203.160.xxx.xxx 訂閱
我是使用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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-02-16 19:37:35 IP:203.160.xxx.xxx 訂閱
 

//---------------------------------------------------------------------------
#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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-02-16 21:59:33 IP:218.174.xxx.xxx 訂閱
看完你給的資料後大概知道你的問題在那裡
以下提供你另外一種寫法步驟如下
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-02-17 11:10:22 IP:203.160.xxx.xxx 訂閱
你好~
不過小弟還是不是很了解~
哪裡可以解決USB port~
不斷執行之後造成當機的問題~
可以在更清楚解釋給我知道嗎~
謝謝你的指導~
nisson
一般會員


發表:2
回覆:12
積分:22
註冊:2008-01-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-02-17 12:25:27 IP:218.174.xxx.xxx 訂閱
問題應該就在於IO的使用概念,
IO的使用概念在於使用前才開啟使用後請馬上
關閉
..............
{
OpenIO();
..
WriteIO();
..
CloseIO();
}
三個動作同時存再於一個程序.
mirood
一般會員


發表:10
回覆:27
積分:7
註冊:2007-02-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-02-17 15:31:13 IP:203.160.xxx.xxx 訂閱
是只有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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-02-17 17:15:12 IP:218.174.xxx.xxx 訂閱
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();

}
去測試看看吧!
編輯記錄
nisson 重新編輯於 2008-02-17 17:19:11, 註解 無‧
nisson 重新編輯於 2008-02-17 17:20:53, 註解 無‧
系統時間:2024-04-26 4:20:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!