Forum > Linux
utf8 failure while receive RS232
coradi:
I try to read UART /RS232, it receive Data but i see only many messages of
project1:3710): Gtk-[1;35mCRITICAL[0m **: [34m21:59:31.829[0m: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed
(project1:3710): Gtk-[1;35mCRITICAL[0m **: [34m21:59:31.837[0m: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed
(project1:3710): Gtk-[1;35mCRITICAL[0m **: [34m21:59:31.845[0m: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed
(project1:3710): Gtk-[1;35mCRITICAL[0m **: [34m21:59:31.855[0m: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed
(project1:3710): Gtk-[1;35mCRITICAL[0m **: [34m21:59:31.861[0m: 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