请教一个读写I/0端口(50分)

  • 主题发起人 主题发起人 mhysky
  • 开始时间 开始时间
M

mhysky

Unregistered / Unconfirmed
GUEST, unregistred user!
在delphi中如何读写一个I/0端口的值,假设端口的地址为0x2A8
 
Delphi下的具体实现方法
Delphi的强大功能和支持多线程的面向对象编程技术,使得实现串行通信非常简单方便。它通过调用外部的API函数来实现,主要步骤如下:首先,利用CreateFile函数打开串行口,以确定本应用程序对此串行口的占有权,并封锁其它应用程序对此串口的操作;其次,通过GetCommState函数填充设备控制块DCB,再通过调用SetCommState函数配置串行口的波特率、数据位、校验位和停止位。然后,创建串行口监视线程监视串行口事件。在此基础上就可以在相应的串口上操作数据的传输;最后,用CloseHandle函数关闭串行口。具体的程序如下,本程序用Delphi3.0编制在Win95环境下调试通过,已投入实际应用中,供广大读者参考。

程序:
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;{数据类型应改为DWORD}
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.

以上是文摘,仅供参考!
 
我提的问题的意思是怎样读某一端口,不是怎样用串口进行通信
 
难道不对吗,通信的时候就应该有读。
 
内嵌汇编就行了,不过在 WIN2K 是肯定不行的,系统不让你和硬件打交道的
 
后退
顶部