unit U_JcyData; interface uses SysUtils,Windows,forms,Spcomm, shlobj,ExtCtrls,MSCommLib_TLB; type TEventHandlers = class(TForm) { 建一个虚拟类} procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word); procedure Timer1Timer(Sender: TObject); end; var EvHandler:TEventHandlers; Comm1:TComm; MSComm1: TMSComm; time2:TTimer; sReceiveData:string; mhandle:hwnd; function SendString(str: string):integer; function CommOpen(fhandle:hwnd;sCommName:PAnsiChar; IntTime:integer):integer;export;stdcall; function CommClose(sCommName:PAnsiChar):integer;export;stdcall; CONST sendml='55AA02000001'; IsRecHex=1; implementation uses U_HexFunction; function CommClose(sCommName:PAnsiChar):integer;export;stdcall; begin if Comm1<>nil then begin Comm1.StopComm; Comm1.Free; time2.Free; end; end; procedure TEventHandlers.Timer1Timer(Sender: TObject); var str1,str2:string; begin try SendString(sendml); except end; end; procedure TEventHandlers.Comm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word); var str :string; str1,str2:string; i1,i2:integer; begin try SetLength(Str,BufferLength); move(buffer^,pchar(@Str[1])^,bufferlength); IF IsRecHex=1 THEN sReceiveData:=StrToHexStr(Str) else sReceiveData:=Str; if (length(sReceiveData)=24) and (trim(Copy(sReceiveData,1,4))='55AA') then begin str1:=trim(Copy(sReceiveData,9,2)); str2:=trim(Copy(sReceiveData,11,6)); if IsRecHex=1 THEN begin i1:= hextoint16(str1); i2:= hextoint16(str2); end else begin i1:= trunc(hextoint10(str1)); i2:= trunc(hextoint10(str2)); end; postmessage(mhandle,1201,I1,I2); // PurgeComm(Comm1.Handle, PURGE_RXCLEAR );//清除发送缓冲区 // PurgeComm(Comm1.Handle,PURGE_TXCLEAR );//清除发送缓冲区 end else begin end; except end; end; function SendString(str: string):integer; var str1:string; begin result:=0; try IF IsRecHex=1 then str1:= HexStrToStr(str) else str1:= str; Comm1.WriteCommData(Pchar(str1),Length(str1)); result:=1; except end; end; function CommOpen(fhandle:hwnd;sCommName:PAnsiChar; IntTime:integer):integer;export;stdcall; begin result:=0; try mhandle:= fhandle; Comm1:=TComm.Create(Application); Time2:=TTimer.Create(Application); // MSComm1:=TMSComm.Create(self); Comm1.CommName:=trim(sCommName); Comm1.BaudRate:= 19200; Comm1.Parity:=TParity(0); Comm1.ByteSize:= TByteSize(3); Comm1.StopBits:= TStopBits(0); Comm1.Outx_XonXoffFlow:=false; Comm1.Inx_XonXoffFlow:=false; Comm1.OnReceiveData:=EvHandler.Comm1ReceiveData; Comm1.StartComm; time2.Enabled:=false; time2.Interval:=IntTime; time2.OnTimer:= EvHandler.Timer1Timer; time2.Enabled:=true; result:=1; except Comm1.free; Time2.Free; end; end; end.