接收代码如下 var p:pchar; //RevP : array [1..4096] of byte; i : integer; s : byte; CommRevStr : String; begin p:=buffer; //Move(IArr(buffer)^,Revp,bufferLength); CommrevStr:='; For i:=1 to BufferLength do begin s:=ord(p^); CommrevStr:=CommrevStr+inttostr(s)+' '; inc(p); end; Memo2.Lines.Add(CommrevStr); StatusBar1.Panels[2].Text := '串口2正在接收数据';
function OpenCommPort(CommPort: PChar): COMHWND;stdcall; function CloseCommPort(hCom: COMHWND): BOOL;stdcall; function ReadCommPort(hCom: COMHWND;var Buffer: array of Char;BufSize: Integer): Integer;stdcall; function WriteCommPort(hCom: COMHWND;Buffer: array of Char;WriteSize: Integer): Integer;stdcall;
function GetCheckSum(DestStr: PChar;Count: Integer): Integer;stdcall; function GetCheckSumEx(DestStr: PChar;Start,Count: Integer): Integer;stdcall;
function SendData(hCom: COMHWND;Buffer: array of Char;Size: Integer): Integer;stdcall; var ErrorCode: Integer; implementation //////////////////////////////////////////////////////////////////////////////// // // 以下部分函数实现串口操作 // //////////////////////////////////////////////////////////////////////////////// function OpenCommPort(CommPort: PChar): COMHWND; var ComStruct: TDCB; CommTimeOut : TCOMMTIMEOUTS; begin ErrorCode := 0; Result := CreateFile(CommPort, GENERIC_READ OR GENERIC_WRITE, //设置串口为可读写 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, // OR FILE_FLAG_OVERLAPPED, 0); if Result = INVALID_HANDLE_VALUE then begin ErrorCode := Result; Result := 0; Exit; end;
SetCommTimeouts(Result,CommTimeOut); SetupComm(Result,_BufIn,_BufOut); GetCommState(Result,ComStruct); with ComStruct do begin BaudRate := _BaudRate; ByteSize := 8; StopBits := ONESTOPBIT; //一个停止位 实际值为 0 Parity := NOPARITY; end; SetCommState(Result,ComStruct); SetCommMask(Result,EV_RXCHAR); end; {------------------------------------------------------------------------------} function CloseCommPort(hCom: COMHWND): BOOL; begin Result := CloseHandle(hCom); end; {------------------------------------------------------------------------------} function ReadCommPort(hCom: COMHWND;var Buffer: array of Char;BufSize: Integer): Integer; var bClear: Boolean; dwInNumb,dwReadNumb,dwErr: DWORD; rState: TComStat; ii: Integer; ReadBuf: array[0.._MAXBUFFERSIZE] of Char; begin Result := 0; bClear := ClearCommError(hCom,dwErr,@rState); if bClear AND (rState.cbInQue > 0) then begin if BufSize > _MAXBUFFERSIZE then BufSize := _MAXBUFFERSIZE; repeat Sleep(50); //检测到有数据 等一会 再次收取 dwInNumb := rState.cbInQue; ClearCommError(hCom,dwErr,@rState); until dwInNumb = rState.cbInQue;
if rState.cbInQue > BufSize then begin PurgeComm(hCom,PURGE_RXCLEAR); //清除COM 数据 Result := -1; Exit; end;
dwInNumb := rState.cbInQue; ReadFile(hCom,ReadBuf,dwInNumb,dwReadNumb,nil); StrMove(Buffer,ReadBuf,dwReadNumb); Result := dwReadNumb; end; end; {------------------------------------------------------------------------------} function WriteCommPort(hCom: COMHWND;Buffer: array of Char;WriteSize: Integer): Integer; var dwWrite: DWORD; begin Result := 0; if WriteSize <= 0 then Exit; try WriteFile(hCom,Buffer,WriteSize,dwWrite,nil); except Result := -1; end; end; {------------------------------------------------------------------------------}
procedure TFormCommTest.Comm2ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word); type IArr = ^integer; var p:pchar; //RevP : array [1..4096] of byte; i : integer; s : byte; CommRevStr : String;
begin p:=buffer; CommrevStr:='; For i:=1 to BufferLength do begin s:=ord(p^)-128; CommrevStr:=CommrevStr+inttostr(s) ; inc(p); end; Memo2.Lines.Add(CommrevStr);
if x1=0 then begin str1:=memo2.lines[x1]; x1:=x1+1; BTNStartSend.click; end; if x1=1 then begin str2:=memo2.lines[x1]; if str1=str2 then r:=1; x1:=0; BTNStartSend.click; end;
if BaudRate = 1200 then CmbBaudRate.ItemIndex :=0 else if BaudRate = 2400 then CmbBaudRate.ItemIndex :=1 else if BaudRate = 4800 then CmbBaudRate.ItemIndex :=2 else if BaudRate = 9600 then CmbBaudRate.ItemIndex :=3 else if BaudRate = 19200 then CmbBaudRate.ItemIndex :=4 else if BaudRate = 38400 then CmbBaudRate.ItemIndex :=5 else if BaudRate = 57600 then CmbBaudRate.ItemIndex :=6 else CmbBaudRate.ItemIndex :=7; ==> si:=CmbBaudRate.Items.IndexOf(IntToStr(BaudRate)); if si=-1 then si:=7; CmbBaudRate.ItemIndex:=si;