Autor Beitrag
daywalker0086
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Do 23.04.20 10:50 
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...
ausblenden volle Höhe 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);
  //NT_Timeout.Enabled:= false;
  //ComPort1.ReadStr(s_received, Count);
  received_value_rs485:= RS485.ReadNextClusterAsString;
 // if ((received_value_rs485 = hexsend('C000E8E8')) or (received_value_rs485 = hexsend('80004343')) or (received_value_rs485 = hexsend('8000E8E8')) ) and (programmingstate = 0) then
 // begin
 //   RS485.SendString(hexsend('81002525'));
 //   memo1.Lines.Add( '>> 81002525');
 //   LED_Mon_Status:= 0;
 // end;
  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  // Auto taste gedrückt
    bytes_send[0] := 193
    else
    bytes_send[0] := (LED_Mon_Status and not 64or 128;
    bytes_send[1] := LED_Mon_Status shr 6;
    bytes_send[2] := 36;
    bytes_send[3] := (bytes_send[0xor 36 xor byte1) and not 128;

   // RS485.SendString(inttostr(byte0+0+24+(byte0 xor 24)));
   sendstring:= inttostr(bytes_send[0]);
  //  RS485.SendString(sendstring);
  end;
{   s := received_value_rs485;      // Den ersten Text auslesen
    len := length(received_value_rs485);    // die Länge des Textes auslesen

    if RS485_Buffer.Write(len, SizeOf(len)) = -1 then // Die Länge des Textes speichern
      raise Exception.Create('Fehler beim Schreiben - Puffer zu klein');
    if RS485_Buffer.Write(s[1], len) = -1 then        // Den Text an sich speichern
      raise Exception.Create('Fehler beim Schreiben - Puffer zu klein');    }

  //memo1.Lines.Add( StringToHexStr(received_value_rs485));
 // RS485_Timer1.Enabled:= false;
 // memo1.Lines.Add( 'LED: '+inttostr(LED_Mon_Status));
  memo1.Lines.Add( 'Button: '+inttostr(Button_Mon_Status));
end;
icho2099
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 101
Erhaltene Danke: 12

WIN XP, WIN 7, WIN 10
Delphi 6 Prof, Delphi 2005, FPC
BeitragVerfasst: Fr 24.04.20 06:21 
verwende einen Potentialausgleich zwischen den Teilnehmern.
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Sa 25.04.20 22: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mo 27.04.20 08:13 
Ich mus das Programm neu starten, danach läuft die Kommunikation wieder.
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243


Delphi 2005 Architect
BeitragVerfasst: Mo 27.04.20 10: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4791
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 27.04.20 10:49 
Dann hast du wohl einen Fehler in deinem Thread. Bau mal einen Exception-Handler ein: Handling Errors and Exceptions in Delphi Applications.

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.