Win32下的几种串口通信编程
要完成串口通信, 在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来实现:
这不是一下子能说得清的, 假如要做, 虽然要找本书了.