Forum > Linux

utf8 failure while receive RS232

(1/2) > >>

coradi:
I try to read UART /RS232, it receive Data but i see only many messages of

project1:3710): Gtk-CRITICAL **: 21:59:31.829: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed

(project1:3710): Gtk-CRITICAL **: 21:59:31.837: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed

(project1:3710): Gtk-CRITICAL **: 21:59:31.845: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed

(project1:3710): Gtk-CRITICAL **: 21:59:31.855: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed

(project1:3710): Gtk-CRITICAL **: 21:59:31.861: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed



--- Code: ---unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    ButtonStart: TButton;
    Memo1: TMemo;
    Timer1: TTimer;
    procedure ButtonStartClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
    FSerialFile: Text;
    FPortOpen: Boolean;
    FDevice: string;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

procedure TForm1.ButtonStartClick(Sender: TObject);
begin
  FDevice := '/dev/ttyUSB0';

  // Seriellen Port öffnen
  AssignFile(FSerialFile, FDevice);
  {$I-}
  Reset(FSerialFile);
  {$I+}
  if IOResult <> 0 then
  begin
    ShowMessage('Fehler: Konnte ' + FDevice + ' nicht öffnen.');
    Exit;
  end;

  FPortOpen := True;
  Timer1.Interval := 100;  // 100 ms Intervall
  Timer1.Enabled := True;

  Memo1.Lines.Add('Port ' + FDevice + ' geöffnet, lese kontinuierlich...');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Line: string;
begin
  if FPortOpen then
  begin
    {$I-}
    while not Eof(FSerialFile) do
    begin
      ReadLn(FSerialFile, Line);
      Memo1.Lines.Add(Line);
      Memo1.SelStart := Memo1.GetTextLen;  // automatisch nach unten scrollen
    end;
    {$I+}
    if IOResult <> 0 then
    begin
      Memo1.Lines.Add('Fehler beim Lesen.');
      Timer1.Enabled := False;
      FPortOpen := False;
      CloseFile(FSerialFile);
    end;
  end;
end;

end.


--- End code ---

coradi:
ok, Chatgpt helped me, now I have this
"Memo1.Lines.Add(MakePrintable(Line)); "

Functio MakePrintable

--- Code: ---function MakePrintable(const S: string): string;
var
  i: Integer;
begin
  Result := '';
  for i := 1 to Length(S) do
    if S[i] in [#32..#126, #10, #13] then
      Result := Result + S[i]
    else
      Result := Result + '.'; // nicht druckbare Zeichen durch Punkt ersetzen
end;

--- End code ---


--- Code: ---unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    ButtonStart: TButton;
    Memo1: TMemo;
    Timer1: TTimer;
    procedure ButtonStartClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
    FSerialFile: Text;
    FPortOpen: Boolean;
    FDevice: string;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

function MakePrintable(const S: string): string;
var
  i: Integer;
begin
  Result := '';
  for i := 1 to Length(S) do
    if S[i] in [#32..#126, #10, #13] then
      Result := Result + S[i]
    else
      Result := Result + '.'; // nicht druckbare Zeichen durch Punkt ersetzen
end;

procedure TForm1.ButtonStartClick(Sender: TObject);
begin
  FDevice := '/dev/ttyUSB0';

  // Seriellen Port öffnen
  AssignFile(FSerialFile, FDevice);
  {$I-}
  Reset(FSerialFile);
  {$I+}
  if IOResult <> 0 then
  begin
    ShowMessage('Fehler: Konnte ' + FDevice + ' nicht öffnen.');
    Exit;
  end;

  FPortOpen := True;
  Timer1.Interval := 100;  // 100 ms Intervall
  Timer1.Enabled := True;

  Memo1.Lines.Add('Port ' + FDevice + ' geöffnet, lese kontinuierlich...');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Line: string;
begin
  if FPortOpen then
  begin
    {$I-}
    while not Eof(FSerialFile) do
    begin
      ReadLn(FSerialFile, Line);
      Memo1.Lines.Add(MakePrintable(Line));
      //Memo1.Lines.Add(Line);
      Memo1.SelStart := Memo1.GetTextLen;  // automatisch nach unten scrollen
    end;
    {$I+}
    if IOResult <> 0 then
    begin
      Memo1.Lines.Add('Fehler beim Lesen.');
      Timer1.Enabled := False;
      FPortOpen := False;
      CloseFile(FSerialFile);
    end;
  end;
end;

end.

--- End code ---

the RS232 is reading and blinking, but I didn't see anything on the screen?!
Console Outut is empty too

coradi:
ah ok, it is the missin/0 from RS232 ..now I have to see how this works..
In C it worked on first try, but I am a bigger Idiot in C then ic PAscal....

coradi:
I see nothing:-(
RX LED is blinking but I got nothing in console outoput

--- Code: ---unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
  DateUtils, BaseUnix;

type
  TForm1 = class(TForm)
    ButtonStart: TButton;
    Memo1: TMemo;
    Timer1: TTimer;
    procedure ButtonStartClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    FSerialHandle: LongInt;
    FPortOpen: Boolean;
    FDevice: string;
    DataBuffer: string;
    LastReceiveTime: TDateTime;
    procedure OpenSerialPort;
    procedure CloseSerialPort;
    function HexASCII(const S: string): string;
  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ Wandelt alle Bytes in ASCII-Punkte + Hex-Darstellung um }
function TForm1.HexASCII(const S: string): string;
var
  i: Integer;
begin
  Result := '';
  for i := 1 to Length(S) do
  begin
    if S[i] in [#32..#126] then
      Result := Result + S[i]
    else
      Result := Result + '.';
    Result := Result + ' (' + IntToHex(Ord(S[i]),2) + ') ';
  end;
end;

{ Button: Port starten oder stoppen }
procedure TForm1.ButtonStartClick(Sender: TObject);
begin
  if not FPortOpen then
    OpenSerialPort
  else
    CloseSerialPort;
end;

{ Öffnet den seriellen Port }
procedure TForm1.OpenSerialPort;
begin
  FDevice := '/dev/ttyUSB0';

  FSerialHandle := fpOpen(FDevice, O_RDONLY or O_NONBLOCK);
  if FSerialHandle < 0 then
  begin
    ShowMessage('Fehler: Konnte ' + FDevice + ' nicht öffnen.');
    Exit;
  end;

  FPortOpen := True;
  Timer1.Enabled := True;
  DataBuffer := '';
  LastReceiveTime := Now;
  ButtonStart.Caption := 'Stoppen';
  Memo1.Lines.Add('Port ' + FDevice + ' geöffnet.');
end;

{ Schließt den seriellen Port }
procedure TForm1.CloseSerialPort;
begin
  if FPortOpen then
  begin
    Timer1.Enabled := False;
    fpClose(FSerialHandle);
    FPortOpen := False;
    ButtonStart.Caption := 'Starten';
    Memo1.Lines.Add('Port geschlossen.');
  end;
end;

{ Timer: kontinuierliches Lesen mit Timeout }
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Buf: array[0..255] of Char;
  NumRead: LongInt;
  BufString: string;
  TimeoutMS: Integer = 100; // Pause = Ende der Nachricht
begin
  if not FPortOpen then Exit;

  NumRead := fpRead(FSerialHandle, Buf, SizeOf(Buf));
  if NumRead > 0 then
  begin
    SetString(BufString, Buf, NumRead);
    DataBuffer := DataBuffer + BufString;
    LastReceiveTime := Now;
  end;

  // Prüfen, ob seit letztem Byte > TimeoutMS vergangen ist
  if (DataBuffer <> '') and (MilliSecondsBetween(Now, LastReceiveTime) > TimeoutMS) then
  begin
    Memo1.Lines.Add(HexASCII(DataBuffer));
    Memo1.SelStart := Memo1.GetTextLen; // automatisch scrollen
    DataBuffer := ''; // Puffer leeren
  end;
end;

end.

                     

--- End code ---

coradi:
If it try this

--- Code: --- if (DataBuffer <> '') and (MilliSecondsBetween(Now, LastReceiveTime) > TimeoutMS) then
  begin
    databuffer := '123';
    Memo1.Lines.Add(HexASCII(DataBuffer));
    Memo1.SelStart := Memo1.GetTextLen; // automatisch scrollen
    DataBuffer := ''; // Puffer leeren   
[code]}
Nothing happend in Memo Windwos odr console output
--- End code ---

Navigation

[0] Message Index

[#] Next page

Go to full version