Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi TComPort Problem (https://www.delphipraxis.net/155712-tcomport-problem.html)

Muellermilchtrinker 4. Nov 2010 15:55

TComPort Problem
 
Hallo DP,

ich probiere gerade mit TComport von hier einen String über RS232 zu senden.
Ich mache das so:
Delphi-Quellcode:
comport1.writestr('&B00110011');
Comport wurde davor geöffnet. Daneben überwache ich das noch über die im Paket enthaltene Terminalkomponente. Doch leider schickt mein Delphiprogramm, wenn ich es so mit dem Code oben mache nur &B.
weiß auch nicht warum. Kann mir jmd. helfen? Wäre echt nett.

Bummi 4. Nov 2010 16:25

AW: TComPort Problem
 
Bei TComport kann soviel eingestellt werden daß es manchmal mühssm ist die richtige Einstellung für empfindliche Geräte zu finden.
Vielleicht hast Du auch nur ein Unicodeproblem, nimm AnsiStrings.

LargoD 4. Nov 2010 17:05

AW: TComPort Problem
 
Zeig mal Deine Einstellungen oder ein Stück Kode.
Als Hinweis:
Für erste Versuche Flowcontrol ausschalten
Gruß
Erich

shmia 4. Nov 2010 17:21

AW: TComPort Problem
 
Ich weiss nicht, ob du das schon getan hast, aber es gibt bei RS232 etwas Wichtiges zu beachten.
Teste die RS232-Verbindung mit einem Terminalprogramm (z.B. Hypherterminal)!!

Dazu die Kommandos in eine TXT-Datei speichern und mit ASCII-Transfer (Hypherterm: Übertragung->Textdatei senden) wegschicken.
Erst wenn das funktioniert hat, sprich wenn du erfolgreich Kommandos in deinen Controller übertragen hast, darfst du mit der TComPort Komponente arbeiten.

Bei RS232 können so viele Dinge schiefgehen, dass es sehr ungeschickt wäre, nicht zuvor einen Test mit einem Terminalprogramm durchzuführen.

Dies gilt überigens für jede Art von Kommunikation (TCP/IP, UDP, HTTP, SOAP,...).
Man beginnt immer mit einem fertigen Client und geht dann erst zum eigenen Programm über.

Muellermilchtrinker 4. Nov 2010 17:23

AW: TComPort Problem
 
Mit einem Terminalprogramm funktioniert auch alles. Damit hab ich alles getestet und damit die Software für den AVR entwickelt.
Im Terminalprgramm sieht es so aus:
Code:
feld>2
muster>&B00110011
Und funktioniert auch.

shmia 4. Nov 2010 17:38

AW: TComPort Problem
 
Zitat:

Zitat von Muellermilchtrinker (Beitrag 1059702)
Mit einem Terminalprogramm funktioniert auch alles

Gut. Bei TComport ist doch auch ein Beispielprojekt MiniTerm dabei.
Wie sieht's denn damit aus?
Da kannst das Projekt auch in ein anderes Verzeichnis kopieren und dann zum Test an deine Belange anpassen.

Muellermilchtrinker 5. Nov 2010 12:43

AW: TComPort Problem
 
Mit dem Beispiel klappts auch. Doch ich möchte das nicht mit der Terminalkomponente machen sondern einfach nur mit Comport.
So ist mein Code vom Button:
Delphi-Quellcode:
var s:ansistring;
begin
comPort1.Write(pchar(edit1.Text),1);
comport1.Write(#13,1);
s := ansistring(edit2.Text);
comport1.WriteStr(s);
comport1.Write(#13,1);
Edit1.Text = 2
Edit2.Text = &B00110011

Im Terminal siehts dann so aus:
Code:
feld>2
muster>&B
feld>
Aber bei Muster sollte der ganze Text ausm Editfeld stehen.

Nersgatt 5. Nov 2010 13:15

AW: TComPort Problem
 
Bei Write heißt der 2. Parameter (wo Du die 1 übergibtst) "Count". Ich vermute, dort wird die Länge des Strings erwartet:
Delphi-Quellcode:
comPort1.Write(pchar(edit1.Text),length(edit1.text));

Muellermilchtrinker 5. Nov 2010 13:17

AW: TComPort Problem
 
Bei genauer hinschauen hättest du gesehen, dass das nicht an write liegt sondern erst bei writestr und die ist anders aufgebaut

taveuni 5. Nov 2010 13:56

AW: TComPort Problem
 
Ich hab jetzt nicht alles genau durchgelesen.
Aber - handelt es sich hier um ein ASCII-Protokoll?
Denn nur dann kannst Du WriteString() anwenden.
Also kann der Empfänger (was oder wer ist das überhaupt?) ASCII interpretieren?.

Edit: Satz zu Ende geschrieben.

Muellermilchtrinker 5. Nov 2010 14:13

AW: TComPort Problem
 
Empfänger ist in AtMega32 der über Input in BASCOM auf einen String wartet. Das Problem ist, dass wenn ich über ein Terminal den String sende, dass dann alles funktioniert. Nutze ich aber oben geposteten Code, dann werden nur die ersten zwei Zeichen aus dem Edit2 ('&B00110011') übertragen. Sprich er sendet nur &B.

Nersgatt 5. Nov 2010 14:24

AW: TComPort Problem
 
Und wenn Du den String mit Write statt mit WriteStr schickst?

Muellermilchtrinker 5. Nov 2010 14:27

AW: TComPort Problem
 
Damit:
Delphi-Quellcode:
comport1.Write(pchar(edit2.text),length(edit2.Text));
schickt er dann zwei Fragezeichen

Nersgatt 5. Nov 2010 14:34

AW: TComPort Problem
 
Irgendwie beschleicht mich das Gefühl, dass das Problem vielleicht an einer anderen Stelle zu suchen ist.
Zeig doch mal etwas mehr Quellcode "drumrum".

Muellermilchtrinker 5. Nov 2010 14:36

AW: TComPort Problem
 
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    ComTerminal1: TComTerminal;
    ComPort1: TComPort;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Button3: TButton;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
comport1.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
comport1.Close;
end;

procedure TForm1.Button3Click(Sender: TObject);
var s:ansistring;
begin
comPort1.Write(pchar(edit1.Text),1);
comport1.Write(#13,1);
s := ansistring(edit2.Text);
comport1.WriteStr(s);
comport1.Write(#13,1);
end;

end.

LargoD 5. Nov 2010 15:02

AW: TComPort Problem
 
Wenn der ATMega angeschlossen ist, siehst Du im Terminalprogramm die Antwort, und nicht das, was raus geht.
Häng den ATMega mal ab und mach eine Brücke zwischen Pin 2 und Pin 3 der seriellen Schnittstelle. Dann siehst Du im Terminal was Du sendest. Vielleicht hat der ATMega ja ein Geschwindigkeitsproblem, was Du natürlich bei manueller Eingabe nicht merkst.

Gruß
Erich

shmia 5. Nov 2010 15:04

AW: TComPort Problem
 
Das gefällt mir nicht so:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var s:ansistring;
begin
comPort1.Write(pchar(edit1.Text),1);
comport1.Write(#13,1);
s := ansistring(edit2.Text);
comport1.WriteStr(s);
comport1.Write(#13,1);
end;
Besser so:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
  var line:ansistring;
begin
  line := AnsiString(edit1.Text + #13);
  comport1.WriteStr(line);

  line := AnsiString(edit2.Text + #13);
  comport1.WriteStr(line);
end;

Muellermilchtrinker 5. Nov 2010 15:05

AW: TComPort Problem
 
Mit der Brücke zwischen 2 und 3 kommt dann der ganze String also: &B00110011

LargoD 5. Nov 2010 15:24

AW: TComPort Problem
 
Zitat:

Zitat von Muellermilchtrinker (Beitrag 1059884)
Mit der Brücke zwischen 2 und 3 kommt dann der ganze String also: &B00110011

Dann klappt ja das Senden.
Wenn die Antwort vom ATega immer noch verstümmelt ist, musst Du klären, ob der ATMega Hardware- oder Software-Handshake braucht und dann in TComport das Richtige einstellen. Bei Hardware-Handshake müssen natürlich auch die entsprechenden Leitungen verdrahtet sein.
Gruß
Erich

Edit sagt: Parity und Anzahl der Stop-Bits und ähnliches hast Du richtig eingestellt?

Muellermilchtrinker 5. Nov 2010 15:24

AW: TComPort Problem
 
So, dass Programm funktioniert jetzt. Hatte noch zum Testen ne Wartefunktion im Code für den AtMega. Jetzt funktioniert alles.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 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