---- 要完成串口通信, 在32位模式下, 一般說來有以下四種方法:
---- 1. 以文件方式打開串口:
---- 這裡使用的是Win32 API 函數, 所以無論在BCB或VC下都可以實現. 具體的函數的意義可以參考Win32 API 的幫助.這裡有一個易於使用的BCB下的類, 可以方便的使用串口.
---- 下面給出簡要說明:
---- (1) 應用CreateFile() 來初始化串口
FhFileComm=CreateFile(
FCommName.c_str(),
GENERIC_READ GENERIC_WR99vE,
0, // exclusive Access
&lpSecurity,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL FILE_FLAG_OVERLAPPED, // overlapped I/O
NULL );
if( FhFileComm == INVALID_HANDLE_VALUE)
return false;
(2) 應用WriteFile() 和 ReadFile() 從串口讀寫數據
bool MyComm::WriteBuffer(unsigned char *buffer,unsigned long length)
{
return WriteFile(FhFileComm,buffer,length,&length,&FgOverLapped);
}
bool MyComm::ReadBuffer(unsigned char *buffer,unsigned long length)
{
return ReadFile(FhFileComm,buffer,length,&length,&FgOverLapped);
}
相應的源文件為 UsageComm.cpp UsageComm.h
---- 2. 使用現成的控件:
---- 易於使用的是微軟的MS Communication 控件, 它是做為一個 .ocx 提供的.
---- 在BCB 中可以用Import ActiveX Control 將它加入到BCB 中, 缺省是加載在ActiveX 頁中. 就可以作為一個普通的BCB 控件來使用了.(也有不少第三方提供的其它硬件操作控件)
---- 3. 直接嵌入匯編法:
---- (該方法不能在NT下使用, 由於98的非完全保護, 下面的代碼可以使用)利用BCB的直接嵌入匯編功能, 可以在BCB中直接對串口操作.
---- 如下所示,在BCB中使用匯編代碼如下
byte __fastcall ReadByte(Word Address)
// eax :address
{
asm
{
mov DX,AX
in AL,DX
}
}
void __fastcall WriteByte (unsigned char byte, WORD Address)
// EAX: BYTE EDX: ADDRESS
{
asm
{
out DX,AL
}
}
---- 這裡必須用__fastcall 調用約定以使在調用該函數時用寄存器傳遞參數.
---- (用在BCB中的匯編指令代碼in 和out必須用小寫,(其余可以為大寫)寄存器名稱大小寫都可以)
---- 其它的如寫多個字節,讀多個字節, 同樣可以實現.
---- 4. 最困難的要數用VxD來實現:
---- 這不是一下子能說得清的, 假如要做, 當然要找本書了.