Seriellen Port via USB nutzen

  • Dieses Protokoll scheinen ziemlich viele Inverter zu nutzen. Das gleiche habe ich auch von dem Hersteller meines Inverters bekommen.

    Aus dem Quellcode kann ich leider nicht herauslesen, wie die Schnittstelle funktioniert. Das Programm scheint erst ab dem Rpi 2 zu laufen. Hab aber einen Pi 1B. Mich würde interessieren, ob das dann auch mit USB funktioniert oder ob man an die Pins der seriellen Schnittstelle ran muss.

    Das mit dem HIDRAW höre ich ehrlich gesagt zum ersten Mal, muss ich gestehen. :conf: Ich war mir eigentlich ziemlich sicher, dass es eine serielle Kommunikation ist.

  • Ok

    ich will meinen aktuellen Erkenntnisstand mal zusammenfassen.

    - Im Solarwechselrichter ist ein USB-Sreial-Adapter verbaut, der vom Raspberry nicht als das erkannt wird was er ist.

    - Offensichtlich ist es auch trotz intensiver Unterstützung ( vielen Dank an __deets__ ) nicht möglich den Raspberry dazu zu bewegen den Adapter von Cypress als USB-Serial-Adapter zu erkennen und als ttyUSB0 o.ä. zu verbinden.

    - es gibt bereits ein Programm, dass im Prinzip genau das macht was ich vorhabe, aber erst ab dem Pi2 läuft.

    - das von __deets__ verlinkte zweite code-Beispiel könnte auf einem Pi1 laufen - aber ist das überhaupt ein vollständig lauffähiges Programm? Fehlt da nicht ein " int main"?

    - außerdem ist mir an der Stelle unklar, wie die Schnittstelle realisiert wird USB-Serial oder direkt an die TX/RX Pins?

    Ich hoffe ich habe nichts übersehen/ überlesen

  • Das ist eine von mehreren Quelldateien. Darum ist da kein Main. Und es funktioniert genau mit der Hardware die du hast.

  • ich will meinen aktuellen Erkenntnisstand mal zusammenfassen.

    ....

    Ich hoffe ich habe nichts übersehen/ überlesen

    Du hast recht viel nicht verstanden, oder missinterpretiert.

    Der im Wechselrichter verbaute USB -> RS232 Converter (USB-Slave) meldet sich als ID 0655:5161, woraufhin der Pi (USB Master) in seiner Harwaredatenbank 0655:5161 nachschaut und den eingetragenen Treiber (über "udev") läd.

    Da der USB --> seriell Konverter in vielen verschiedenen Endgeräten verbaut sein kann, läd der Pi nur einen allgemeinen seriellen Treiber, da er ja nicht weiss, um welches Gerät (Wechselrichter der Fa.XY) es sich handelt. Auch muss ein entsprechender Treiber (=Modul) vorhanden sein, damit er geladen werden kann (nona).

    HID heisst: Human Interface Device und umfasst alle Geräte, über die eine menschliche Ein- und Ausgabe erfolgen kann.

    Da es konkret derzeit für udev nur möglich ist, einen allgemeinen und einen (noch minimaleren) rohen seriellen Treiber zu laden, bekommst Du diese unter /dev/hiddev0 + /dev/hidraw0 eingebunden und solltest darüber mit dem Wechselrichter bereits kommunizieren können. Ein Datenaustausch wird aber nur gelingen, wenn Du das vom Wechselrichter vorgegebene Protokoll (Start, Daten, CRC etc.) befolgst und die Übertragungsparameter einhältst.

    Du kannst auch eine eigene udev Regel für 0655:5161 schreiben und damit gleich das Modul für den Wechselrichter laden (wenn Du ein solches irgenwo findest), oder dauerhaft ein USB Device mit mknod 188:10 als /dev/USB10 erstellen.


    Servus !

    RTFM = Read The Factory Manual, oder so

  • Vielen Dank für die ausführliche Erklärung RTFM.

    Was HID bedeutet, war eine der wenigen Sachen die ich schon wusste.8) Allerdings war mir nicht klar, dass es sich dabei im Prinzip auch um eine serielle Schnittstelle handelt (wenn ich Dich jetzt richtig verstanden habe).

    Habe jetzt mal ganz unverblümt versucht "hidraw0" mit "mnicom -b 2400 -D dev/hidraw0" anzusprechen und z.B. den Befehl "QID" zu senden. Allerdings ist mir die Funktionsweise und die Philosophie von minicom auch nach der Durchsicht des Manuals schleierhaft.

    Wenn mir jemand verrät, wie man eine Datei anhängen kann, stelle ich das Protokoll zur Kommunikation mit dem Umrichter gern zur Verfügung.

    Gruß Hanson

  • Tatsächlich bin ich ich darauf gestoßen und habe daraus geschlussfolgert, dass man Befehle (oder was auch immer), die man senden möchte in eine Datei schreiben muss. Vielleicht ist es ja meinen mangelhaften Linux- und Konsolenkentnissen geschuldet, aber warum man jeden String, den man senden möchte in eine Datei schreiben muss, ist das, was ich mit der Philosophie meine, die ich nicht verstehe. Ich meine mich zu erinnern vor Ewigkeiten mal Serielle Kommunikation über das Hyperterminal betrieben zu haben. Da konnte man einfach eine Zeichenfolge senden und schauen was zurückkommt.

    Mal abgesehen davon, dass ich mich vorerst nicht in der selben Weise für minicom begeistern kann, wie andere, würde mich interessieren, ob meine Ansatz bzw. meine Denkweise zielführend ist. Ich meine den Versuch, die serielle Kommunikation über /dev/hidraw0 zu versuchen. Oder umgibt mich hier schon wieder der Nebel der Unkenntnis? :/

  • Wenn /dev/hidraw0 (oder /dev/hiddev0) eine Major-Device Nzmmer von 188 hat, kannst Du darüber das Endgerät via USB erreichen. < ls -al /dev/hid*>.

    Sonst musst Du ein serielles Device mit Major 188 erstellen und mit dem hid* verlinken.

    Servus !

    RTFM = Read The Factory Manual, oder so

  • Ok, danke für dein Unterstützung,

    ich bin in das Verzeichnis /dev gewechselt und habe mir mit pi@raspberrypi-solar:/dev $ ls -l die Nummern auflisten lassen.

    Ziemlich am Anfang finde ich die Zeile: crw------- 1 root root 244, 0 Okt 19 08:08 hidraw0.

    Das device hat also nicht die Major-Device Nummer 188.;(

    Mit "makedev" soll es gehen. Leider stoße ich auch hier, nach einigen Versuchen, mit meinem rudimentären Verständnis für die Struktur von Linux befehlen an meine Grenzen.

    Über eine Hilfestellung zum Erstellen des device und die Verlinkung mit der /dev/hidraw0 würde ich mich sehr freuen.

  • Ich halte das nicht für zielführend. Heutzutage braucht man mknod und co kaum, gerade weil Busse wie USB es unmöglich machen zu wissen, was denn so alles an einem Rechner hängt. Entsprechend wird genau darauf auch in der hidraw Dokumentation die ic verlinkt habe Bezug genommen. Das erledigt alles der udev.

    Vor allem aber versehe ich nicht, warum das plötzlich wieder aufkommt. Ich habe doch auf Code verwiesen, der funktioniert. Und in dem Code sieht man eben auch, genau an der von mir verlinkten Stelle, das für die Kommunikation mehr als nur das öffnen des Gerätes passieren muss. Sondern vor allem eine Prüfsumme gebildet werden, damit das versandte Kommando akzeptiert wird. Sonst ist keine sinnvolle Antwort zu erwarten.

  • So ich bin bei der Sache ein Stück weiter gekommen.

    Unter Windows wird der Solar-Inverter (SMII von EASunpower) auch als USB-Eingabegerät erkannt. Ich nehme also an, dass die Software watchpower nicht die Standardbibliotheken zur seriellen Kommunikation nutzt.

    Da ich hier nicht weiter gekommen bin, habe ich mir einen Serial-USB-Adapter von Digitus bestellt, denn ich dann direkt an die serielle Schnittstelle des Inverters angeschlossen hab (RJ45 Buchse am Inverter und Kabel mit SubD Stecker)

    Dadurch konnte ich unter Windows über HTerm mit dem Umrichter kommunizieren. Ein Kollege hat mir die entscheidenden Tipps bei der Umwandlung der Befehle gegeben (basierend auf den Listings die __deets__ gepostet hatte).

    Das gleiche gelang mir auch auf dem Raspberry mit gtkTerm.

    Daraufhin habe ich ein kleines Programm zusammen geschustert, mit dessen Hilfe ich ebenfalls erfolgreich den Befehl "QPIGS" senden konnte und dann die entsprechenden Daten vom Umrichter zurück bekam.

    Da das Programmieren in der Konsole mit nano eine Zumutung ist, habe ich mich erstmal damit beschäftigt einen Ordner freizugeben um das C-Programm von einem Laptop aus schreiben zu können. Nach dem ich dies nach unzähligen Versuchen und scheinbar fehlerhaften oder veralteten Anleitungen endlich geschafft hatte, wollte ich mich wieder mit meinem Programm beschäftigen. Leider musste ich feststellen, dass der Inverter nicht mehr ausgelesen werden konnte. Da der Adapter warm geworden war und jedes mal beim Ein- und Ausstecken die LAN-Verbindung des Raspberrys zusammen brach, gehe ich davon aus, dass der Adapter seinen Geist aufgegeben hat. Er funktioniert weder unter Linux noch unter Windows im Terminal. Der Gerätemanager kann ihn auch nicht mehr richtig initialisieren.

    Ich werde nun erst mal einen neuen bestellen und sehen ob es dann wieder geht. Mit dem USB-Kabel das nur als HID erkannt wird läuft watchpower nach wie vor.

    Ist jemanden schon mal was Ähnliches passiert, dass eine USB-Serial-Adapter warm wurde und kaputt ging?

    Sollte es da etwa doch Probleme mit unterschiedlichen Spannungspegeln geben?

  • Die kann es geben. Spannungslevel können zb +-12V sein.

    Und ich hab’s schon erwähnt: auch das hidraw device ist augenscheinlich einfach ein serielles, und der Code den du hast solltest du dann auch ohne Adapter

  • Habe ich in meinem verlinkten Code gezeigt, letztlich genauso wie eine „normale“ serielle. Öffnen, Geschwindigkeit und andere serielle Eigenschaften einstellen, loslegen.

  • Den Code schaue ich mir nun schon eine Weile immer wieder an.

    Meinem Verständnis nach, wird die Schnittstelle hier fd = open(this->device.data(), O_RDWR | O_NONBLOCK); geöffnet.

    Ich suche noch in den anderen Dateien, aber ich konnte noch nicht herausfinden, was this->device.data() ist.

    Mit dem Adapter konnte ich die Schnittstelle durch:

    Code
    fd = open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK);

    öffnen und irgendwie muss "/dev/ttyUSB0" ersetzt werden. Aber durch was? An dieser Stelle stehe ich auf der Leitung. :/

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!