Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi RS232 (https://www.delphipraxis.net/41683-rs232.html)

Studtowicz 7. Mär 2005 09:31


RS232
 
Moin,

ich habe folgendes Problem:
Ich finde einfach kein Tutorial,Forum Eintrag oder sonstiges über die Ansprechung einer seriellen Schnittstelle mit Delphi.

Ich habe im Unterricht ein Einschubnetzteil digitalisiert d.h. es kann über eine serielle Schnittstelle bedient werden (Spannung rauf und runter).

Habe mit PowerLAb eine visuelle Umgebung geschaffen und möchte dies mit delhi jetzt auch tun.
Dabei möchte ich gar nicht so viel Schnick Schnack, einfach erstmal nur zwei Buttons um die
Spannung einzustellen.
Theoretisch müsste ich ja nur bei Button Klick die Bytefolge senden die ich mit Basic schon im PIC programmiert habe.Aber wie????

Vielleicht kann mir ja einer bitte weiterhelfen.

PS:Ich bin ein Noob! :roll:

Steve 7. Mär 2005 09:37

Re: RS232
 
Hi und erstmal herzlich willkommen in der DP :dp: :party:

Die Zeichenfolge, die Du an die Schnittstelle schickst bleibt natürlich die gleiche. Du brauchst also nur eine Möglichkeit, die Schnittstelle anzusprechen. Dazu gibts hier im Forum jede Menge (z.B. Hier im Forum suchenRS232)
- und als Komponente empfiehlt sich TurboPower ASync Pro. Auch dazu gibts hier ne Menge Anleitungen usw.

Viel Erfolg damit :)

Gruß
Stephan :dance:

[edit]Tippfehler[/edit]

Studtowicz 7. Mär 2005 09:41

Re: RS232
 
Danke für die schnelle Antwort,werd mich da erst mal durcharbeiten.

peter12 7. Mär 2005 14:04

Re: RS232
 
Habe mit serialng Freeware komponente gute Erfahrung.

http://www.domis.de/cms/modules.php?...download&cid=1

mit Beispielen

peter

Hansa 7. Mär 2005 14:54

Re: RS232
 
:wall: Was ist denn das für eine Seite ? :shock: Englisch/deutsch gemischt. Und dann ich glaubs nicht : 3 ? Freeware Projekte, die durch Spenden gefördert werden sollen und dann noch Stundensätze von 1100 EUR ? :lol:

Ist die Seite etwa von Dir ? Ich hoffs mal nicht. Die Preisliste ist auch noch von 2002. :mrgreen:

Verwende dann doch besser Async Pro. Das ist "richtige" und vor allem professionelle Freeware. Hat mich schon mal ca. 350 EUR gekostet und jetzt gibts das für nichts ! Wenn dir die 3000 Seiten Handbücher zu viel sind : es geht bei dir wegen serieller Schnittstelle praktisch nur um die Komponenten APuart oder OOCom. Aber ohne Gewähr, ob die wirklich so heißen. Sind immerhin so an die 200 verschiedene.

Steve 7. Mär 2005 14:56

Re: RS232
 
Moin,

afair heißt die/eine benötigte Komponente TApdComPort..

Gruß
Stephan :dance:

TeronG 7. Mär 2005 15:16

Re: RS232
 
hi .. Ihr wollt nen Com-Port ansteuern :gruebel:
oder hab ich da jetzt was missverstanden :gruebel:
Naja falls nicht hab ich das bis dato immer ohne kombos gemacht ..

Und zwar zum öffnen der Verbindung:
Delphi-Quellcode:
// Kommunikation mit Com-Port Initiieren
Procedure VerbindungStart;
Var
// Variablen für das öffnen der Com verbindug
    port:pansichar;
    b_fsuccess, b_RSetMask : Boolean;
    Dcb : TDCB;
    TCOM_com : TCOMMTIMEOUTS;
begin
//************** Com-Schnittstellen konfigurieren und öffnen *******************
//******************************************************************************
  hcom_3:=createfile('com1',GENERIC_READ or GENERIC_WRITE,
                    0,nil,OPEN_EXISTING, 0, 0);
  IF hcom_3=INVALID_HANDLE_VALUE then Application.Terminate;
//************** Com1 setzen: *****************************************
  // READ THE SERIAL PORT CONFIGURATION :
  b_fsuccess := GetcommState(hcom_3,dcb);
  //-------------------------------------
  dcb.BaudRate := baud;
  Dcb.ByteSize := byte;
  Dcb.Parity  := Parity;              {0-4     = None, Odd, Even, Mark, Space}
  Dcb.StopBits := StopBits;            {0, 1, 2 = 1, 1.5, 2                   }
  dcb.flags   :=$1011;

  // WRITE SERIAL PORT CONFIGURATION :
  b_fsuccess := SetcommState( hcom_3, Dcb );
  If b_fsuccess = False Then
    MessageDlg( 'WRITE SERIAL PORT CONFIGURATION : FAIL', MtError, [MbOk], 0 );

  // SPECIFIES A SET OF EVENTS TO BE MONITORED :
  b_RSetMask := SetCommMask( hcom_3, EV_RXCHAR );
  //-------------------------------------------
  If b_RSetMask = False Then
    MessageDlg( 'SPECIFIES A SET OF EVENTS TO BE MONITORED : FAIL',
               MtError, [MbOk], 0 );
  // COMPLETE THE STRUCTURE OF THE TIME OUT COMMUNICATION
  TCOM_com.ReadIntervalTimeOut         := 500;
  TCOM_com.ReadTotalTimeoutMultiplier  := 10;//MAXDWORD;
  TCOM_com.ReadtotalTimeOutConstant    := 100;
  //--------------------------------------
  // SET THE TIME OUT OF THE COMMUNICATION
  SetCommTimeouts(hcom_3,TCOM_com);
  //-----------------------------------
  // SET THE SIZE OF THE INPUT AND OUTPUT BUFFER :
  //b_fsuccess := SetupComm( Handle_Com, 1024, 1000 );
  b_fsuccess := SetupComm( hcom_3, 2000, 2000 );
  //--------------------------------------------
  If b_fsuccess = False Then
    MessageDlg( 'SET THE SIZE OF THE INPUT AND OUTPUT BUFFER : FAIL',
                MtError, [MbOK], 0 );
  {************** Com3 Konfiguration lesen:******************************}
  IF GetcommState(hcom_3, DCB) then
  begin
  end
  else MessageDlg('read serial Port configuration: Fail',mtError,[mbOK],0);
//*********************************************************************
end;
zum Schließen:
Delphi-Quellcode:
// Kommunikation mit Com-Port beenden
Procedure VerbindungStop;
Begin
  closehandle(hcom_3);
end;
Zum senden (evtl. noch mit programmschnipseln von mir :roll:)
Delphi-Quellcode:
Procedure Senden (sendezeichen :string);
Var
  // SchreibeVar's
  Text              : string;
  I,Laenge          : integer;
  Zeichen           : char;
  State             : boolean;
  writtenBytes      : dword;

Begin
// ************************ An COM3 Senden :      **********************
  Text:=sendezeichen+CHR(013);
  Laenge:=length(Text);
  For I:=1 to Laenge do
  begin
    Zeichen:=Text[I];
    state:= writefile(hcom_3,Zeichen,1, writtenBytes ,nil);
    IF( not state )then
    begin
    // Hier kommt fehlermeldung
      MessageDlg('Fehler beim senden an den Com-Port.', mtWarning, [mbOK], 0);
    end;
  end;
end;
Und zum Empfangen: (evtl. auch noch mit programmschnipseln von mir :roll:)
Delphi-Quellcode:
Function Empfangen : String ;
var
  // LeseVar's
  success           : boolean;
  Empfangene_Zeichen : array[0..50] of char;
  len               : dword;
  Text              : string;
  I                 : integer;
begin
  success:=readfile(hcom_3,Empfangene_Zeichen,35,LEN,nil); // Werte Empfangen
  If not success then
  begin
    MessageDlg('Fehler beim empfangen vom Com-Port.', mtWarning, [mbOK], 0);
  end;

  Result:=Empfangene_Zeichen;
end;
hmmm in der OH sollte mehr darüber stehen ... oder zumindest in der DP :dp:

Studtowicz 8. Mär 2005 15:39

Re: RS232
 
Danke erstmal für die ganzen Antworten.
Hab es jetzt hinbekommen, das wenn ich einen Button einmal Drücke und wieder loslasse die Spannung steigt.
Beim zweiten Button genau so, nur das die Spg. sinkt.

Ich möchte aber das sie steigt so lange ich den button drücke.
Habe es versucht mit OnMouseDown. Aber da genau das gleiche.

Sehe ich das richtig das ich evt. eine Schleife einbauen muss, und wenn ja WIE :?:

Wäre nett wenn mir da nochmal einer Helfen könnte.

Danke Gruss Studtowicz

SubData 8. Mär 2005 15:44

Re: RS232
 
Zitat:

Zitat von Hansa
... und dann noch Stundensätze von 1100 EUR ? :lol:

Das sind nur 110 Euro... Die sind zu blöd n Euro Zeichen darzustellen -grinsel-

TeronG 8. Mär 2005 15:55

Re: RS232
 
Zitat:

Zitat von Studtowicz
Ich möchte aber das sie steigt so lange ich den button drücke.
Habe es versucht mit OnMouseDown. Aber da genau das gleiche.

Sehe ich das richtig das ich evt. eine Schleife einbauen muss, und wenn ja WIE :?:

Ist zwar nicht mehr die Originalfrage des Threates aber versuch mal bei OnMouseDown eine endlosschleife zu starten, die stetig die spannung erhöht. Und bei OnMouseUp beendest du einfach die schleife wieder. (boolean in der schleifenbedingung oder so).

SubData 8. Mär 2005 15:57

Re: RS232
 
Geht sowas nich mit dem SpeedButton? Ich glaub der hat da gleich was für drin :>

TeronG 8. Mär 2005 16:01

Re: RS232
 
Laut OH hatter "nur" DAS:
OnClick
OnDblClick
OnMouseDown
OnMouseMove
OnMouseUp


Ohhh cool OnDblClick .. wusst ich garnet :stupid:

Ultimator 8. Mär 2005 16:02

Re: RS232
 
@TeronG:
Dafür wäre ne Endlosschleife geeignet, aber man sollte bedenken, dass man auch Pausen einsetzen sollte, damit die Spannung nicht zu schnell nach oben geht ;-)

TeronG 8. Mär 2005 16:06

Re: RS232
 
Zitat:

Zitat von Ultimator
@TeronG:
Dafür wäre ne Endlosschleife geeignet, aber man sollte bedenken, dass man auch Pausen einsetzen sollte, damit die Spannung nicht zu schnell nach oben geht ;-)

Klar ... Punkt für dich :gruebel:
ich mach das gerne mit "meiner" Wait-Procedure
Delphi-Quellcode:
procedure Wait(milliseconds: Cardinal);
var
  Start : Integer;
begin
  Start := GetTickCount;
  while GetTickCount-Start <= milliseconds do
    application.ProcessMessages;
end;

Studtowicz 8. Mär 2005 16:20

Re: RS232
 
wie bau ich denn die schleife ein?
bei mir sieht es jetzt so aus


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OoMisc, AdPort, Buttons;

type
TForm1 = class(TForm)
ApdComPort1: TApdComPort;
Button1: TButton;
Button2: TButton;
SpeedButton1: TSpeedButton;

procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

procedure Button2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);

private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ApdComPort1.Open := true;
ApdComPort1.Output := '+'
end;



procedure TForm1.Button2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ApdComPort1.Open := true;
ApdComPort1.Output := '-'
end;



end.




Kann ich dafür WHILE und DO nehmen?
und welcher Befehl kommt hinter DO????

Sorry ich bin ein nOOOOb

Ultimator 8. Mär 2005 18:02

Re: RS232
 
Müsste gehen, wenn du nen ApdComPort1 und 2 Buttons auf der Form hast ;-)
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button2MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    ButtonPressed: boolean;
    procedure SendSign(Zeichen: char);
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure Wait(milliseconds: Cardinal);
var
  Start : Integer;
begin
  Start := GetTickCount;
  while GetTickCount-Start <= milliseconds do
    Application.ProcessMessages;
end;

procedure TForm1.SendSign(Zeichen: char);
begin
 while ButtonPressed do
  begin
   ApdComPort1.Output := Zeichen;
   Wait(200);
  end;
end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 ButtonPressed := true;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 ButtonPressed := false;
end;

begin

procedure TForm1.Button2Click(Sender: TObject);
begin
 SendSign('+');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 SendSign('+');
end;

procedure TForm1.Button2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 ButtonPressed := true;
end;

procedure TForm1.Button2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 ButtonPressed := false;
end;

end.

TeronG 9. Mär 2005 08:17

Re: RS232
 
moin moin :)
Zitat:

Zitat von Studtowicz
Kann ich dafür WHILE und DO nehmen?
und welcher Befehl kommt hinter DO????

Klar kannste Delphi-Referenz durchsuchenWHILE benutzen .. nach DO kommt das was du machen willst ... entweder eine einzelne Aweisung oder mit Begin und End ein ganzer Haufen von anweisungen. ^^

Zitat:

Zitat von Studtowicz
wie bau ich denn die schleife ein?

Du könntest zum beispiel eine WHILE DO schleife bei OnMouseDown starten. Und bei OnMouseUp setzt du einen Boolean der die Schleife beendet auf High.
btw.: vergiss nicht den Boolean irgendwo wieder auf False zu Setzen sonnst läuft das ding nicht mehr an ^^

Delphi-Quellcode:
While not Global_bool_fuer_OnMouseUp DO
begin
  // Sannung hoch setzen
  // bissl warten
end;
Zitat:

Zitat von Studtowicz
bei mir sieht es jetzt so aus

Mach doch bitte die code-tag's (nennt man das so :gruebel: ) um deinen Code .. ist leserlicher dann :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz