一个串口通迅的例子:
unit comdemou;
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.
unit comdemou;
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.
解决方案 »
- 【散分】最后一天上班了。明天就放假了
- 求助各位大大了~~
- 请问fastreport3怎么装啊 我怎么搞了半天上不了 老是提示 [Fatal Error] fs7.dpk(31): Required package 'TEE' not found
- 伤心…
- QuickReport下为什么在ColumnHeaderBand中设置的QRLabel的标题显示不出来?
- 急急急!求救啊!
- 李维的例子,显示blob内容 运行出错
- Delphi 7.0中那里有fastnet控件面板?
- 看看,怎样把psd和png格式转换成bmp格式?来者有分!
- 请问怎样打包第三方控件!
- 如何设置画布的背景模式和背景颜色?
- 关于EHLIB的dbgrideh中footer的问题?急,在线等待!!!
有该类控件吗,或文档吗
非常方便,另外(人民邮电出版社)的Delphi串行口通信编程一书还可以看看。
TMScomm支持485,422的。
兄弟,好好干
比较麻烦。。
要测试它的波特率什么的
哎。。搞死我 。
{ History }
{
1999/8/12: First Copy;
}unit MyCom;interface
uses windows, SysUtils, Forms, CommInt;procedure MyCpCreate;
procedure IniMyCp(ComID: integer);
function ReadComB: byte;
procedure ReadCom(var Block; Len: Word);
function WriteCom(var Block; Len: Word): Integer;
procedure FlushComInBuffer;
procedure FlushComOutBuffer;
var
MyCP: TComm;
implementation
uses inifiles, module;
{************************************************************}
{通信公用函数}
{************************************************************}procedure MyCpCreate;
begin
MyCP := TComm.Create(Application); MyCP.DeviceName := 'Com' + InttoStr(wskini.ReadINteger('COM', 'PORT', 1));
MyCP.BaudRate := br2400;
MyCP.StopBits := sb10;
MyCP.Parity := paNone;
MyCP.DataBits := da8;
end;procedure IniMyCp(ComID: integer);
begin
with MyCp do
begin
Close;
DeviceName := 'Com' + InttoStr(wskini.ReadINteger('COM', 'PORT', 1));
BaudRate := br2400;
StopBits := sb10;
Parity := paNone;
DataBits := da8;
Open;
end;
end;function ReadComB: byte;
var cd: byte;
begin
MyCP.Read(cd, 1);
result := cd;
Sleep(5);
end;procedure ReadCom(var Block; Len: Word);
begin
MyCP.Read(Block, Len);end;function WriteCom(var Block; Len: Word): Integer;
var i: byte;
begin
for i := 0 to 2 do
begin
Result := MyCP.Write(Block, Len);
if Result <> -1 then //异步写端口成功
begin
AddWatchCommu(TimetoStr(time));
AddWatchCommu('Send: ' + ByteBlocktoHexStr(Block, Len));
break;
end;
//delay(10);
end;
end;procedure FlushComInBuffer;
begin
MyCP.PurgeIn;
end;procedure FlushComOutBuffer;
begin
MyCP.PurgeOut;
end;
end.