winAPI读写串口的问题。。高手求救。。。

lijinjie 2004-02-23 03:42:53
procedure TForm1.Button1Click(Sender: TObject);
var
lpDCB:TDCB;
iCOMHandle:Thandle;
sComName:string;
rCommTimeouts:COMMTIMEOUTS;
bSuccessFlag:boolean;
ipError:Dword;
lpstat:PcomStat;
abSendBuf,abRecvBuf:array[1..100] of byte;
nBytesWrite,nBytesRead:DWORD;//设置已写/读的数量
lpwol:pOVERLAPPED;//读写的最后一个参数,无需设置
sMessStr,sReadMess:String;
begin
//第一。创键文件句柄
sComName:='Com1';
iComHandle:=Createfile(pAnsiChar(sComName),
GENERIC_Read or GENERIC_Write,
0,nil,open_existing,
file_attribute_normal,0);
if iComHandle=invalid_handle_value then
begin
showmessage('com1打开错误!');
CloseHandle(iComhandle);
exit;
end;

//第二:设备com输入输出缓冲区
bSuccessFlag:=SetupComm(iComHandle,1024,1024);
if not bSuccessFlag then
begin
showmessage('设备com输入输出缓冲区错误!');
CloseHandle(iComhandle);
exit;
end;
//第三:取得默认DCB
bSuccessFlag:=GetCommstate(iComHandle,lpDcb);
if not bSuccessFlag then
begin
showmessage('取得默认DCB错误!');
CloseHandle(iComhandle);
exit;
end;
//第四,设置DCB
//4800,8,N,1
lpDCB.BaudRate:=4800;
lpDCB.ByteSize:=8;
lpDCB.Parity:=0;//N无奇偶校验
lpDCB.StopBits:=0;//0,1,2===>1,1.5,2
bSuccessFlag:=SetCommstate(iComhandle,lpDCB);
if not bSuccessFlag then
begin
showmessage('设置DCB错误!');
CloseHandle(iComhandle);
exit;
end;
//第五:通过PurgeComm清空指定通信口的输入输出缓冲区的所有字符
// PURGE_TXABORT = 1; { Kill the pending/current writes to the comm port. }
// PURGE_RXABORT = 2; { Kill the pending/current reads to the comm port. }
// PURGE_TXCLEAR = 4; { Kill the transmit queue if there. }
// PURGE_RXCLEAR = 8; { Kill the typeahead buffer if there. }
PurgeComm(iComHandle,1 or 2 or 4 or 8);
ClearCommError(iComhandle,iperror,lpstat);
//第六 设置TimeOut
rCommTimeouts.ReadIntervalTimeout:=0;
rCommTimeouts.ReadTotalTimeoutConstant:=250;
rCommTimeouts.ReadTotalTimeoutMultiplier:=0;
rCommTimeouts.WriteTotalTimeoutMultiplier:=0;
rCommTimeouts.WriteTotalTimeoutConstant:=250;
bSuccessFlag:=SetCommTimeOuts(iComHandle,rCommTimeouts);
if not bSuccessFlag then
begin
showmessage('设置TimeOut出错!');
CloseHandle(iComhandle);
exit;
end;
/////////////////////
(****进行写操作******)
/////////////////////
sMessStr:='你好啊';
abSendBuf[1]:=byte(sMessStr[1]);
abSendBuf[2]:=byte(sMessStr[2]);
abSendBuf[3]:=byte(sMessStr[3]);
abSendBuf[4]:=byte(sMessStr[4]);
abSendBuf[5]:=byte(sMessStr[5]);
abSendBuf[6]:=byte(sMessStr[6]);
abSendBuf[7]:=byte(#13);
abSendBuf[8]:=byte(#10);

bSuccessFlag:=writeFile(iComHandle,abSendBuf,8,nBytesWrite,lpWol);
if not bSuccessFlag then
begin
showmessage('写错误');
closeHandle(iComHandle);
exit;
end;
sleep(500);//0.5秒
//application.ProcessMessages;
/////////////////////
(****进行读操作******)
/////////////////////
// PurgeComm(iComHandle,1 or 2 or 4 or 8);
// ClearCommError(iComhandle,iperror,lpstat);
bSuccessFlag:=ReadFile(iComHandle,abRecvBuf,8,nBytesRead,lpWol);
if (not bSuccessFlag) then
begin
showmessage('读错误');
closeHandle(iComHandle);
exit;
end;
sleep(500);
//********************这里搞不定啊!!*****************************
sReadMess:=?/
//application.ProcessMessages;
//setlength(sMessStr,8);
//move(abRecvBuf,sMessStr,6,);
edit1.Text:=sReadMess;
//串口操作完成
CloseHandle(iComhandle);
showmessage('HOHO写入成功啦。');
end;
-------------------
比如串口发过来的是'成功了'
abRecvBuf的内容。。怎么赋给 sReadMess 啊。。
...全文
70 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧