Delphi写串口通信的问题。 Delphi怎么与串口(COM口)通信的呀。请大家给个例子或都告诉我用什么API函数呀。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 去看一下spcomm,mscomm,这些控件都可以。spcomm可以在网上下载,mscomm安装vb后就有了。 用VB的MSCOM控件...................... 如果用VB的MSCOM控件,要不要VB的运行环境呀。我想知道用API函数操纵串口的方法。 看看《delphi 串口通讯》一书就什么都知道了 你要用API,网上有文章嘛,多的是, 1. 利用CreateFile函数打开串行口,以确定本应用程序对此串行口的占有权,并封锁其它应用程序对此串口的操作; 2. 通过GetCommState函数填充设备控制块DCB,再通过调用SetCommState函数配置串行口的波特率、数据位、校验位和停止位; 3. 创建串行口监视线程监视串行口事件,在此基础上就可以在相应的串口上操作数据的传输; 4. 用CloseHandle函数关闭串行口(具体的程序如下)。本程序用Delphi3.0编写,在Windows 95环境下调试通过,已投入实际应用中,供广大读者参考。 程序: 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.MsgcommProcess(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. 谢谢大家。本人以前是用VB和C#开发的。最近要为别人提供个对操作的DLL,用VB写的Delphi调到总是有问题。所以自己试着用Delphi来写一个(因为别人用Delphi开发)。 udp连接硬件设备 请大侠们帮忙,谁有好使的fastreport包,发给我一份,邮址见正文,谢谢! 如何让子另一个窗体显示在主窗体的一个固定区域,并且子窗体最大化后还在这个区域?谢谢! FindWindowEx函数 如何使去掉声音中的低音部分 哪里有 TdxBarControl 是在哪个控件包里里面 关于控件加密的问题 对线程查询感兴趣的高手进来看看这个程序 Delphi6编译好的程序不能在Delphi5.0中打开? 如何解决RXrichedit 的selstart,sellength 不能正常工作的问题? 急!!! 怎样直接用程序创建数据库
我想知道用API函数操纵串口的方法。
其它应用程序对此串口的操作;
2. 通过GetCommState函数填充设备控制块DCB,再通过调用SetCommState函数配置串
行口的波特率、数据位、校验位和停止位;
3. 创建串行口监视线程监视串行口事件,在此基础上就可以在相应的串口上操作数
据的传输;
4. 用CloseHandle函数关闭串行口(具体的程序如下)。本程序用Delphi3.0编写,在
Windows 95环境下调试通过,已投入实际应用中,供广大读者参考。
程序:
unit comdemou;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialo
gs;
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_exist
ing,
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.MsgcommProcess(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.
本人以前是用VB和C#开发的。
最近要为别人提供个对操作的DLL,
用VB写的Delphi调到总是有问题。
所以自己试着用Delphi来写一个(因为别人用Delphi开发)。