Seriellen Port via USB nutzen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Ich wuerde dir mit Nachdruck raten, das Projekt hier https://github.com/neosilviu/hass_inverter ans Laufen zu bekommen. Du hast recht offensichtlich grosse Schwierigkeiten mit C, und dich hier mit einem Einzelzeilen-Coaching zu einem lauffaehigen Programm zu bringen, dauert zu lange und ist frustrierend. Und es kurz selbst schreiben geht ohne vorliegenden Inverter nicht wirklich.

    Mit dem Projekt hingegen bekommst du MQTT publishing, und damit hast du einen schicken, standardisierten Weg, die Daten ganz ohne Programmierung weiter zu verarbeiten.

  • Moin Hanson Garibaldi,

    naja, 2400Baud ist zwar nicht schnell, aber ein Bit sind ca.: 417 µS. Ein Byte mit Start und Stopbit sind 10 Bit.

    Das read() beendet das Einlesen mit dem Stopbit. Das nächste Startbit kommt aber schon in 417µS. Da ist dein Programm wahrscheinlich noch unterwegs um die Auswertung vorzunehmen.

    Da kein IRQ genutzt wird, solltest du die Read-Schleife so schnell machen, das kein Startbit verpasst wird.


    So, kleiner Ausflug in die alte V24-technik.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Bernd666 das stimmt nicht. Die Auswertung ist im Verhältnis zu den gehäuften Systemaufrufen durch einzelne Bytes einlesen vollkommen vernachlässigbar. Da dauert jeder locker 50uS, in der Zeit vergleichst du bei ~1ns/Instruktion bei 1GHz Kilobytes. Bei deinen 4ms für 10Bit dann also erst recht egal.

    Und selbst mit diesem (aus code Sicht simpleren) Byte-weisen Ansatz spielt das keine Rolle. Es müssen hier auch keine Bits erwischt werden, der UART des Pi macht das selbsttätig und meldet per IRQ durchaus an den Kernel, dass da was passiert. Die Bytes werden dann da gepuffert.

    Der Fehler hier ist ein Logikfehler. Der aber ob des sehr verschwurbelten und nur in Teilen vorliegenden Codes schwer zu finden ist.

    Der richtige Ansatz ist hier https://github.com/neosilviu/hass…/skymax.cpp#L94 zu sehen. Offensichtlich ist das Protokoll per CR abgeschlossen. Womit man einfach solange liest, bis das empfangen wurde. Und den buffer danach weiter verarbeitet. Statt alles in einen grossen Klumpatsch zu wandeln.

    2 Mal editiert, zuletzt von MistyFlower59469 (16. November 2020 um 22:54)

  • Moin Hanson Garibaldi,

    danke für die Rückmeldung.

    Dann, bitte, dein Thema noch als erledigt markieren. Das geht oben bei "Thema bearbeiten".

    Viel Spaß und bleib gesund.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Geht klar. Ihr ebenso.

    Hier noch der Code (aufbauend auf den zuvor verlinkten Code-Beispielen) mit dem ich nach Invertern suche, die über USB (hidraw) verbunden sind und deren ID auslese. Der Sinn dahinter ist, dass man für ein 3-Phasiges Netz min. 3 Inverter parallel schalten muss. Diese wollen natürlich alle ausgelesen werden. Eine Erweiterung der Suche nach ttyUSBx, ist trivial denke ich. Sicher der Programmierstil ist bestimmt nicht der edelste, aber ersollte einigermaßen nachvollziehbar sein. Nochmals vielen Dank und bis zum nächsten Erkenntnis-Event :bravo2:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!