Unit Serial und ESP8266

wennerer
Beiträge: 631
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Unit Serial und ESP8266

Beitrag von wennerer »

Hallo,
ja in Linux. Ich habe eben hier viewtopic.php?f=65&t=17187 meine Vorgehensweise hochgeladen. Ich denke in einem eigenen Beitrag wird es besser gefunden.

Viele Grüße
Bernd

wennerer
Beiträge: 631
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Unit Serial und ESP8266

Beitrag von wennerer »

Hallo,
ich kämpfe noch immer mit der Verbindung zum ESP. Mit meinem Programm kann ich nur Daten empfangen wenn ich vorher mit CuteCom auf den ESP8266 zugegriffen habe. Also Esp anstecken, mein Programm öffnen, keine Fehlermeldung aber auch keine Ausgabe von "Mein erstes writeln". Einmal kurz mit CuteCom verbunden. Dann wieder mit meinem Programm, alles läuft wie es soll. Ich denke mir fehlt da am Anfang noch irgend etwas um alles anzustossen. Kann mir da jemand weiter helfen?

Hier nochmal der Code:

Code: Alles auswählen

program SynaserTest;

{$mode objfpc}{$H+}

uses
  Classes,SysUtils,Synaser,Crt;

 procedure ReadMyESP8266;
  var
    ser: TBlockSerial;
    Value: string;
  begin
    ser:=TBlockSerial.Create;
    try
      ser.Connect('/dev/ttyUSB0');
      Sleep(1000);
      ser.config(74880,8, 'N', SB1, False, False);
      Write('Device: ' + ser.Device + '   Status: ' + ser.LastErrorDesc +' '+
      Inttostr(ser.LastError));
      Sleep(1000);
      repeat
        Value := ser.RecvString(1000);
        if Value <> '' then
         writeln(Value);
      until keypressed;
    finally
      Writeln('Serial Port will be freed...');
      ser.free;
      Writeln('Serial Port was freed successfully!');
    end;
  end;

  begin
   ReadMyESP8266;
  end.
Viele Grüße
Bernd

schoschy
Beiträge: 59
Registriert: Di 18. Okt 2022, 15:46

Re: Unit Serial und ESP8266

Beitrag von schoschy »

ich hab mal eben bei mir über eine unit geschaut:

Code: Alles auswählen

    ....
    SoftFlow := False;
    HardFlow := False;

    ComPort1.Config(BaudRate, DataSize, Parity, Stopbits, SoftFlow, HardFlow);
    Sleep(200);

    (* Datenempfang starten *)
    ComPort1.RTS := True;
    ComPort1.DTR := True;
    Timer1.Enabled := True;    
mir fällt noch LinuxLock ein, ist per default auf true, sollte aber nicht das problem sein.

wennerer
Beiträge: 631
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Unit Serial und ESP8266

Beitrag von wennerer »

Hallo Schoschy,
danke für deine Antwort. Hat leider auch nicht geholfen. Aber ich hab mich dann an af0815 erinnert der mich vor der Baudrate gewarnt hat. Ich hab jetzt ein Programm mit 9600 Baud (mit der Arduino IDE) drauf gespielt und siehe da es klappt alles ohne Probleme.
Dazu hätte ich dann noch eine Frage. In den Beispielen von ccrause wird die Baudrate so festgelegt:

Code: Alles auswählen

uart_cfg.baud_rate  := (115200*40) div 26;
Wenn ich das Ausrechne kommt bei mir 177230 heraus. Damit ich in CuteCom was Empfange muss ich 74880 Baud einstellen. Warum? Und wie stelle ich da 9600 ein?

Viele Grüße
Bernd

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6887
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Unit Serial und ESP8266

Beitrag von af0815 »

Vielleicht hier etwas mehr Erklärung https://ullisroboterseite.de/esp8266-faq.html
if the frequency of the crystal oscillator is 26 MHz, then the baud rate for printing is 74880
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wennerer
Beiträge: 631
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Unit Serial und ESP8266

Beitrag von wennerer »

Vielen Dank für den Link. Da muss ich wohl noch etwas stöbern und denken :D

Viele Grüße
Bernd

wennerer
Beiträge: 631
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Unit Serial und ESP8266

Beitrag von wennerer »

Hallo,
also ich habe mich etwas eingelesen. Der Bootloader vom node mcu ESP8266 verwendet eine Baudrate von 74880.
Im Beispiel von ccrause wird (115200*40) div 26 verwendet. Müsste es nicht (115200*26) div 40 heißen. Dann kommt nämlich 74880 heraus. Soweit so gut gebe ich 74880 ein (oder 9600) funktioniert es auch nicht. Ich sehe die Meldungen nur während des Bootvorgangs solange ich in CuteCom 74880 eingebe, gebe ich 9600 ein kommt nur Mist.

So jetzt hab ich 115200 als Baudrate gesetzt und in CuteCom 74880 eingegeben und habe eine funktionierende Ausgabe. Ich verstehe nicht was da passiert!
Mein Test-Programm (von der Github Seite von ccrause):

Code: Alles auswählen

program testuart;

uses
  freertos, task, portmacro, uart, esp_err;

procedure sleep(Milliseconds: cardinal);  // Should be in SysUtils but including it causes an error in ESP32
begin
  vTaskDelay(Milliseconds div portTICK_PERIOD_MS);
end;

const
{$ifdef FPC_MCU_ESP32}
  UART_PORT = 1;
  TX1_PIN = 19;
  RX1_PIN = 18;
{$else}
  // Use UART1 on GPIO2 / D4
  UART_PORT: Tuart_port = UART_NUM_0;

  // ESP8266 only have fixed pin assignments
{$endif}
  msg = 'UART test message'#13#10;

var
  uart_cfg: Tuart_config;

begin
{$ifdef FPC_MCU_ESP32}
  uart_cfg.baud_rate  := 115200;
{$else}
  // On my esp8266 board the baud rate is low by a factor 26/40
  // Adjust baud rate specified to get to the actual desired baud:

  uart_cfg.baud_rate  := 115200;//(115200*40) div 26;
{$endif}
  uart_cfg.data_bits  := UART_DATA_8_BITS;
  uart_cfg.parity     := UART_PARITY_DISABLE;
  uart_cfg.stop_bits  := UART_STOP_BITS_1;
  uart_cfg.flow_ctrl  := UART_HW_FLOWCTRL_DISABLE;
{$ifdef FPC_MCU_ESP32}
  uart_cfg.source_clk := UART_SCLK_APB;
{$endif}

{$ifdef FPC_MCU_ESP32}
  EspErrorCheck(uart_driver_install(UART_PORT, 1024, 0, 0, nil, 0));
  EspErrorCheck(uart_param_config(UART_PORT, @uart_cfg));
  EspErrorCheck(uart_set_pin(UART_PORT, TX1_PIN, RX1_PIN,
    UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
{$else}
  EspErrorCheck(uart_param_config(UART_PORT, @uart_cfg));
  EspErrorCheck(uart_driver_install(UART_PORT, 256, 0, 0, nil, 0));

{$endif}

  repeat
    writeln('Standard output');
    uart_write_bytes(UART_PORT, @msg[1], length(msg));
    sleep(1000);
  until false;
end.
CuteCom Ausgabe:
CuteCom.png
CuteCom.png (194.69 KiB) 1990 mal betrachtet
Viele Grüße
Bernd

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6887
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Unit Serial und ESP8266

Beitrag von af0815 »

Hast du eine 26MHz oder 40MHz Type ? Es dürfte laut den Beschreibungen beide geben. Und beim Boot wird immer mit 74880 gearbeitet, erst beim Benutzer Programm kann man den UART umstellen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wennerer
Beiträge: 631
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Unit Serial und ESP8266

Beitrag von wennerer »

Also in der Arduino IDE wird mir 26Mhz angezeigt:
26mhz.bmp
26mhz.bmp (122.22 KiB) 1953 mal betrachtet
Falls das interessant ist, die CPU ist auf 80Mhz eingestellt.

Wenn ich mit der Arduino IDE diesen Sketch lade sehe ich in CuteCom (mit 9600Baud) keine Ausgabe des Bootloaders aber die Ausgabe vom Programm ist sichtbar.

Code: Alles auswählen

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:
Serial.println("Hello World with 9600 Buad");
delay(1000);
}
Und beim Boot wird immer mit 74880 gearbeitet, erst beim Benutzer Programm kann man den UART umstellen.
Bleibt bei mir die Frage wie stelle ich den UART um und warum funktioniert die Kombination uart_cfg.baud_rate := 115200; mit der Einstellung 74880 in CuteCom.

Viele Grüße
Bernd

wennerer
Beiträge: 631
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Unit Serial und ESP8266

Beitrag von wennerer »

Jetzt geht's!!!
Ich hab den ESP mal in der Arduino IDE mit vorher löschen beschrieben und dann in Lazarus mit:

Code: Alles auswählen

uart_cfg.baud_rate  := (9600*40) div 26;
neu geflasht.

Wenn ich 9600 so eingebe bekomme ich in CuteCom auch bei 9600Baud eine korrekte Ausgabe! Den Bootloadertext sehe ich natürlich nicht.

Viele Grüße
Bernd

wennerer
Beiträge: 631
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Unit Serial und ESP8266

Beitrag von wennerer »

Hallo zusammen,
ein Grund warum ich mit der Einstellung der Baudrate so Probleme hatte/habe ist das scheinbar Linux 74880 nicht so ohne weiteres unterstützt. Ich habe nun gemerkt das auch Synaser die Baudrate 74880 nicht unterstützt. Ich kann es zwar eingeben und es kommt kein Fehler aber es bleibt die zuletzt eingestellte Baudrate aktive.
Kennt jemand eine Möglichkeit unter Linux eine benutzerdefinierte Baudrate einzustellen?

Viele Grüße
Bernd

PS: die Standart Baudraten gehen alle. Ist also nur ein kleines Problemchen.

Mathias
Beiträge: 6989
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Unit Serial und ESP8266

Beitrag von Mathias »

Ich habe nun gemerkt das auch Synaser die Baudrate 74880 nicht unterstützt. Ich kann es zwar eingeben und es kommt kein Fehler aber es bleibt die zuletzt eingestellte Baudrate aktive.
Ich denke das ist Abhängig von Controller den du hast. Mit so Pseudo UART konnte ich bis 2'00'000 hoch. Dies war so viel ich weis beim Arduino Uno.
Dann gibt es auch Controller wie bei Arduino Leonardo, das speilt es keine Rolle was man angibt, der Speed ist immer gleich.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wennerer
Beiträge: 631
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Unit Serial und ESP8266

Beitrag von wennerer »

Hallo Matthias,
danke für deine Antwort. Mit Pseudo Uart meinst du wahrscheinlich die Pins selber zu programmieren um damit eine Schnittstelle selber nach zu bauen. Ich habe so was schon in deinem Code gesehen.
Was ich momentan suche ist eigentlich nur eine Möglichkeit unter Linux die 74880 einstellen zu können. Geb ich ins Terminal

Code: Alles auswählen

stty -F /dev/ttyUSB0 74880
ein passiert folgendes:
stty.png
stty.png (23.4 KiB) 192 mal betrachtet
Linux und auch Synaser unterstützten standartmäßig diesen Baudwert nicht. Programme wie CuteCom können das aber. Mich würde interessieren wie die das machen.
Eventuell hat jemand noch ein paar gute Links zum Nachlesen. Alles was ich bis jetzt gefunden habe, habe ich entweder nicht verstanden oder es hat nicht funktioniert.

Viele GRüße
Bernd

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6887
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Unit Serial und ESP8266

Beitrag von af0815 »

wennerer hat geschrieben: Mi 30. Jul 2025, 06:40 Linux und auch Synaser unterstützten standartmäßig diesen Baudwert nicht. Programme wie CuteCom können das aber. Mich würde interessieren wie die das machen.
Eventuell hat jemand noch ein paar gute Links zum Nachlesen. Alles was ich bis jetzt gefunden habe, habe ich entweder nicht verstanden oder es hat nicht funktioniert.
Man kann sich im Paket laz_synapse mal synaser.pas ansehen. Dort wird bei Linux im Bereich der Zeile 1660 die Baudrate kontrolliert (TermiosToDcb), ob die mit den vorgegeben Werten zusammenpasst. Ich gehe davon aus, wenn man dort ansetzt kann man die krummen Werte auch rein bringen. Wenn es CuteCom zusammenbringt, so geht das auch mit Synaser.
Weil es wird ein Device Control Block (DCB) erstellt bzw. parametriert und dem System per ioctl übergeben. Siehe auch https://man7.org/linux/man-pages/man2/ioctl.2.html , also kein Hexenwerk, das wird das CuteCom auch so machen. Also wenn es dort geht, geht es hier auch, man m,uss nur die Checks adaptieren (oder übergehen).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten