关于网友提出的“ 挑战高手:delphi 下API 函数 串口编程 ————在线等待!!!”问题疑问,本网通过在网上对“ 挑战高手:delphi 下API 函数 串口编程 ————在线等待!!!”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 挑战高手:delphi 下API 函数 串口编程 ————在线等待!!!描述:
大家好:
我想在delphi下用API函数编写一个串口通讯程序。公共变量和常量有:
Var
openflag:boolean ;//打开标志
handle :THandle;//串口句柄
Const
comminquesize = 4096;//输入缓冲区大小
commoutquesize = 4096;//输出缓冲区大小
打开COM串口的函数我定义如下:
procedure portOpen(com:string;bps:longint;par:char;dbit,sbit:byte);
var
dcb : TDCB;
begin
OpenFlag:=false; //初始化串口
handle:=CreateFile(PChar(com),
GENERIC_READ+GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
0,
0 );
if handle = INVALID_HANDLE_VALUE then
begin
showmessage('无法打开串口:' + com);
exit;
end;
GetCommState(handle,dcb);
with dcb do
begin
BaudRate:=bps; // 波特率
if dbit in [4,5,6,7,8] then // 数据位
ByteSize:=dbit
else
ByteSize:=8;
case sbit of // 停止位
1: StopBits:=0; // 1
2: StopBits:=2; // 2
else StopBits:=0; //1
//else StopBits:=1; // 1.5
end;
case par of //校验
'n','N': Parity:=0; //no
'o','O': Parity:=1; //odd
'e','E': Parity:=2; //even
'm','M': Parity:=3; //mark
's','S': Parity:=4; //space
else Parity:=0; //no
end;
end;
SetCommState(handle,dcb);
SetupComm(handle,CommOutQueSize,CommInQueSize);
OpenFlag:=true;
end;
关闭串口函数定义如下:
procedure portClose;
begin
if OpenFlag then
CloseHandle(handle);
OpenFlag:=false;
end;
我的问题是:我要发送和接受数据!!!!!!!!!!!!!!!!???????
我要发送的数据是一个字符串如:AF144100C1FF8C63 ;我要接受的数据
是随意的。请问我在打开串口以后怎么利用API 函数:WriteFile 和
ReadFile 进行数据的写与读呢???因为这两个函数的参数我搞不很清楚
请那位前辈给晚辈描述一下好吗?????????
解决方案1:
好的,BOOL WriteFile(
HANDLE hFile, // handle to file to write to
LPCVOID lpBuffer, // pointer to data to write to file
DWORD nNumberOfBytesToWrite, // number of bytes to write
LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written
LPOVERLAPPED lpOverlapped // pointer to structure for overlapped I/O
);
BOOL ReadFile(
HANDLE hFile, // handle of file to read
LPVOID lpBuffer, // pointer to buffer that receives data
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // pointer to number of bytes read
LPOVERLAPPED lpOverlapped // pointer to structure for data
);
这两个函数你要先明白。你那里不要定义handle,因为这个handle事实上如果在窗体上,就是self.handle,是窗体句柄,可以改为m_Handle,
var
lrc , dwError, WEResult: DWord;
Buf:Array[1..n] of Byte;
OverLap: TOverlapped;
添充buf.
dwError := WriteFile(m_Handle,@Buf[1], Buf长度, lrc, @OverLap);
if dwError <> 0 then 说明发送不成功,否则成功。
读也是一样。只是你这里有个缺点,就是不能够知道什么时候有数据来。所以需要手动读一下来看看有没有数据到来。
ClearCommError(m_Handle, dwError, @cs);
{$IFOPT D+}
if (dwError and CE_IOE) <> 0 then RaiseCommError('串口IO错误', -1);
if (dwError and CE_OVERRUN) <> 0 then RaiseCommError('串口缓冲区不足', -1);
if (dwError and CE_RXPARITY) <> 0 then RaiseCommError('串口校检位出错', -1);
if (dwError and CE_TXFULL) <> 0 then RaiseCommError('串口缓冲区已满', -1);
{$ENDIF}
if cs.cbInQue = 0 then exit; //表示没有数据可读,
if cs.cbInQue > FReadBufSize then begin //表示数据太大了,溢出
PurgeComm(hCommFile, PURGE_RXCLEAR);
exit;
end;
err = ReadFile(hCommFile, inbuf[0], cs.cbInQue, nBytesRead,@OverLap);
if err <> 0 then //表示出错。调用下面
GetLastError //得到错误,
否则读成功