Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Projekt hat exception-klasse external:sigsev ausgelöst (https://www.delphipraxis.net/216640-projekt-hat-exception-klasse-external-sigsev-ausgeloest.html)

lilmnm 2. Feb 2025 12:39

Projekt hat exception-klasse external:sigsev ausgelöst
 
Hallo liebe Community,

Ich bin gerade dabei ein Programm zu schreiben, welches einen Text an einen Ardunio über einen Com-Port weiterleitet. Jedoch bin ich auf den bereits in diesem Forum thematisierten SIGSEV-Fehler gestoßen (Zeile 65). Ich komme nicht weiter und würde mich über eine Antwort freuen. Hier der Code:
Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Spin, synaser;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ButtonConnect: TButton;
    ButtonSend: TButton;
    ComboBox1: TComboBox;
    ComboBoxPorts: TComboBox;
    Edit1: TEdit;
    EditTextToSend: TEdit;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    GroupBoxConnection: TGroupBox;
    GroupBoxSend: TGroupBox;
    LabelTextToSend: TLabel;
    Memo1: TMemo;
    MemoLog: TMemo;
    procedure ButtonConnectClick(Sender: TObject);
    procedure ButtonSendClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  connection1: TBlockSerial;     // Globale Variable für die serielle Verbindung
  connected: boolean;            // Verbindungsstatus
  port: string;                  // Gewählter Port

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var
  portNames: string;
  i: integer;
begin
  // Liste der verfügbaren seriellen Ports abrufen
  portNames := getSerialPortNames;
  port := '';
  for i := 1 to Length(portNames) do
  begin
    if portNames[i] = ',' then
    begin
      ComboBoxPorts.Items.Add(port); //  :!::!::!: [COLOR="Lime"]hier sitzt das Problem[/COLOR]
      port := '';
    end
    else
      port := port + portNames[i];
  end;
  ComboBoxPorts.Items.Add(port);
  ComboBoxPorts.Text := 'Wähle Port';
  connected := False;
end;

procedure TForm1.ButtonConnectClick(Sender: TObject);
begin
  if connected then
  begin
    // Verbindung trennen
    connection1.CloseSocket;
    connection1.Free;
    connected := False;
    MemoLog.Lines.Add('Verbindung mit ' + port + ' getrennt.');
    ButtonConnect.Caption := 'Verbinden';
    ComboBoxPorts.Enabled := True;
  end
  else
  begin
    if ComboBoxPorts.ItemIndex <> -1 then
    begin
      port := ComboBoxPorts.Text;
      // Verbindung erstellen
      connection1 := TBlockSerial.Create;
      connection1.Connect(port);
      connection1.Config(9600, 8, 'N', SB1, False, False);
      MemoLog.Lines.Add('Verbunden mit Port: ' + port);
      connected := True;
      ButtonConnect.Caption := 'Trennen';
      ComboBoxPorts.Enabled := False;
    end
    else
      ShowMessage('Bitte wählen Sie einen Port aus.');
  end;
end;

procedure TForm1.ButtonSendClick(Sender: TObject);
var
  textToSend: string;
begin
  if connected then
  begin
    textToSend := edit1.text;
    if textToSend <> '' then
    begin
      // Text senden
      connection1.SendString(textToSend + #13#10); // Senden mit Zeilenumbruch
      MemoLog.Lines.Add('Gesendeter Text: ' + textToSend);
    end
    else
      ShowMessage('Bitte geben Sie einen Text ein, der gesendet werden soll.');
  end
  else
    ShowMessage('Es besteht keine Verbindung.');
end;

end.
end; ;

procedure TForm1.ButtonConnectClick(Sender: TObject);
begin
  if connected then
  begin
    // Verbindung trennen
    connection1.CloseSocket;
    connection1.Free;
    connected := False;
    MemoLog.Lines.Add('Verbindung mit ' + port + ' getrennt.');
    ButtonConnect.Caption := 'Verbinden';
    ComboBoxPorts.Enabled := True;
  end
  else
  begin
    if ComboBoxPorts.ItemIndex <> -1 then
    begin
      port := ComboBoxPorts.Text;
      // Verbindung erstellen
      connection1 := TBlockSerial.Create;
      connection1.Connect(port);
      connection1.Config(9600, 8, 'N', SB1, False, False);
      MemoLog.Lines.Add('Verbunden mit Port: ' + port);
      connected := True;
      ButtonConnect.Caption := 'Trennen';
      ComboBoxPorts.Enabled := False;
    end
    else
      ShowMessage('Bitte wählen Sie einen Port aus.');
  end;
end;

procedure TForm1.ButtonSendClick(Sender: TObject);
var
  textToSend: string;
begin
  if connected then
  begin
    textToSend := edit1.text;
    if textToSend <> '' then
    begin
      // Text senden
      connection1.SendString(textToSend + #13#10); // Senden mit Zeilenumbruch
      MemoLog.Lines.Add('Gesendeter Text: ' + textToSend);
    end
    else
      ShowMessage('Bitte geben Sie einen Text ein, der gesendet werden soll.');
  end
  else
    ShowMessage('Es besteht keine Verbindung.');
end;

end.
end;

haentschman 2. Feb 2025 15:17

AW: Projekt hat exception-klasse external:sigsev ausgelöst
 
Willkommen hier...:dp:

Zum Thema kann ich nur raten weil ich die FPC Komponente nicht kenne...

Aber:
Delphi-Quellcode:
portNames := getSerialPortNames;
port := '';
for i := 1 to Length(portNames) do
begin
  if portNames[i] = ',' then
  begin
    ComboBoxPorts.Items.Add(port); // hier sitzt das Problem
    port := '';
  end
Du weist in der Schleife der port Variable vor dem .Add keinen Wert aus der Liste portNames zu. port ist immer ''. Das sollte den Fehler eigentlich nicht auslösen, es sei denn die ComboBox ist nicht initialisiert. (Hörensagen aus Google mit SIGSEV...) .Items.Add() kann mit '' umgehen.
Wie sieht denn der Inhalt von portNames aus?
PS: wo ist getSerialPortNames deklariert und implementiert?

PS: Bitte setze den Quellcode in die Delphi Tags. Der Knopf mit dem Delphi Helm im Editor. :zwinker:

jaenicke 2. Feb 2025 22:00

AW: Projekt hat exception-klasse external:sigsev ausgelöst
 
Zitat:

Zitat von lilmnm (Beitrag 1545857)
Delphi-Quellcode:
[..]
  // Liste der verfügbaren seriellen Ports abrufen
  portNames := getSerialPortNames;
  port := '';
  for i := 1 to Length(portNames) do
  begin
    if portNames[i] = ',' then
[..]

Meinst du vielleicht das?
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBoxPorts.Items.CommaText := GetSerialPortNames;
  connected := False;
end;
Zitat:

Zitat von haentschman (Beitrag 1545860)
PS: wo ist getSerialPortNames deklariert und implementiert?

Das ist in Lazarus bzw. Synapse eine Funktion aus der Unit synaser, die er auch eingebunden hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:03 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 by Thomas Breitkreuz