Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Verbindung mit COM-Schnittstelle aufbauen über TComPort (https://www.delphipraxis.net/117298-verbindung-mit-com-schnittstelle-aufbauen-ueber-tcomport.html)

Dark Angel 15. Jul 2008 15:22


Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Hallo,

ich werd einfach nicht schlauer aus den Forenbeiträgen. Kann mir jmd helfen? Ich bin eher Anfäger in Delphi 2007.

Ich habe bereits ein Programm und will jetzt noch eine Verbindung über COM dazu bauen. Ich bin schon soweit, dass ich die TComPort Componente installiert hab und jetzt 6 neue visualle ...ähm Dinge in meiner Tool-Palette habe.

ich will dass ich auswählen kann zwischen den COM Verbindungen mit der COMCombobox nur leider zeigt die mir nur 5mal "COM" an und nicht "COM1, COM2,...) wie kann ich das ändern. DAs ist mein verwendeter code dafür:

Das ganze ist in der On Create Form drin, hat da jmd ne bessere Idee. Das Problem ist ja wenn sich unter dem Programm noch einen neue Schnittstelle auftut dann muss ich das ganze Programm erst neu starten bis die Combobox aktualisiert wird.

Delphi-Quellcode:
  EnumComPorts(COMComboBox1.Items);
  // do some stuff
  if COMComboBox1.ItemIndex > -1 then
    ComPort1.Port := COMComboBox1.Items[COMComboBox1.ItemIndex];
Dann weiß ich nicht mehr weiter. Weil wenn ich einen BUtton mir "..connected:=true" setzte stürzt das Programm ab.

Ich will, was mir sehr gut gefallen hat in dem Forum, ein OnRX damit er die Eingänge überwacht und dann das SIgnal abfängt.
Ich will senden und empfangen. Empfnagen werde ich eine Stringkette mit 22strings und zwar alle 0,5sec und senden will ich einen einfachen Befehl zB. ein byte mit 0b11001010 so in etwa.

Wie mach ich das am besten?

Vielen Dank schon mal

messie 15. Jul 2008 16:57

Re: Verbindung mit COM-Schlittstelle aufbauen über TComPort
 
Was Du da machst, sieht nach einer nicht existierenden Verbindung aus.
Du platzierst ein TComport (ComPort1) auf dem Form, ebenso die TComComboBox. In den Properties der ComComboBox1 stellst Du als ComPort "ComPort1" ein. Dann die Property "ComProperty" au cpPort setzen. Zur Laufzeit wird dann ComPort1 genau der Port zugewiesen, den Du aus der Liste ausgewählt hast. Das musst Du also nicht extra machen wie von Dir beschrieben.
Ich weiß noch nicht, was passiert wenn der Port beim Auswählen offen ist, weil ich das nicht verwende. Wenn Du vorher ein ComPort1.Close ausführst, ist das sicher. Nach der Auswahl kannst Du dann ComPort1.Open probieren. Am Besten Du machst das bis dahin und testest an zwei Ports oder Rechnern mit Hyperterminal.

Grüße, Messie

Dark Angel 15. Jul 2008 22:12

Re: Verbindung mit COM-Schlittstelle aufbauen über TComPort
 
Ich komm einfach nicht weiter. Ich füge die Elemente (COMCombobox,...) und kann dann aber nur zeischen (COM, COM und COM3) wählen obwohl ich COM3, COM4 und COM 6 habe, laut HTerm. COM4 und COM6 sind Bluetooth module, aber das kann ja keinen Unterschied machen oder??

messie 15. Jul 2008 23:22

Re: Verbindung mit COM-Schlittstelle aufbauen über TComPort
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Dark Angel
Ich komm einfach nicht weiter. Ich füge die Elemente (COMCombobox,...) und kann dann aber nur zwischen (COM, COM und COM3) wählen obwohl ich COM3, COM4 und COM 6 habe, laut HTerm. COM4 und COM6 sind Bluetooth module, aber das kann ja keinen Unterschied machen oder??

Im Prinzip nicht, wenn die Ports vernünftig vom Treiber angemeldet sind.
Ich häng' mal mein Beispiel an: Du solltest die Ports alle sehen, wenn sie vernünftig beim System angemeldet sind. Siehst Du sie da auch nicht, riecht es eher nach einem Treiberproblem...

Grüße, Messie

Edit: Du solltest den Tippfehler in Deinem Titel verbessern, damit man den Thread später auch mit der Suche finden kann.

divBy0 16. Jul 2008 08:01

Re: Verbindung mit COM-Schlittstelle aufbauen über TComPort
 
Zeig doch bitte mal den Teil, wo du die Verbindung aufbaust.

Zitat:

Zitat von Dark Angel
Weil wenn ich einen BUtton mir "..connected:=true" setzte stürzt das Programm ab.

Die Eigenschaft Connected kannst du nicht setzen, die kannst du abfragen, ob der Port geöffnet ist.

So kannst du den Com-Port öffnen:

Delphi-Quellcode:
 
ComPort.Port := 'COM1'; // hier der Port als String
ComPort.BaudRate := br19200;
ComPort.DataBits := dbSeven;
ComPort.StopBits := sbOneStopBit;
ComPort.Parity.Bits := prEven;
ComPort.Buffer.InputSize := 1024; // musst du anpassen
ComPort.Buffer.OutputSize := 1024; // musst du anpassen

try
  ComPort.Open;
except
  ShowMessage('Fehler: COM-Port konnte nicht geöffnet werden...'); // Fehlermeldung
end;

Dark Angel 16. Jul 2008 08:19

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
@messie

bei deinem Programm hab ich den se´lben fehler, dass die beiden BluetoothCOMports nicht richtig angezeigt werden. allerdings hab ich bei Hterm da keine Probleme es richtig anzuzeigen und im Gerätemanager ist auch alles okay und die funktionieren ja auch alle einwandfrei.

Und, ja mein Zeitplan ist echt knapp, aber daran kann ich leider nichts ändern.

VIELEN DANK an alle


Erste Erfolge stellen sich ein. Die Verbindung steht aber die Anzeige der Comports spinnt trotzdem. Komisch.

GIbts bei Async Pro auch so ne Combobox zu anziegen der Ports, dann könnt ichs mit dem mal versuchen, aber ich find keine passende visualle Konponente dafür.

messie 16. Jul 2008 08:46

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Klick' mal doppelt zur Entwurfszeit auf Deinen TComport. Da wird ja das Setup-Fenster für den Port geöffnet und die zur Verfügung stehenden Ports angezeigt. Siehst Du dort auch nur verstümmelte Einträge?

Grüße, Messie

divBy0 16. Jul 2008 08:57

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Versuch doch mal eine normale ComboBox zu nehmen. EnumComPorts gibt ja TStrings zurück, das kannst du einer normalen ComboBox zuweisen.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ComPorts: TStrings;
begin
  ComPorts := TStringlist.Create;
  try
    EnumComPorts(ComPorts);
  except
    ShowMessage('Fehler: Keine Com-Ports gefunden...');
  end;
 
  ComboBox1.Items := ComPorts;
  ComPorts.Free;
end;

Dark Angel 16. Jul 2008 11:03

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Vielen Dank Leute es ist überall das selbe die BT COM's werden nicht richtig angezeigt.

Aber ich hab jetzt einfach eine normale COmbobox genommen und die richtigen COMnamen eingetragen und diese dann zum verbidungsaufbau genützt und sieh da es funzt.

Nun kommen wir zu den weiteren Problemen, die sich ergeben haben bei dem Programmcode..

Delphi-Quellcode:
procedure TForm3.Button2Click(Sender: TObject);  // ComPort2 ist schon richtig
begin
  ComPort2.Port := Combobox2.text; // das ist COM4
  ComPort2.BaudRate := br19200;
  ComPort2.DataBits := dbSeven;
  ComPort2.StopBits := sbOneStopBit;
  ComPort2.Parity.Bits := prEven;
  ComPort2.Buffer.InputSize := 1024;
  ComPort2.Buffer.OutputSize := 1024;
try
  ComPort2.Open;

except
  ShowMessage('Fehler: Bluetooth-COM-Port konnte nicht geöffnet werden...'); // Fehlermeldung
end;
..wird mir beim ausführen als erstes diese Nachricht "Erste Gelegenheit für Exception bei $776742EB. Exception-Klasse EComPort mit Meldung 'Unable to open com port (win error code: 121)'. Prozess Geschwindigkeitsmessung.exe (8848)" mit einer Programmunterbrechung angezeigt und wenn ich dann auf "fortsetzen" klicke kommt est die Fehlermeldung " ShowMessage('Fehler: Bluetooth-COM-Port konnte nicht geöffnet werden...'); // Fehlermeldung" die ich in except eingetragen habe zum vorschein.

was mache ich falsch??

messie 16. Jul 2008 11:13

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Hast Du jetzt ein Problem mit dem ComPort.Open oder mit der Meldung?

Die Exception-Meldungen sind aus dem Online-Debugger. Da wird das Programm beim Fehler angehalten, erst wenn Du fortsetzt, wird Deine Fehlermeldung angezeigt. Wenn Du das mit der exe probierst, verhält sich das anders.

Grüße, Messie

Dark Angel 16. Jul 2008 11:18

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
ja aber sollte es denn nicht beim stesten schon einnigermaßen gehen.


EDIT: Ja du hast recht, bei der exe klappts. Gibt es eine Möglichkeit erkennen zulassen (ohne selbst Daten versenden zu müssen), dass zB
der andere Teilnehmer keine Verbindung mehr hat (etwa durch Stromunterbrechung)

messie 16. Jul 2008 11:34

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Zitat:

Zitat von Dark Angel
Gibt es eine Möglichkeit erkennen zulassen (ohne selbst Daten versenden zu müssen), dass zB
der andere Teilnehmer keine Verbindung mehr hat (etwa durch Stromunterbrechung)

Ja, Du kannst mit einem Heartbeat arbeiten. Lass Deinen Prozessor im Leerlauf ein Zeichen senden (z.B. jede sec), was sonst nicht vorkommt. Das Programm muss dann unterscheiden, ob das jetzt das Heartbeat-Signal oder das Start/Stopp-Signal ist und entsprechend handeln.
Wenn das Heartbeat-Signal kommt, setzt Du eine Variable auf Null. Dann nimmst Du einen Timer, der die Variable inkrementiert. Wenn im Ontimer der Wert größer als der Alarmwert ist, kannst Du eine Nachricht bringen und die Schnittstelle schliessen.

Grüße, Messie

Dark Angel 16. Jul 2008 12:12

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Ja einen Heartbeat hab ich nur wie mach ich des mitm Timer, der arbeitet doch im sec takt oder nicht mein heartbeat kommt alle 0,568s aber einer darf schon mal verloren gehen, zur Sicherheit.

divBy0 16. Jul 2008 12:19

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Du kannst den Timer doch mit dem Property Intervall auf 250ms oder sonst was einstellen.

Dark Angel 16. Jul 2008 18:42

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Ach das ist ja schön das wüsste ich noch gar nicht.

damit ist das Problem gelöst und ich stehe vorm nächsten. In Comterminal sehe ich die Zeiche und wie bekomme ich die jetzt in eine Variable??

EDIT: Wenn ich schreibe:


ComPort.Readstr(Str, count); //count = irgendwas zB.30
showmessage(str);

Dann sehe ich in der message den str aber wenn ich

label1.caption := str;

mache dann kommt gar nichts


WIESO???

divBy0 16. Jul 2008 20:09

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Eigentlich solltest du den String auch im Label sehen. Setz dir doch mal einen Haltepunkt an der Stelle und schau im Debugger nach, was in dem String drin steht.

Versuch's mal mit einem Sleep(500) vor dem ComPort.ReadStr(...);, nur zu Testzwecken.

Ansonsten schau dir mal die Ereignisse OnRxChar oder OnRxBuf an, die werden ausgelöst wenn ein Zeichen eintrifft oder wenn der Puffer voll ist.

Dark Angel 17. Jul 2008 00:50

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
@ Dicby0

also das mit dem debugger kann ich nicht, aber ich hab nen sleep davor gesetzt und jetzt blinkt ganz kurz der übertragene Wert auf und dann ist im string '' (also nichts) doch das Senden ist alle 0,5sec und das sieht man auch im comterminarl. kann es sein, dass im sting alles steht, also wenn der alle 0,5sec das überträgt und das dann etwa 20ms dauert und der rest der Zeit wird ja nichts übertragen, dass also die meiste zeit nichts im string steht.

Und noch was worein soll ich die ReadStr schreiben, habs nämlich mal bei allen probiert. Klappt nirgens

procedure TForm3.ComPort1RxFlag(Sender: TObject); ODER
procedure TForm3.ComDataPacket1Packet(Sender: TObject; const Str: string); ODER
procedure TForm3.ComPort1RxChar(Sender: TObject; Count: Integer); ODER
procedure TForm3.ComPort1RxBuf(Sender: TObject; const Buffer; Count: Integer);

Danke

mkinzler 17. Jul 2008 05:32

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Möglicherweise ist das Programm so beschäftigt, das es gar nicht auf den Repaint-Request reagiert. Füg mal
Delphi-Quellcode:
Application.ProcessMessages;
nach der Zuweisung an den Label aus.

Dark Angel 17. Jul 2008 05:44

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Naja es ist nicht unbedingt besser, das label zeigt mir nun zwar manchmal die richtige reihenfolge "MV 26,92km/h 5,76m/s" aber auch manchmal wieder nichts odr nur "V 26,92km/h 5,76m/s" oder nur "M".

ich will daraus ja die beiden Zahlen extrahieren, die sich je nach Messwert ändern, wie kann ich das bei diesen schwankenden werten anstellen??

oki 17. Jul 2008 06:30

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
lese den empfangenen Wert in eine Variable ein (oder adde ihn in eine Stringliste) oder was auch immer. Dann kannst du an anderer Stelle diese Werte anzeigen. Der Einfachheit halber tu es mal in einem Memo.

Für deinen Beispiel-Code sollte das dann so aussehen:
Delphi-Quellcode:
ComPort.Readstr(Str, count); //count = irgendwas zB.30
Memo1.Lines.Add(str);
Application.ProcessMessages;
du wirst dehen, wie dein Memo anfängt sich mit den Werten zu füllen.
Der Hinweis mit Application.ProcessMessages ist berechtigt. Wenn dein Port ständig streamt wird andauernd dein Read-Ereignis aufgerufen und deine Anwendung kommt dann mit dem Neuzeichnen nicht mehr hinterher.

Gruß oki

messie 17. Jul 2008 06:33

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Scheint an Deiner Übertragunsgsstruktur zu liegen. Du musst Anfang und Ende finden. Was schickst Du denn für eine Abschlusssequenz, wenn die Übertragung des Prozessors beendet ist? CR/LF oder so?

Grüße, Messie

Dark Angel 17. Jul 2008 07:36

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
so nun hab ichs das schon mal geschafft, der string ist mit den richtigen daten gefüllt. es wird die zeichenkette im memo und im label agezeigt allerdings kommt es im memo noch manchmal zu störungen, bei denen dann nicht die ganze zeil erichtig übretragen wird.

Code dazu:
Delphi-Quellcode:
procedure TForm3.ComPort1RxBuf(Sender: TObject; const Buffer; Count: Integer);
var
RXStr_LS1 : string;
begin
sleep(568);
ComPort1.Readstr(Strx, 20);
 Memo1.Lines.Add(strx);
if Strx = 'MV 26,92km/h 5,76m/s' then
 label24.caption := strx;

Application.ProcessMessages;
end;

JETZT würde ich aber noch gerne aus der zeichenkette die beiden geschwindigkeiten auslesen und einzelen in einem label anzeigen lassen. dazu hab ich mir mal so möglichkeiten zur extraction angesehen, wie expect(),.... aber ich kenn mich da gar nicht aus. Wie könnt ich das am besten machen??

oki 17. Jul 2008 07:44

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Na denn, prüfe auf Vorkommen MV + #$20, lese erste Geschwindigkeit mittels Pos und Copy bis zum nächsten Leerzeichen und zweite Geschwindigkeit in gleicher Form aus und die Welt ist wieder in Ordnung.

oki

messie 17. Jul 2008 07:51

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Zitat:

Zitat von oki
Na denn, prüfe auf Vorkommen MV + #$20, lese erste Geschwindigkeit mittels Pos und Copy bis zum nächsten Leerzeichen und zweite Geschwindigkeit in gleicher Form aus und die Welt ist wieder in Ordnung.

oki

Zusätzlich hilft noch delete(). Aber ich würde auch prüfen, ob Du auch genug Zeichen im Puffer hast. Gibt es variable Längen (z.B. 5m/s ist kürzer als 111 m/s, füllt Du das mit Nullen auf?). Wenn Du am Ende der Sequenz vom µC ein #13 schickst, kannst Du das Ende erkennen (und damit ob Du eine vollständige Sequenz hast), das ist eins der üblichen Verfahren.

Grüße, Messie

oki 17. Jul 2008 07:54

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Zitat:

Zitat von messie
Zusätzlich hilft noch delete(). Aber ich würde auch prüfen, ob Du auch genug Zeichen im Puffer hast. Gibt es variable Längen (z.B. 5m/s ist kürzer als 111 m/s, füllt Du das mit Nullen auf?). Wenn Du am Ende der Sequenz vom µC ein #13 schickst, kannst Du das Ende erkennen (und damit ob Du eine vollständige Sequenz hast), das ist eins der üblichen Verfahren.

Grüße, Messie

Richtisch!

Dark Angel 17. Jul 2008 09:28

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Danke für die schnellen Anworten Leute, aber ich check nicht wie ich pos() und copy() richtig einsetzen soll.

Und das funzt auch nicht:

Delphi-Quellcode:
if Strx = ('MV' + #$20) then
 label24.caption := strx;
@messie
ich fülle die werte mit nullen auf also an der stellenanzahl und belegung ändert sich gar nichts, Wie hilft mir das weiter?

messie 17. Jul 2008 15:57

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Zitat:

Zitat von Dark Angel
das funzt auch nicht:
Delphi-Quellcode:
if Strx = ('MV' + #$20) then
 label24.caption := strx;

Logisch, denn Du liest ja 20 Zeichen in die Variable ein und fragst dann, ob die Variable GLEICH der 3 Zeichen ist. Kann also nicht gehen.
Eher mit Pos:
Delphi-Quellcode:
if Pos('MV'+#20,strx) = 1 then
begin
  //aha, Du bist am Beginn Deiner Sequenz
end;

//andere Variante

if Pos('MV'+#20,strx) > 0 then //ist die 3er-Squenz in der Variable enthalten?
begin
  i := Pos('MV'+#20,strx); //Anfang suchen
  strZ := copy(strx,i+4,5);//damit solltest Du "26,92" im Kasten haben.
end;
Alles ungetestet.

Grüße, Messie

Dark Angel 17. Jul 2008 17:34

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
WOW vielen herzlichen DANK es klappt. JUHU :hello: :bounce2: :dancer:


Aber leider wars das noch nicht. Ich muss ja auch was senden. mit:

Delphi-Quellcode:
  ComPort1.WriteStr('TEST');
müsste doch eigentlich klappen oder? nur wie überprüf ichs am PC obs auch rausgegangen ist. Terminalprob hätt ich versucht aber ich kann ja nicht mit dem Programm und dem Hterm eine Verbindung aufbauen.

Habt Ihr ne idee??

messie 17. Jul 2008 18:06

Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
 
Also eine Überprüfung der gesendeten Sachen ist nicht vorgesehen. Die Daten werden ins COM-Register geschrieben und dann irgendwie umgesetzt. Das macht unter Windows der Treiber und jeder macht es anders (sonst gäbe es keine virtuellen Ports einer BT-Hardware :wink: ). Da musst Du tatsächlich einen anderen Rechner mit Hyperterminal dranhängen (oder etwas Vergleichbares). Ich hab' für solche Zwecke immer ein ein Lauscherkabel bei mir - Du verbindest Deinen µC mit dem PC und lässt es laufen - am Lauscherport hängst Du Dein Notebook oder notfalls ein Oszi dran. Funzt meistens prima.

Grüße, Messie


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:07 Uhr.

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