如何检测串口的某一个针脚的电压是高电平?(100分)

  • 主题发起人 主题发起人 freeze06
  • 开始时间 开始时间
F

freeze06

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大哥帮帮忙
如何检测串口的某一个针脚的电压是高电平?
spcomm好像不行吧
有什么控件或函数么?
 
RS232编程:

RS232共有9支脚位,其第4脚DTR与第7脚RTS由计算机控制作为交握之用, 因此可以控制4脚和7脚的电压状态。
另外,RS232的第5脚是接地之用,因此可用DTR或RTS与GND产生电位差。
经测试,DTR与RTS与GND间的电压为正负9伏,电压足以驱动发光二极管,电流在4-20mA之间,不会把发光二极管烧坏。

在mscomm控件中可以通过设置DTREnable和RTSEnable控制DTR和RTS的电位。当他们的值为True时,为高电平。反之,低电平。

另外mscomm中可以通过CDHolding(DCD脚位电位)、CTSHolding(CTS脚位电位)、DSRHolding(DSR脚位电位),当他们的值为True时,为高电平。反之,低电平。

另外OnComm事件中当CommEvent值
等于ComEvCD,表示DCD脚位电位发生变化
等于ComEvCTS,表示CTS脚位电位发生变化
等于ComEvDSR,表示DSR脚位电位发生变化
等于ComEvRing,表示RI脚位电位发生变化


delphi中的SPCOMM不支持DTREnable和RTSEnable
Procedure ControlRTS;
Var
S: String;
lDCB: TDCB;
fHandle: THandle;
Begin
S:='COM1';
// open port
fHandle:=CreateFile( Pchar(S), GENERIC_READ Or GENERIC_WRITE, 0,
Nil, OPEN_EXISTING, 0, 0);
If fHandle=INVALID_HANDLE_VALUE Then
Begin
// can't open....
Exit;
End;
// read settings
If Not GetCommState( fHandle, lDCB) Then
Begin
// can't read
Exit;
End;
// Fill dcb
lDCB.BaudRate:=CBR_2400;
lDCB.ByteSize:=8;
lDCB.Parity:=NOPARITY;
lDCB.StopBits:=ONESTOPBIT;

// !!! we will manage RTS ourself !!!
ldcb.Flags:=(ldcb.Flags And $FFFFC0FF) Or $00000100;
// set comm state
SetCommState( fHandle, ldcb);

// Here we can manage
// Reset RTS
EscapeCommFunction( fHandle, CLRRTS);
// Set RTS
EscapeCommFunction( fHandle, SETRTS);

// Close port
CloseHandle(fHandle);
fHandle:=0;
End;

以上是我整理的一些资料
 
谢谢你很详细啊
不知道你对spcomm熟不熟?因为我的程序使用spcomm编的
所以我就希望能尽量的往SPcomm这个上面来靠。
不知道行不行啊——
 
不用spcomm什么的那么麻烦。
你可以直接访问继承器地址来获得。
太懒了 所以没有写代码给你。需要 给我邮件吧。
不过 在Nt下面 访问继承器地址需要ring0权限。所以 NT下面要麻烦一些。
 
blackbook
不知道你的email是多少我的是Greedisland@tom.com
谢谢了
 
二楼说的很详细
 
既然说到这个份上 那索性我就再给你多说一点。
计算机正常启动后,RS232端口COM1、COM2、COM3、COM4的地址一般被安排在3F8、2F8、3E8、2E8,用于了解外部状态的寄存器地址则被分别设置为3FE、2FE、3EE、2EE,用于控制外部设备的寄器地址则被设置3FC、2FC、3EC、2EC。(每个端口具体设置的地址怎样得到这个我就不说了)
这时候我们只要读取3FE、2FE、3EE、2EE就可以得到串口的MSR寄存器。这样你要那个脚的状态都能得到.具体Msr寄存器对应的针脚你查资料就OK了。如何访问寄存器等其他的不说了。
 
to blackbook:
能否邮一份给我,遇到了这样的问题,另外问一下,并口的电平是怎样检测得到的呢?
 
并口的数据寄存器一般在378地址,状态寄存器在379。原理就和串口一样!
 
blackbook
你有没有这方面的程序可不可以发来看看啊……
谢谢了
 
串口的東西還是用匯編好.....
 
blackbook
我的程序需要运行在2000下
用汇编是不是需要调用中断啊?
可是2000吧中断给屏蔽了啊
 
前面回答过:
>>不过 在Nt下面 访问继承器地址需要ring0权限。所以 NT下面要麻烦一些。
也就是你要写一个驱动。强烈建议你用porttalk。好像是这个名字。

这样你在win98下面写访问寄存器地址的程序可以完全不用修改就能在win2000(NT)下面用。
你收索一下porttalk 很多的.
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2475740
 
后退
顶部