要完成串口通信, 在32位模式下, 一般說來有以下四種方法:
1.以文件方式打開串口:
這裡使用的是Win32 API 函數, 所以無論在BCB或VC下都可以實現.具體的函數的意義可以參考Win32 API 的幫助.這裡有一個易於使用的BCB下的類, 可以方便的使用串口.
下面給出簡要說明:
(1) 應用CreateFile() 來初始化串口
FhFileComm=CreateFile(
FCommName.c_str(),
GENERIC_READ | GENERIC_WRITE,
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來實現:
這不是一下子能說得清的, 如果要做, 當然要找本書了.