var hcom : Thandle;
Wrlap,Rdlap : Toverlapped;procedure TForm1.Button1Click(Sender: TObject);
VAR CC : TCommConfig;
begin
hcom := createfile('com1',GENERIC_READ OR GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);
if hcom = INVALID_HANDLE_VALUE then
SHOWMESSAGE('打开串口失败')
else
begin
GetCommState(hcom,CC.DCB);
CC.dcb.BaudRate := CBR_9600;
CC.dcb.StopBits := TWOSTOPBITS;
CC.dcb.ByteSize := 8;
CC.dcb.Parity:=NOPARITY;
SetCommState(hcom,CC.dcb);
SetupComm(hcom,2048,2048);
//设置超时
shape1.Brush.Color := clGreen;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var number,lperror : longword;
temp: String;
coms : Tcomstat;
dwNumberOfBytesWritten,ErrorFlag,dwEvtMask: Dword;
begin
FillChar(Wrlap,SizeOf(Wrlap),0);
Wrlap.hEvent := CreateEvent(nil,True,FALSE,nil);
temp := memo1.Text ;//这里我输入 的是发短信的 AT命令
WriteFile(hcom,pchar(temp)^, length(temp),dwNumberOfBytesWritten,@Wrlap);
ErrorFlag := GetLastError;
if ErrorFlag=ERROR_IO_PENDING then
begin
WaitForSingleObject(Wrlap.hEvent,1000);
end
else
begin
MessageBox(0,'WriteFile Error!','Notice',MB_OK);
Exit;
end;end;procedure TForm1.Button3Click(Sender: TObject);var temp : String;
lperror,dwNumberOfBytesRead : Longword;
coms : Tcomstat;
tmp : array [0..2047] of char;
begin
ClearCommerror(hcom,lperror,@coms);
FillChar(Rdlap,SizeOf(Rdlap),0);
Rdlap.hEvent := CreateEvent(nil,True,false,@Rdlap);
lperror:=Getlasterror;
IF NOT Readfile(hcom,tmp,coms.cbInQue,number,@Rdlap) Then
begin
if lperror = ERROR_IO_PENDING then
begin;
WaitForSingleObject(Rdlap.hEvent,1000);
Getoverlappedresult(hcom,Rdlap.hEvent,dwNumberOfBytesRead,false);
temp := copy(tmp,1,coms.cbInQue);
end;
memo2.Text := temp;
end
else
memo2.Text := temp;
purgeComm(hcom,PURGE_TXCLEAR or PURGE_RXCLEAR);
end;
Wrlap,Rdlap : Toverlapped;procedure TForm1.Button1Click(Sender: TObject);
VAR CC : TCommConfig;
begin
hcom := createfile('com1',GENERIC_READ OR GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);
if hcom = INVALID_HANDLE_VALUE then
SHOWMESSAGE('打开串口失败')
else
begin
GetCommState(hcom,CC.DCB);
CC.dcb.BaudRate := CBR_9600;
CC.dcb.StopBits := TWOSTOPBITS;
CC.dcb.ByteSize := 8;
CC.dcb.Parity:=NOPARITY;
SetCommState(hcom,CC.dcb);
SetupComm(hcom,2048,2048);
//设置超时
shape1.Brush.Color := clGreen;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var number,lperror : longword;
temp: String;
coms : Tcomstat;
dwNumberOfBytesWritten,ErrorFlag,dwEvtMask: Dword;
begin
FillChar(Wrlap,SizeOf(Wrlap),0);
Wrlap.hEvent := CreateEvent(nil,True,FALSE,nil);
temp := memo1.Text ;//这里我输入 的是发短信的 AT命令
WriteFile(hcom,pchar(temp)^, length(temp),dwNumberOfBytesWritten,@Wrlap);
ErrorFlag := GetLastError;
if ErrorFlag=ERROR_IO_PENDING then
begin
WaitForSingleObject(Wrlap.hEvent,1000);
end
else
begin
MessageBox(0,'WriteFile Error!','Notice',MB_OK);
Exit;
end;end;procedure TForm1.Button3Click(Sender: TObject);var temp : String;
lperror,dwNumberOfBytesRead : Longword;
coms : Tcomstat;
tmp : array [0..2047] of char;
begin
ClearCommerror(hcom,lperror,@coms);
FillChar(Rdlap,SizeOf(Rdlap),0);
Rdlap.hEvent := CreateEvent(nil,True,false,@Rdlap);
lperror:=Getlasterror;
IF NOT Readfile(hcom,tmp,coms.cbInQue,number,@Rdlap) Then
begin
if lperror = ERROR_IO_PENDING then
begin;
WaitForSingleObject(Rdlap.hEvent,1000);
Getoverlappedresult(hcom,Rdlap.hEvent,dwNumberOfBytesRead,false);
temp := copy(tmp,1,coms.cbInQue);
end;
memo2.Text := temp;
end
else
memo2.Text := temp;
purgeComm(hcom,PURGE_TXCLEAR or PURGE_RXCLEAR);
end;
解决方案 »
- 怎样反汇编成DELPHI代码?
- DBGrid控件中时间类型字段的输入方法是否可以直接编辑输入呢???
- 图片处理问题
- .net VS SUN ONE BORLAND 游刃有余!
- 入门:为何我把toolbar的showCaptions设为true后,就不能调整toolbutton的大小了?
- 请问到哪去找这几本电子书?
- ??我用delphi编写asp应用(web软件使用pws),dll一旦调入内存,如何关闭? 我现在只有启动计算机.有没有更好的办法?(在线等待,我用的是wind
- 什么样的delphi能进深圳??
- 大家说说目前在工厂里面用的最多的开发语言是什么?
- 为什么使用了UpdateFile,TINIFILE还是不能写入新信息回文件?
- 向各位请教怎么现实文字移动
- 报表如何实现表数据分两边显示
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs; const
Wm_commNotify=Wm_User+12;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
Procedure comminitialize;
Procedure MsgcommProcess(Var
Message:Tmessage); Message Wm_commnotify;
{ Private declarations }
public
{ Public declarations }
end; //线程声明
TComm=Class(TThread)
protected
procedure Execute;override;
end; var
Form1: TForm1;
hcom,Post_Event:Thandle;
lpol:Poverlapped;
implementation {$R *.DFM} Procedure TComm.Execute; //线程执行过程
var
dwEvtMask:Dword;
Wait:Boolean;
Begin
fillchar(lpol,sizeof(toverlapped),0);
While True do Begin
dwEvtMask:=0;
Wait:=WaitCommEvent(hcom,dwevtmask,lpol);
//等待串行口事件;
if Wait Then Begin
waitforsingleobject(post_event,infinite);
//等待同步事件置位;
resetevent(post_event); //同步事件复位;
PostMessage(Form1.Handle,
WM_COMMNOTIFY,0,0);//发送消息;
end;
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
else
setupcomm(hcom,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.Msgcomm
Process(Var Message:Tmessage);
var
Clear:Boolean;
Coms:Tcomstat;
cbNum,ReadNumber,lpErrors:Integer;
Read_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; end.
我连重叠I/O方式都没读到数据,监听的话也要用到 重叠I/O 噶