Delphi多线程采集中的4个端口操作函数
- 时间:2020-04-18
- 概述:多线程 采集
Delphi多线程采集文章内容的一个类,类中包括了4个端口操作的函数,1、端口读字、2、端口读字节,3.端口写字、 4.端口写字节。
unit CollectThread; interface uses Classes,SysUtils,stdctrls,Graphics; type TCollectDataThread = class(TThread) private FPreSetTime:Word; FUsedTime:integer; FCanvas:TCanvas; FCollectData:array[0..1023]of integer; protected procedure Execute; override; procedure ShowData; public constructor Create(PresetTime:Word;Canvas:TCanvas); end; implementation //关于硬件端口读写的四个函数; //1、端口读字, function inportw(Address:Word):word; var data:word; begin asm push ax push dx mov dx,Address in ax,dx mov data,ax pop dx pop ax end; Result:=data; end; //2、端口读字节, function inportb(Address:Word):Byte; var data:Byte; begin asm push ax push dx mov dx,Address in al,dx mov data,al pop dx pop ax end; Result:=data; end; //3.端口写字 procedure outportw(data:Word;Address:Word); begin asm push ax push dx mov ax,data mov dx,Address out dx,ax pop dx pop ax end; end; //4.端口写字节 procedure outportb(data:Byte;Address:Word); begin asm push ax push dx mov al,data mov dx,Address out dx,al pop dx pop ax end; end; {TCollectDataThread} constructor TCollectDataThread.Create(PreSetTime:Word;Canvas:TCanvas); var i:integer; begin for i:=0 to 1023 do FCollectData[i]:=0; // 给数据赋初值 FCanvas:=Canvas; FPreSetTime:=PreSetTime; // 预置采集次数 FUsedTime:=0; // 已经采集的次数 inherited Create(true); FreeOnTerminate := True; //当线程终止时自动释放该线程 end; procedure TCollectDataThread.Execute; var flag:Byte; address:Byte; i:integer; begin while FUsedTime < FPresetTime do begin FUsedTime:=FUsedTime+1; flag:=0; // 数据准备好标志 {由于您在调试程序时没有硬件支持,所以建议您使用下面的这段程序来 模拟硬件的工作,} //产生迟延,如果您的机器速度比较快,可以适当调整循环次数。 for i:=0 to 9000000 do flag:=i; if flag>0 then begin FCollectData[FUsedTime]:=round(50.0*sin(3.1415/50*FUsedTime)); Synchronize(ShowData); //同步调用数据显示函数 end; {实际上从硬件中采集数据最常用的是如下形式,但是这段程序正常工作需要 相应的I/O接口设支持,所以它仅共参考} {repeat begin // 数据是否准备好标志 flag:=inportb($341); flag:=flag and $c0; // 如果AD转换的数据准备好 if (flag=0) then begin FCollectData[FUsedTime]:=inportw($342); end; // 恢复数据准备好标志 flag:=flag and $10; end; // end while not flag=0 until(flag=0); // you can add the function Synchronize(Method:TThreadMethod) here to show the data in the form. } end; //while FUsedtime<FPresetTime DoTerminate; //时间到后线程终止 end; // 在画布上显示数据。 procedure TCollectDataThread.ShowData; begin FCanvas.Pixels[2*FUsedTime,80+FCollectData[FUsedTime]]:=clRed; end; end.
相关内容:
- 一个delphi多线程采集数据的实例代码2020-03-30阅读6次
相关声明:
- 若“Delphi多线程采集中的4个端口操作函数”有损您的权益,请告之我们删除内容。
部分文章来源于网络,版权归原作者所有。