急求一个非常简单的串口发指令程序,简单到只要能发TEdit内输入的字符串就行!!(50分)

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

moler

Unregistered / Unconfirmed
GUEST, unregistred user!
不须接收字符,只要发送TEDIT内输入的字符串就可以了,所以要求尽量简洁,不要采用其它控件。
 
DCB: TDCB;
FHandle: THandle;
BytesTrans: Integer;

FHandle := CreateFile(
PChar('//./' + FPort),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
0,
0);

DCB.DCBlength := SizeOf(TDCB);
GetCommState(FHandle, @DCB);

DCB.BaudRate := 2400;
...
SetCommState(FHandle, DCB);

WriteFile(FHandle, Str, Count, BytesTrans, 0);

 
Program Test;


uses CRT,DOS;

CONST
hex : array[0..$f] of char='0123456789ABCDEF';

{------------------------------------------------------------------}
Procedure CLI; InLine($fa);
Procedure STI; InLine($fb);

Procedure AuxBaudInit(Baud:word);
begin
cli;
if Baud=2400 Then Begin
Port[$3fb]:=$80;
Port[$3f8]:=$30;{//2400 l}
Port[$3f9]:=$00;{//2400 h}
Port[$3fb]:=$03;
Port[$3fa]:=$00;
end else If Baud=300 Then Begin
Port[$3fb]:=$80;
Port[$3f8]:=$80;
Port[$3f9]:=$01;
Port[$3fb]:=$03;
Port[$3fa]:=$00;
End;
sti;
end;


Var b,c : byte;
i:integer;
ch: char;
fp : text;
Begin
AuxBaudInit(2400);
Assign(fp,'TEST.DAT'); Rewrite(fp);
Repeat
if KeyPressed and (ReadKey=#$1b) then begin
close(fp);
halt;
end;
cli; c:=Port[$3fd]; sti;
If (c and $1)=$1 Then begin
cli; b:=port[$3f8]; sti;
write(hex[b shr 4]+hex[b and $f]+' ');
write(fp,hex[b shr 4]+hex[b and $f]+' ');
end;
until False;
{for i:=1 to 1000 do
begin
cli; c:=Port[$3fb]; sti;
If (c and $1)=$1 Then begin
cli; port[$3f8]:=$41; sti;
end;
delay(10);
end;
}
end.
 
我一直用的是mscomm32控件,很简单的
 
用mscomm吧,比较简单!
 
“不要采用其它控件”

楼上的用API: CreateFile 这个方法是正确的。
用汇编也可以, 显然比较麻烦。
 
在2000不能直接读写端口。
 
为什么不用控件?自己累。
用spcomm吧。
 
spcomm 太简单了。
装个控件一条语句就解决了!
 
用mscomm控件时在别的机器上运行时会有注册的问题,而且最终程序比较大,所以我不想用
 
用spcomm, 或者用Turbo Power公司的APRO套件(好东东), 这些都是纯粹的VCL组件,不涉
及控件注册问题。
用CreateFile这样的方法,即直接利用API当然最好啦, 但是你得熟悉这套东西。
 
后退
顶部