Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - SerialportNG stellt einfach die Arbeit ein
daywalker0086 - Do 23.04.20 11:50
Titel: SerialportNG stellt einfach die Arbeit ein
Hallo Leute,
ich habe ein Problem an dem ich gerade verzweifle.
Ich setze die Komoponetne TSerialportNG ein um mit einem Comport mit FTDI Chip zu kommunizieren.
Auf der anderen Seite ist ein RS485 Bus dran mit dessen Geräten ich kommunizieren will.
Das geht auch eine Weile gut aber nach dem 10. oder auch 20. Telegramm stellt die Komponente einfach die Arbeit ein, das heißt es wird nichts mehr empfangen und auch nichts mehr gesendet.
Wenn ich einen Breakpoint in die Cluster RX Event Routine setze wird da auch nicht mehr rein gesprungen. Ist einfach tot. Auch den Comport schließen und wieder neu öffnen bringt nichts.
Hat jemand eine Idee wie ich dem Fehler auf die Schliche kommen kann?
Hab schon das Senden etc. auskommentiert damit er sich nicht slebst stört, aber auch das hilft nicht...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| procedure TForm1.RS485RxClusterEvent(Sender: TObject); var received_value_rs485, sendstring: string; vb,ve: integer; syncbyte,byte0,byte1,byte2: byte; bytes_send: array of byte;
begin syncbyte:= 128; setlength(received_value_rs485,4); setlength(bytes_send,4); received_value_rs485:= RS485.ReadNextClusterAsString; byte0:= ord(received_value_rs485[1]); Button_Mon_Status:= byte0 and not 192; byte1:= ord(received_value_rs485[2]); Button_Mon_Status:= Button_Mon_Status or (byte1 shl 6); byte2:= ord(received_value_rs485[3]); if Button_Mon_Status > 0 then LED_Mon_Status:= Button_Mon_Status; if ( byte0 and 128) = syncbyte then begin if ( byte0 and 64) = 64 then bytes_send[0] := 193 else bytes_send[0] := (LED_Mon_Status and not 64) or 128; bytes_send[1] := LED_Mon_Status shr 6; bytes_send[2] := 36; bytes_send[3] := (bytes_send[0] xor 36 xor byte1) and not 128;
sendstring:= inttostr(bytes_send[0]); end;
memo1.Lines.Add( 'Button: '+inttostr(Button_Mon_Status)); end; |
icho2099 - Fr 24.04.20 07:21
verwende einen Potentialausgleich zwischen den Teilnehmern.
GuaAck - Sa 25.04.20 23:13
Hallo,
ich kenne die Komponente nicht. Wie bekommst Du den die Sache wieder zum Laufen? Reicht ein Neustart des Programms oder musst Du Windows neu booten?
Benutzt Du Handshake (XON/XOFF oder Hardware)? Hast Du einen Hardware-COM-Port in Deinem Rechner oder einen USB-Umsetzer?
Ich hatte gelegentlich die Erfahrung gemacht, dass ein COM-Port nicht erreichbar war, weil er nach einem vorangegangenen Programmabsturz von Windows nicht freigegeben worden ist. Ok, ist bei Dir anders, er läuft ja an.
Gruß GuaAck
daywalker0086 - Mo 27.04.20 09:13
Ich mus das Programm neu starten, danach läuft die Kommunikation wieder.
daywalker0086 - Mo 27.04.20 11:27
Also immer wenn dann das letzte Telegramm das noch erkannt wird eintrifft sehe ich dann im Debugger das da ein Thread-Ende gemeldet wird.
Ich kann mein Programm weiter bedienen, es wird nur nichts mehr empfangen.
Aber wie könnte das zusammen hängen?
Th69 - Mo 27.04.20 11:49
Dann hast du wohl einen Fehler in deinem Thread. Bau mal einen Exception-Handler ein:
Handling Errors and Exceptions in Delphi Applications [
https://www.thoughtco.com/handling-errors-and-exceptions-1058212].
Du prüfst z.B. nicht die Länge vom zurückgegebenen String
received_value_rs485 (das Setzen der Größe vorher ist komplett sinnlos, denn die Prozedur
RS485.ReadNextClusterAsString erzeugt ja den String und gibt ihn zurück - und überschreibt damit den vorhandenen String in
received_value_rs485).
Und das Arbeiten mit dem Debugger solltest du auch lernen, denn dann würdest du solche Fehler selber schnell erkennen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!