SOLVED: EV3 Basic: Bug bei Übergabe von Strings in EV3.Systemcall

NXC, C/C++, Lejos, pbLua, RobotC...

Moderator: Moderatoren

Benutzeravatar
elfulus
Schreibt ab und zu
Schreibt ab und zu
Beiträge: 30
Registriert: 24. Sep 2015 13:58

SOLVED: EV3 Basic: Bug bei Übergabe von Strings in EV3.Systemcall

Beitragvon elfulus » 30. Sep 2015 09:51

Ahoi,

bei einem kleinen Projekt benötige ich eine bessere WLAN-Ansteuerung/Kontrolle aus EV3 Basic heraus. Habe bereits die ersten Hürden genommen (kann mich schon mal aus Basic an WPA2 Hidden SSID anmelden, ohne das nervige Vergessen der letzten Anmeldung beim EV3 WLAN Menü).

Bei der Programmierung ist mir aber ein Bug bei der Übergabe von String-Variablen bei syscalls aufgefallen.

Nach einigem Testen konnte ich es etwas einkreisen. Wenn man In einer Stringvariablen am Ende eine einzeln stehende Ziffer hat dann wird diese bei Verwendung im EV3.Systemcall bei der Übergabe abgeschnitten (z.B. "Test String 1" => "Test String"). Man muss noch ein Leerzeichen hinter die Ziffer stellen, damit auch die Ziffer übergeben wird.

Habe noch nicht probiert, ob das auch bei einzeln stehenden Textzeichen (also keine Ziffern) passiert. Bei Textwindow.write und LCD.Write Ausgaben läuft das normal.

Hat mich ein, zwei graue Haare gekostet, da es mit dem Debuggen auf Systemebene ja immer etwas nervig ist, wenn das Testprogramm ausgerechnet die Schnittstelle anspricht (WLAN), die man auch zum Debuggen braucht. Geht dann nur über Bluetooth, das in F1.04H (höchste getweakte Version mit edimax wifi Stick Unterstützung) mit EV3 Explorer/Basic noch nicht sonderlich stabil ist oder USB. Aber in beiden Fällen nur ohne Console, oder?

Werde den fertigen Code zur WLAN Kontrolle unter EV3 Tipps und Tricks veröffentlichen. Es fehlen mir aber noch ein paar Sachen (Aktivierung des WLAN Sticks selbst, Kopplung des EV3 an EV3 Explorer/Basic/EV3G, wenn WLAN per System Call und nicht per VM Menü verbunden wurde =>vielleicht weiss ja c0pperdragon, welche Prozesse da als Schnittstelle fungieren).
Zuletzt geändert von elfulus am 9. Jul 2016 11:58, insgesamt 1-mal geändert.
Beste Grüße vom elfulus
____________________________
EV3home+Sound,Gyro,US,F1.04H
EdimaxEW-7811Un,EV3-Basic+Labview

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3 Basic: Bug bei Übergabe von Strings in EV3.Systemcall

Beitragvon c0pperdragon » 30. Sep 2015 11:42

Leider kenne ich mich mit den Prozessen am EV3 nicht aus. Ich kenne nur Spezifikation der VM und wie man die dazu bringt, ihrerseits dann die nötigen Sachen anzusteuern. Das mit dem Abschneiden ist mir neu. Ich kann auch keinen Hinweis darauf in der Spec. oder sogar im Source der VM finden.
Eine Detailfrage: Tritt das Problem auf, wenn das Programm am PC läuft und den Brick fernsteuert, oder wenn das Programm direkt am EV3 ausgeführt wird. Oder in beiden Fällen?
Und du kannst ausschließen, dass der Problem vielleicht vorher irgendwoe passiert, und der String in der Variable schon verstümmelt ist? Auch hier könnten sich PC-Modus und Brick-Modus unterscheiden.

Benutzeravatar
elfulus
Schreibt ab und zu
Schreibt ab und zu
Beiträge: 30
Registriert: 24. Sep 2015 13:58

Re: EV3 Basic: Bug bei Übergabe von Strings in EV3.Systemcall

Beitragvon elfulus » 30. Sep 2015 17:17

Ahoi,

es passiert in beiden Modi. Anfangs habe ich die WLAN-Beeinflussung ja immer nur kompiliert auf dem Brick getestet, falls die Verbindung dabei abschmiert. Habe mir dann zum Debuggen immer alles in eine Logdatei umgeleitet und mir diese angeschaut.
Es passiert gleichermaßen bei einem Komdando wie EV3.Systemcall("echo wpa_cli select_network 0"+logfile), [logfile=">>mylogfile"] als auch beim eigentlichen Kommando EV3.Systemcall("wpa_cli select_network 0"+logfile). In beiden Fällen kommt sowohl im Logfile als auch beim eigentlichen Kommando die 0 nicht mehr an. Nur, wenn ich nach der 0 und vor dem Ende noch ein Leerzeichen im String einfüge, dann klappts.

Habe das heute dann noch mal explizit mit kleinen Test-Routinen auch im "PC-Modus" getestet und dabei festgestellt, dass es seltsamerweise nicht den LCD.Write- oder den Basic TextWindows.Write-Block betrifft sondern nur den EV3.SystemCall beim Verwenden von String-Variablen.

Wenn ich dazu komme, teste ich noch weiter.

Was die VM betrifft, so habe ich in Deinem Source Code gesehen, dass Du bei Wifi den TCP port 5555 ansprichst. Lauert (nur) dahinter die VM? Regelt die VM dann auch den kompletten Dateizugriff/Datenbaum im EV3 Explorer und die Anfragen von EV3Basic/EV3-G?

Ich frage deshalb so genau, weil ich noch herausbekommen möchte, welchen Prozess ich manuell auf dem System umbiegen und/oder (neu) starten muss, damit man auch dann an die VM kommt, wenn man das WLAN selber über EV3-Basic gestartet/verbunden hat und nicht über das VM-Menü. Bis jetzt scheint das nicht automatisch zu funktionieren. Wenn ich das WLAN außerhalb der VM starte, weiß die VM nicht, dass der Brick schon verbunden ist (auch kein Verbindungssymbol oben links) und hat dann offenbar auch nicht die notwendigen Randbedingungen miteingestellt, damit man mit ihr reden kann. Aber telnet, ping, DNS, DHCP, wget, etc. funktionieren dann schon :) .
Beste Grüße vom elfulus
____________________________
EV3home+Sound,Gyro,US,F1.04H
EdimaxEW-7811Un,EV3-Basic+Labview

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3 Basic: Bug bei Übergabe von Strings in EV3.Systemcall

Beitragvon c0pperdragon » 30. Sep 2015 21:53

Wegen dem Leerzeichen: Ich bin mir jetzt noch immer nicht ganz sicher, welchen String du genau an das Kommando gibst. Du scheinst mir da aber etwas in der Art von

Code: Alles auswählen

echo wpa_cli select_network 0>>mylogfile

zusammenzubauen und dann zu übergeben.
Wenn dir dann die 0 abhandenkommt, könnte das sein, weil man bei der bash beim Umleiten der Ausgaben die verschiedene Streams mit z.B. 1> oder 2> wählen kann. Wahrscheinlich wird 0>> (ohne Space!) so wie 1>> behandelt und leitet einfach stdout in die Datei.

Und ja, die VM scheint nur diesen einen Port für die Kommunikation über TCP zu verwenden. Bluetooth und USB sind wieder extra.
Könnte mir vorstellen, dass die VM TCP nur verwendet, wenn sie weiß, dass sie es soll. Aber um das genau rauszufinden, müsste man sich wohl durch den Sourcecode graben (gibts auf https://github.com/mindboards/ev3sources ).

Benutzeravatar
elfulus
Schreibt ab und zu
Schreibt ab und zu
Beiträge: 30
Registriert: 24. Sep 2015 13:58

Re: EV3 Basic: Bug bei Übergabe von Strings in EV3.Systemcall

Beitragvon elfulus » 30. Sep 2015 22:14

Ahoi,
stimmt! Hatte ich auch schon irgendwo ganz leise im Hinterkopf, nur ich kannte keinen Stream 0... Also sorry - mein Fehler. Bin auch nicht soo der Linux-Junkie ;-)...

Was WLAN betrifft, habe ich mir jetzt die Netzumgebung angesehen, bevor and nachdem das WLAN über das VM Menü aktiviert wurde. Da lauscht tatsächlich nur die LMS VM selbst:

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN 1142/lms2012
udp 0 0 0.0.0.0:57992 0.0.0.0:* 1142/lms2012

Der UDP Port ist wohl für den initialen Handshake (siehe auch http://www.monobrick.dk/guides/how-to-establish-a-wifi-connection-with-the-ev3-brick).

Tja, dann kann ich das wohl vergessen, da ich die VM über Bytecode wohl kaum dazu bekomme, intern WLAN als connected zu betrachten, die Ports aufzumachen und zu lauschen :(

Immerhin kann ich nun wenigstens über meine kleinen Basic-Schnipsel bei Verbindungsproblemen automatisch das Wlan Interface zurücksetzen und schon mal, bevor man den VM WLAN-Dialog aufmacht, das Netzwerk bekannt machen, so dass es im Menü auch immer ausgewählt werden kann statt oft erneut eingetippt zu werden :)
Beste Grüße vom elfulus
____________________________
EV3home+Sound,Gyro,US,F1.04H
EdimaxEW-7811Un,EV3-Basic+Labview

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3 Basic: Bug bei Übergabe von Strings in EV3.Systemcall

Beitragvon c0pperdragon » 1. Okt 2015 09:59

So schnell musst du das vielleicht nicht aufgeben. Soweit ich weiß werden sämtliche Dialoge am Brick auch mit der VM ausgeführt und es gibt Bytecodes für verschiedenste interne Zwecke. Vielleicht ist da was brauchbares dabei...

Benutzeravatar
elfulus
Schreibt ab und zu
Schreibt ab und zu
Beiträge: 30
Registriert: 24. Sep 2015 13:58

Re: EV3 Basic: Bug bei Übergabe von Strings in EV3.Systemcall

Beitragvon elfulus » 2. Okt 2015 00:14

Ahoi,

habe tatsächlich eben im EV3 developer KIT unter http://www.lego.com/en-us/mindstorms/downloads auf den Seiten 65ff die passenden Bytecodes zur Manipulation und Einrichtung von USB, Bluetooth und auch Wifi gefunden.

Nun fehlt mir "nur" noch eine zündende Idee, wie ich beliebigen Bytecode am einfachsten in die LMS "injizieren" kann, ohne dafür gleich EV3 Basic umzuprogrammieren oder eigene "Fernsteuerer" in C zu schreiben. :? Könnte man dafür ein Command in EV3 Basic einbauen, mit dem man sozusagen "Raw Byte Code" mitten im Basic-Programm hat oder irgendwo ablegt, der dann vom Compiler an dieser Stelle im Program "roh" mit eingefügt, bzw. angesprungen wird? So ähnlich wie früher, wenn ich mir z.B. im langsamen Basic für Sortierroutinen oder aufwändige Grafikmanipulation kleine Maschinencode-Schnipsel geschrieben habe, die ich (beim Atari z.B. mit "Poke") in den Speicher legte und dann innerhalb des Programms direkt per Call aufrufen konnte. Sozusagen schönes einfaches Basic als oberste Steuer-Instanz und für die harten Fälle gleich Bytecode. Auf "maschinennahe" Zwischen-Sprachen (C, etc) möchte ich gern verzichten.

Alternativ könnte es natürlich auch ein EV3Basic Block in der folgenden Art geben:
EV3.Communication.StartWifi(SSID, EncryptionType,PSK), der dann die nötigen Bytecodes kompiliert und dadurch auch die LMS-VM zum Zuhören auf diesem Ohr bringt.
Beste Grüße vom elfulus
____________________________
EV3home+Sound,Gyro,US,F1.04H
EdimaxEW-7811Un,EV3-Basic+Labview

Benutzeravatar
c0pperdragon
Schreibt viel
Schreibt viel
Beiträge: 231
Registriert: 9. Feb 2015 00:29

Re: EV3 Basic: Bug bei Übergabe von Strings in EV3.Systemcall

Beitragvon c0pperdragon » 2. Okt 2015 08:10

So spezielle Befehle wie deinen ... StartWifi wollte ich eigentlich nicht einbauen.
Aber möglicherweise kann ich in EV3Basic ein Interface bauen, mit dem man andere Byte-Code-Programme, die bereits am Brick liegen müssen (als .rbf Datei) ausführen kann. So ähnlich wie mit dem EV3.SystemCall, aber halt zur Ausführung innerhalb der VM. Diese kleinen Hilfsprogramme müsste man dann direkt mit einem Bytecode-Assembler erzeugen (so einer ist als verstecktes Feature im EV3Explorer schon dabei).
Muss ich mir aber noch genauer anschauen, ob ich da so ohne weiteres andere Programme starten kann.

Benutzeravatar
elfulus
Schreibt ab und zu
Schreibt ab und zu
Beiträge: 30
Registriert: 24. Sep 2015 13:58

Re: EV3 Basic: Bug bei Übergabe von Strings in EV3.Systemcall

Beitragvon elfulus » 30. Jan 2016 15:58

Hallo c0pperdragon,

schon ein Weilchen her... mein kleines Projekt (selbstfahrender, über Netzwerk steuerbarer EV3-Robo mit Selbstaufladung und online Kamera) kam seinerzeit aus Zeitgründen und wegen der zwei Baustellen: WLAN-Stabilität/Neustart aus Basic ggf. mit Bytecode (dieser Thread) und automatische finale Kopplung mit Ladestation zum Stehen.

Hat sich in der Zwischenzeit zum Thema "Bytecode-Infusionen" mittels einer Art Systemcall in EV3 Basic für externe rbf-Dateien noch was ergeben? Das wäre bei der Lösung des ersten Problems mittels Basic und Bytecode extrem hilfreich.
Beste Grüße vom elfulus
____________________________
EV3home+Sound,Gyro,US,F1.04H
EdimaxEW-7811Un,EV3-Basic+Labview


Zurück zu „textbasierte Programmiersoftware“

Wer ist online?

Mitglieder in diesem Forum: Baidu [Spider] und 23 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss