![]() |
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:
Dann weiß ich nicht mehr weiter. Weil wenn ich einen BUtton mir "..connected:=true" setzte stürzt das Programm ab.
EnumComPorts(COMComboBox1.Items);
// do some stuff if COMComboBox1.ItemIndex > -1 then ComPort1.Port := COMComboBox1.Items[COMComboBox1.ItemIndex]; 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 |
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 |
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??
|
Re: Verbindung mit COM-Schlittstelle aufbauen über TComPort
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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. |
Re: Verbindung mit COM-Schlittstelle aufbauen über TComPort
Zeig doch bitte mal den Teil, wo du die Verbindung aufbaust.
Zitat:
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; |
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. |
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 |
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; |
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:
..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.
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; was mache ich falsch?? |
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 |
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) |
Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
Zitat:
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 |
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.
|
Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
Du kannst den Timer doch mit dem Property Intervall auf 250ms oder sonst was einstellen.
|
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??? |
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. |
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 |
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:
nach der Zuweisung an den Label aus.
Application.ProcessMessages;
|
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?? |
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:
du wirst dehen, wie dein Memo anfängt sich mit den Werten zu füllen.
ComPort.Readstr(Str, count); //count = irgendwas zB.30
Memo1.Lines.Add(str); Application.ProcessMessages; 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 |
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 |
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?? |
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 |
Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
Zitat:
Grüße, Messie |
Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
Zitat:
|
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:
@messie
if Strx = ('MV' + #$20) then
label24.caption := strx; ich fülle die werte mit nullen auf also an der stellenanzahl und belegung ändert sich gar nichts, Wie hilft mir das weiter? |
Re: Verbindung mit COM-Schnittstelle aufbauen über TComPort
Zitat:
Eher mit Pos:
Delphi-Quellcode:
Alles ungetestet.
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; Grüße, Messie |
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:
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.
ComPort1.WriteStr('TEST');
Habt Ihr ne idee?? |
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 13:56 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