AW: Exception während RS232 Datenempfang
Hallo Zusammen
In der Unit F_MainWindows, Zeile 100 ist die Typendeklaration : type //Record for new files, will occur when LParam = TH_NEWFILE, WParam will be PNewFileRecord PNewDataRecord = ^TNewDataRecord; TNewDataRecord = record ThreadID : Cardinal; Data : OptiNumericComm.TMeldung; DataLength : integer; end; Nur finde ich auf der Zeile 145: NewDataRecord^.DataLength := Length(receivedMessage); dann gibst Zeile 140: receivedMessage := commTest.receiveMessage; aber das CommTest ist nicht auffindbar.Was ist das ? Wo wird dem DAtaLength Wert zugewiesen ? Ich kenne mich zu wenig gut im Delphi, aber könnte das die Ursache sein für die Exception ? |
AW: Exception während RS232 Datenempfang
Hallo Anton,
Delphi-Quellcode:
Hier wird receivedMessage ein Array bzw. dessen Adresse zugewiesen.
receivedMessage := commTest.receiveMessage;
Die Größe des Array wird in recieveMessage festgelegt. Daher muss bei receiveMessage keine Arraylänge gesetzt werden. Ich denke nicht das der Fehler hier liegt. Wo werden denn die erzeugten records wieder freigegeben? Werden die eventuell an verschiedenen Stellen freigegeben? Grüße Klaus |
AW: Exception während RS232 Datenempfang
.. was möglich wäre..
receivedMessage ist eine lokale Variable. Hier wird dem NewDataRecord^.Data die Adresse, nicht der Inhalt, der receivedMessage zugewiesen. Am Ende der Methode wird die lokale Variable aufgeräumt. Die Adresse auf die NewDataRecord^.Data zeigt ist möglicherweise nicht mehr gültig bzw. überschrieben worden. Versuche mal ob es so besser wird:
Delphi-Quellcode:
Grüße
function ReciveDataCom( data : Pointer) : Integer;
var NewDataRecord : PNewDataRecord; SendDataRecord : PNewDataRecord; Done : Boolean; receivedMessage : OptiNumericComm.TMeldung; msg : tagMSG; begin if not commTest.initOptiNumericComm(COMPORT) then begin PostMessage( Form1.Handle, TH_MESSAGE, TH_ERROR, GetCurrentThreadID ); end; while not commTest.checkCommActive do begin end; PostMessage( Form1.Handle, TH_MESSAGE, TH_CONNECTED, GetCurrentThreadID ); Result := 0; Done := False; while not Done do begin Result := Result + 1; receivedMessage := commTest.receiveMessage; New(NewDataRecord); NewDataRecord^.ThreadID := GetCurrentThreadID; NewDataRecord^.DataLength := Length(receivedMessage); SetLenght(NewDataRecord^.Data, Length(receivedMessage)); move(receivedMessage, NewDataRecord^.Data, NewDataRecord^.DataLength); PostMessage( Form1.Handle, TH_MESSAGE, TH_DATAM, Integer(NewDataRecord)); //Done := True; if (receivedMessage[0] and $0F) = $06 then begin if PeekMessage(&msg, 0, 0, 0, PM_REMOVE) then begin case msg.wParam of TTH_SEND: begin SendDataRecord := PNewDataRecord(msg.lParam); commTest.transmitMessage(SendDataRecord.Data); end; end; end; end; end; //All done inform MainForm of ending PostMessage( Form1.Handle, TH_MESSAGE, TH_CLOSE, GetCurrentThreadID ); end; Klaus |
AW: Exception während RS232 Datenempfang
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Klaus
Vielen Dank für Dein Vorschlag, leider ist immer noch eine System-Exception da, aber eine andere. Siehe Beilage. Gruss Anton |
AW: Exception während RS232 Datenempfang
Hallo Anton,
tritt die "neue" Exception immer auf oder auch wieder nur sporadisch? Wenn immer stehen die Chancen zu debuggen nicht so schlecht. Grüße Klaus |
AW: Exception während RS232 Datenempfang
Hallo Klaus
Ja die trifft immer, aber wie kann ich es Debuggen, mit BP und Schrittweise ? oder gibt es andere Möglichkeit ? Mit BP und Schrittweise ist natürlich sehr mühsam, die CNC Verhängt sich dann da muss ich immer beides abschalten und dann neu starten. Gruss Anton |
AW: Exception während RS232 Datenempfang
.. im Aufruf Stack ist zu sehen, dass etwas beim System.Move
im Argen liegt. Was ich bisher bei SO gefunden habe: https://stackoverflow.com/questions/...lass-c00000005 bringt mich zurzeit noch nicht so richtig weiter. Grüße Klaus |
AW: Exception während RS232 Datenempfang
ersetze mal das move mit diesem:
Delphi-Quellcode:
Grüße
move(receivedMessage[0], NewDataRecord^.Data[0], NewDataRecord^.DataLength);
Klaus |
AW: Exception während RS232 Datenempfang
Hallo Klaus
Ich habe schrittweise Probiert Letzte BP1 wo noch kein Exc auftritt, beim BP 2 kommt EXc. bereits: Bp1> EditorForm := TForm2.Create(self); with EditorForm do begin BorderIcons := []; BorderStyle := bsNone; parent := TabSheet1; Align := alClient; Visible := true; end; BP2 RefAnfForm := TForm5.Create(self); with RefAnfForm do begin BorderIcons := []; BorderStyle := bsNone; parent := TabSheet9; Align := alClient; Visible := true; end; Ich verstehe sowieso nicht warum wird Form1 create, es ist jetzt Betriebswahl(BW)auf Manuell d.h es musste nur die Form11 kreiert werden. Die Information über BW stellung ist in der Status Meldung M6: Byte1, ZBETR., Manuelstellung ZBETR =08, aber es sind auch Stellungen 07,06,05,04 möglich ebenfalls für Form11. Gruss Anton |
AW: Exception während RS232 Datenempfang
Hallo Klaus
die move zeile habe ich geändert, exzeption kommt, aber wenn ich fortsetzen drücke, kommt kurzzeitig das menu MAN jedoch verschwindet es wieder , vermutlich wenn ein Status oder Istwert Meldung kommt. dabei erscheint im MAN Menue die Meldung mit "ungültige Zeigeroperation" Die CNC sendet ja andauernd weitere Meldungen: CNCstatus, AchsenStatus, Istwerte. Könnte das sein, das die Meldungen von der CNC gar nicht so schnell verarbeitet werden können ? Gruss Anton |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:21 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