怎么编程取得串口的I/O地址呢?(100分)

  • 主题发起人 IamWLJ888
  • 开始时间
I

IamWLJ888

Unregistered / Unconfirmed
GUEST, unregistred user!
在“我的电脑”中我可以得到串口的I/O地址,但我是要取得串口I/O地址的编程方法。请大家
帮忙。
 
什么系统?
 
你想干嘛???

串口地址就那么几个,一试就出来了
 
是指串口号吧?
TIntegerDynamicArray=array of Integer;
function GetCommPorts:TIntegerDynamicArray;

function GetCommPorts:TIntegerDynamicArray;
var
i: Integer;
ComName: array[0..9] of Char;
TheComHandle: Cardinal;
j:Integer;

const CommPorts=50;
begin
for i := 1 to CommPorts do
begin
StrFmt(ComName, '///COM%d', );
TheComHandle := CreateFile
(
ComName, // name
GENERIC_READ or GENERIC_WRITE, // access attributes
0, // no sharing
nil, // no security
OPEN_EXISTING, // creation action
FILE_ATTRIBUTE_NORMAL or
FILE_FLAG_OVERLAPPED, // attributes
0 // no template
);
if TheComHandle=INVALID_HANDLE_VALUE then
begin
j:=GetLastError;
if (j=ERROR_ACCESS_DENIED) or (j=ERROR_SUCCESS) then
begin
SetLength(Result,Length(Result)+1);
Result[Length(Result)-1]:=i;
end;
end
else
begin
SetLength(Result,Length(Result)+1);
Result[Length(Result)-1]:=i;
end;
CloseHandle(TheComHandle);
end;
end;
 
各位Sorry,可能我提得不对,我要的是通讯端口的I/O地址,比如说:COM1,COM2,COM3等等
的I/O地址。
例如:COM1的I/O地址可能是$3f8, COM2的I/O地址可能是$2f8等,但如何用编程得到呢?
huawdg兄的我试过了,不是这样的。
wwolf兄: 怎么试呢,能否给一个示例?

请大家帮帮忙。
 
procedure TForm1.Button1Click(Sender: TObject);
var
ComAddr : array[1..4] of Word;
P : Pointer;
L : Cardinal;
I : Integer;
begin
P := Pointer($400);
ReadProcessMemory(GetCurrentProcess, P, @ComAddr[1], SizeOf(ComAddr), L);
for I := 1 to 4 do
begin
ShowMessage(Format('%04X', [ComAddr]));
end;
end;
 
这是什么啊!!!! 解释一下。
 
tseug: 不行啊,只能取到COM1,COM2的地址,找不到其他的,我的机上插了Multiport Card共有
8个端口,分别是COM5至COM12。用您的方法取不到地址啊。

大家请帮帮忙吧。
 
我的办法是利用了BIOS数据区存储的COM地址, 但是如果插入多串口卡, 这些串口
的地址是不能用这种办法获取的. 目前我还不清楚如何取得他们的地址, 正在研究....
 
哈哈,,,你没有正确理解多串口卡的意思。

装了多串口卡,要按照该公司的驱动程序,然后看说明书,你就该知道怎么使用了。

 
你为什么要知道这些地址呢?
安装好驱动程序后,这些串口就象普通串口一样操作就可以了。
 
to lp414: 您说得对,驱动程序、说明书都有,也有它们的API,不过是通过调用DLL文件的,
而且也不能找到PORT的地址。我要的是自己程序寻找,我想直接对PORT直接控制,需要找到
PORT地址。


请大家帮帮忙,分数不够好说。
 
按照完驱动,然后按照它们的API,调用DLL来实现你需要的对多串口卡的控制。

我觉得你没有理解对。

你上面说的地址是系统默认的地址,但目前你使用的是多串口卡,对于计算机而言,有的只是
卡的地址,哪儿来的端口地址。

硬件制作是这样的,将多串口卡的地址和多串口卡上端口地址通过驱动来联系起来。提供公开
的API和DLL就是为了方便编程人士使用。

多串口卡上串口的地址是通过DLL对串口卡地址的映射来得到串口地址。

 
to lp414: 我刚接触串口通讯,不太了解。请多指教。
我想我再说清楚点吧,我要的是 “我的电脑”->“属性”->“设备管理”->“端口”->
通讯端口下的->”属性“->”资源“->输入输出范围的设置值。
如:COM1 为 3F8, COM2 为 2F8, 我在不同的计算机上安装多串口卡,看到的其他串口
输入输出范围的设置值大都不一样。比如我目前的这台机上的COM5 是 E000-E007,到底怎样才
能编程取得到这些值呢?
我的汇编编程是这样的:
asm
mov dx, CCom_Base + 5 //CCom_Base是地址,怎么编程取得呢??????
in al, dx
test al, 01h
jz @1 //如果为'0',则无数据,退出这次查询 否则接收数据
mov dx, CCom_Base //CCom_Base是地址,怎么编程取得呢??????
in al, dx
mov DataN, al //接收的数据存放在'DataN'变量当中
@1:
nop
end;

CCom_Base是我想要编程取得,代入程序中上面中的。
 
在注册表里有的吧!
 
TO 爱元元的哥哥: 注册表中找不到啊。
 
要串口的I/O地址干什么,直接用COM1、COM2、COM3等不就可以了吗?
并口地址倒是需要知道,一般看手册即可
 
多串口卡的
for i := 1 to 255 do
begin
StrFmt(ComName, '//./COM%d', );//PChar('//./' + FPort),
TheComHandle := CreateFile
(
ComName, // name
GENERIC_READ or GENERIC_WRITE,
 
顶部