要求能实现对PC机的串行口进行直接操作,请问应该怎么实现?最好有原代码。
我这里刚好有我以前用过的一段代码,希望对你有帮助
//这里是串口通信的完整代码
unit Comm
interface
uses
windows,messages,sysutils,classes,graphics,controls,forms,dialogs,stdctrls;
const
WM_COMMNOTIFY=WIN_USER+1;
type
TForm1=class(TForm)
procedure FormCreate(Sender:TObject);
private
procedure CommInitialize;
procedure MsgCommProcess(var Message:TMessage):message WM_COMMNOTIFY;
public
end;
//线程声明
TComm=class(TThread)
protected
procedure Execute;override;
end;
var
Form1:TForm1;
hCom,Post_Event:THandle;
lpol:Poverlappped;
implementation
{$R *.DFM}
procedure TComm.Execute;//线程执行
var
dwEvtMask:DWord;
Wait:boolean;
begin
FillChar(lpol,SizeOf(Toverlappped),0);
While true do
begin
//等待串口事件
Wait:=WaitCommEvent(hCom,dwEvtMask,lpol);
if Wait then
//等待同步事件置位
WaitForSingleObject(Post_Event,infinite);
//同步事件复位
ResetEvent(Post_Event);
//发送消息
PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);
end;
end;
//初试化串行口
procedure TForm1.CommInitialize;
var
lpDCB:TDCB;
begin
hCom:=CreateFile(com2,Generic_Read or Generic_Write,0,nil,Open_Existing,File_Attribute_Normal or
File_Flag_OverLapped,0)
if hCom=invalid_handle_value then
begin
ShowMessage(Unable to Open COM2.);
Exit;
end;
SetupComm(hComm,4096,4096);//设置输入、输出缓冲区的大小为4096字节
GetCommState(hCom,lpDCB);
lpDCB.baudrate:=2400;
lpDCB.StopBits:=1;
lpDCB.ByteSize:=8;
lpDCB.Parity:=EvenParity;//偶校验
SetCommState(hCom,lpDCB);
SetCommMask(hCom,ev_rxchar); //指定串口事件为接受到字符
end;
procedure TForm1.MsgCommProcess(var Message:TMessage);
var
Clear:boolean;
Coms:TComStat;
cbNum,ReadNumber,lpErrors:DWord;
Readd_Buffer:array [1..100] of char;
begin
Clear:=ClearCommError(hCom,lpErrors,@Coms);
if Clear then
begin
cbNum:=Coms.cbInQue;
ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol);
SetEvent(post_Event);
end;
end;
procedure TForm1.FormCreate(Sender:TObject);
begin
CommInitialize;
Post_Event:=CreateEvent(nil,true,true,nil);//创建同步事件
TComm.Create(false);//创建串口监视线程
end;