楼主,请看这个简单的Delphi串行通信程序,仅供参考: ========================================================================= 下面是打开通信端口的过程: procedure TMainForm.O1Click(Sender: TObject);var cc:TCOMMCONFIG; Temp:string; begin //Open ComPort selected //Initialize the environment for data transmission Temp:='COM'+inttostr(RG1.ItemIndex+1); //select the port to use hComm:=CreateFile(PChar(Temp),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING, 0,0); //open the ComPort selected if(hComm = INVALID_HANDLE_VALUE) //if something's wrong with the opening then begin MessageBox(0,'打开通信端口错误!','请注意:',MB_OK); exit; end;{if} GetCommState(hComm,cc.dcb); cc.dcb.BaudRate:=CBR_9600; cc.dcb.ByteSize:=8; cc.dcb.Parity:=NOPARITY; cc.dcb.StopBits:=ONESTOPBIT; if not SetCommState(hComm,cc.dcb) then begin MessageBox(0,'通信端口设置错误!','请注意:',MB_OK); CloseHandle(hComm); exit; end;{if} end; ========================================================================= 下面是发送数据的过程: procedure TForm1.btnSendClick(Sender: TObject); var Temp:string; lrc:LongWord; begin if (hComm=0) then exit; //检查Handle值 Temp:=msend.Text ;//取得传送的字符串 //实际的传送动作 WriteFile(hComm,PChar(Temp)^,Length(Temp), lrc, nil); // 送出数据 end; =========================================================================== 下面是接收数据的过程: procedure TForm1.btnReceiveClick(Sender: TObject); var Temp : string; inbuff: array[0..2047] of Char; nBytesRead, dwEvent, dwError:LongWORD ; cs:TCOMSTAT; begin ClearCommError(hComm,dwError,@CS); //取得状态 // 数据是否大于我们所准备的Buffer if cs.cbInQue > sizeof(inbuff) then begin PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 数据 exit; end; ReadFile(hComm, inbuff,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据 //转移数据到变量中 Temp:=Copy(inbuff,1,cs.cbInQue); mReceive.Text :=Temp; // 将数据显示于Memo1 上 end;
非常详细
=========================================================================
下面是打开通信端口的过程:
procedure TMainForm.O1Click(Sender: TObject);var
cc:TCOMMCONFIG;
Temp:string;
begin
//Open ComPort selected
//Initialize the environment for data transmission
Temp:='COM'+inttostr(RG1.ItemIndex+1); //select the port to use
hComm:=CreateFile(PChar(Temp),GENERIC_READ or
GENERIC_WRITE,0,nil,OPEN_EXISTING,
0,0); //open the ComPort selected
if(hComm = INVALID_HANDLE_VALUE) //if something's wrong with the opening
then begin
MessageBox(0,'打开通信端口错误!','请注意:',MB_OK);
exit;
end;{if} GetCommState(hComm,cc.dcb);
cc.dcb.BaudRate:=CBR_9600;
cc.dcb.ByteSize:=8;
cc.dcb.Parity:=NOPARITY;
cc.dcb.StopBits:=ONESTOPBIT; if not SetCommState(hComm,cc.dcb)
then begin
MessageBox(0,'通信端口设置错误!','请注意:',MB_OK);
CloseHandle(hComm);
exit;
end;{if}
end;
=========================================================================
下面是发送数据的过程:
procedure TForm1.btnSendClick(Sender: TObject);
var
Temp:string;
lrc:LongWord;
begin
if (hComm=0) then exit; //检查Handle值
Temp:=msend.Text ;//取得传送的字符串
//实际的传送动作
WriteFile(hComm,PChar(Temp)^,Length(Temp), lrc, nil); // 送出数据
end;
===========================================================================
下面是接收数据的过程:
procedure TForm1.btnReceiveClick(Sender: TObject);
var
Temp : string;
inbuff: array[0..2047] of Char;
nBytesRead, dwEvent, dwError:LongWORD ;
cs:TCOMSTAT;
begin
ClearCommError(hComm,dwError,@CS); //取得状态
// 数据是否大于我们所准备的Buffer
if cs.cbInQue > sizeof(inbuff) then begin
PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 数据
exit;
end;
ReadFile(hComm, inbuff,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据
//转移数据到变量中
Temp:=Copy(inbuff,1,cs.cbInQue);
mReceive.Text :=Temp; // 将数据显示于Memo1 上
end;