Strøm ud gennem port

Tags:    delphi

Jeg så tilfældigvis en tråd under c/C++ om hvordan man fik strøm fra en comport.
Altså så en pin fik - pg en anden fik +.

Så jeg tænkte på om det samme kunne lade sig gøre med Delphi?

Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------



44 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
program rad;
{$APPTYPE CONSOLE}

uses
communit,windows;
var
h:longint;
s:string;
begin

// Insert user code here
//
// Open Serial Port COM1 Speed = 9600, ONESTOPBIT , NOPARITY
//
// ONESTOPBIT = 0,ONE5STOPBITS = 1,TWOSTOPBITS = 2;
// ODDPARITY = 1,EVENPARITY = 2,MARKPARITY = 3,
// SPACEPARITY = 4,

if commopen(h,1,9600,8,ONESTOPBIT ,NOPARITY ) then begin

// set DTR RTS lines
commchangestate(h,TRUE,FALSE);

// constant |
commwrite(h,#$FE#$FE#$EE#$EF#$E8#$20#$55#$00#$00#$00#$30#$35#$FD);
// s:= commread(h);
// writeln(s);
// switch to 5 channel
// commwrite(h,);
writeln('5 channel');
readln;

// constant
commwrite(h,#$FE#$FE#$EE#$EF#$E8#$20#$55#$00#$00);
s:= commread(h);
writeln(s);
// switch to 8 channel
commwrite(h,#$00#$30#$31#$FD);
writeln('1 channel');
readln;

// close serialport
closehandle(h);
end;

end.



.-.-.-.-.-

unit communit;

interface

uses windows,sysutils;
{$H+}

function commopen(var handle:longint;const comnum,speed,databits,stopbits,parity:integer):boolean;
function commchangestate(const handle:longint;const dtr,rts:boolean):boolean;
function commwrite(const handle:longint;const s:string):boolean;
function commread(const handle:longint):string;
procedure commclose(const handle:longint);

implementation
const
dcb_DTRBit1 = $0010;dcb_RTSBit1 = $1000;

function commopen(var handle:longint;const comnum,speed,databits,stopbits,parity:integer):boolean;
var h:integer;
CommTimeouts: TCommTimeouts;
var
fdcb:tdcb;
begin
Result := true;
H := CreateFile(pchar('\\\\.\\COM'+inttostr(comnum)), GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_WRITE_THROUGH, 0);
if dword(h) = INVALID_HANDLE_VALUE then begin
Result := false;
exit;
end
else
Handle := h;

SetupComm(H, 50, 50);
FillChar(CommTimeOuts, SizeOf(TCommTimeouts), 0);
CommTimeouts.ReadIntervalTimeout := 1;
CommTimeouts.ReadTotalTimeoutMultiplier := 1;
CommTimeouts.WriteTotalTimeoutConstant :=1;
CommTimeouts.WriteTotalTimeoutMultiplier := 1;
SetCommTimeOuts(H, CommTimeOuts);
GetCommState(h, FDCB);
FDCB.Flags := dcb_DTRBit1+dcb_RTSBit1;//Zal changes
fdcb.Parity := parity;//0 = no 1 =odd 2 = even 3 = mark 4 = space
fdcb.StopBits := byte(stopbits);// 0 = 1 1 = 1.5 2 = 2
fdcb.BaudRate := speed;//CBR_115200;
fdcb.ByteSize := databits;
SetCommState(H, FDCB);
SetCommMask(h,0);
end;

function commchangestate(const handle:longint;const dtr,rts:boolean):boolean;
var fdcb:tdcb;
begin
GetCommState(handle, FDCB);
// FDCB.Flags := dcb_DTRBit1+dcb_RTSBit1;// ???? ýòî íàâåðíîå íåíàäî.
if dtr then
fdcb.flags := fdcb.flags or dcb_DTRBit1
else
fdcb.flags :=fdcb.flags and not dcb_DTRBit1;
if rts then
fdcb.flags := fdcb.flags or dcb_RTSBit1
else
fdcb.flags := fdcb.flags and not dcb_RTSBit1;
result := SetCommState(Handle, FDCB);
end;

(*
function commchangestate(const handle:longint;dtr,rts:boolean):boolean;
var fdcb:tdcb;
begin
GetCommState(handle, FDCB);
FDCB.Flags := dcb_DTRBit1+dcb_RTSBit1;//Zal changes
if dtr then fdcb.flags := DTR_CONTROL_ENABLE shl 4 else fdcb.flags := 0;
if rts then fdcb.flags := fdcb.flags or RTS_CONTROL_ENABLE shl 12
else
fdcb.flags := fdcb.flags and not (RTS_CONTROL_ENABLE shl 12);
result := SetCommState(Handle, FDCB);
end;
*)

function commwrite(const handle:longint;const s:string):boolean;
var i:cardinal;
begin
WriteFile(handle,s[1],length(s),i,nil);
result := i = cardinal(length(s));
end;

function commread(const handle:longint):string;
var i:cardinal;s:string;
begin
try
s := ' ';
readfile(handle,s[1],100,i,nil);
setlength(s,i);
Result := s;
except end
end;

procedure commclose(const handle:longint);
begin
closehandle( handle );
end;

end.



Ikke fordi jeg ved noget om Delphi, men jeg er ret sikker på at du kan lave det samme, på ca. samme måde i Delphi.
Se f.ex:
http://www.cpcug.org/user/clemenzi/technical/Languages/Delphi/Delphi_SerialIO.htm



Ikke fordi jeg ved noget om Delphi, men jeg er ret sikker på at du kan lave det samme, på ca. samme måde i Delphi.
Se f.ex:
http://www.cpcug.org/user/clemenzi/technical/Languages/Delphi/Delphi_SerialIO.htm


Okay prøver det lige imorgen (skal jo lige have fat i et voltmeter og sådan).

Men for i øvrigt.. Den kode der er i den anden tråd om det samme problem bare i C/C++ kan jeg ikk få til at virke? Ved mig sker der fuldstændig det samme som der sker for Johan.

Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------



Men for i øvrigt.. Den kode der er i den anden tråd om det samme problem bare i C/C++ kan jeg ikk få til at virke? Ved mig sker der fuldstændig det samme som der sker for Johan.


Hvordan har du testet?
Har du sat den til at bruge den rigtige port?
Jeg må vist hellere få lavet nogle flere tests.



Hej Rune

Nu er "strøm" måske nok noget der skal tages med et gran salt. Det en COM port kan source er nogle få mA og ikke noget, der kan trække en "modeljernbane." Så det du kan bruge det er til at give et signal som du så bør buffe med en transistor.

Problemer er ikke specielt koblet til dit programmeringssprog. Så med Delphi er det "bare at gøre det."

Problemer opstår der først når du anvender Windows NT, 2000, XP osv. Disse tillader ikke direkte adgang til porte. Så der skal bruges lidt kneb, dvs. specielle drivere. Der findes to jeg kender til ZLPortIO og DLPortIO, hvor jeg selv anvender den første pakke.

God fornøjelse
Mik D



Hej Rune

Nu er "strøm" måske nok noget der skal tages med et gran salt. Det en COM port kan source er nogle få mA og ikke noget, der kan trække en "modeljernbane." Så det du kan bruge det er til at give et signal som du så bør buffe med en transistor.

Problemer er ikke specielt koblet til dit programmeringssprog. Så med Delphi er det "bare at gøre det."

Problemer opstår der først når du anvender Windows NT, 2000, XP osv. Disse tillader ikke direkte adgang til porte. Så der skal bruges lidt kneb, dvs. specielle drivere. Der findes to jeg kender til ZLPortIO og DLPortIO, hvor jeg selv anvender den første pakke.

God fornøjelse
Mik D


Det er jo WIn XP jeg skal bruge det i. Skal heller ikke bruge mere end 3 votl så tror det er nok?
Det skal nemlig bare tænde for en sender som så sender til en modtager hvor der er sat strøm til.

Prøver lige din kode om lidt.

Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------



Hej Rune

Du bør nok være opmærksom på at der principielt er +/- 12 V på en COM port. I "virkeligheder" er der nok snarere tale som +/- 5 V. Det afhænger lidt af H/Wen.

Så en modstand og en transistor er nok ikke helt af vejen.

Mik D



Hej Rune

Nu er "strøm" måske nok noget der skal tages med et gran salt. Det en COM port kan source er nogle få mA og ikke noget, der kan trække en "modeljernbane." Så det du kan bruge det er til at give et signal som du så bør buffe med en transistor.

Problemer er ikke specielt koblet til dit programmeringssprog. Så med Delphi er det "bare at gøre det."

Problemer opstår der først når du anvender Windows NT, 2000, XP osv. Disse tillader ikke direkte adgang til porte. Så der skal bruges lidt kneb, dvs. specielle drivere. Der findes to jeg kender til ZLPortIO og DLPortIO, hvor jeg selv anvender den første pakke.

God fornøjelse
Mik D


Hmm kan ikke helt finde rundt i hvad der er units og sån :S Men det første du har skrevet er selve projekt filen ikke?
Men et næste er det så unit1.dcu eller communit.dcu?

Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------



Den første er rad.dpr og den anden er communit.pas.



Den første er rad.dpr og den anden er communit.pas.


Okay. Men der sker intete når jeg kører det?

Den skfiter bare ned til næste linje i commandprompt.

Mvh.
Rune Jensen
---------------------------------------------------------------------------
##The one who laugh last is the one who think slowest!##
---------------------------------------------------------------------------



t