adrianbernhard Geschrieben May 5, 2012 at 10:09 Geschrieben May 5, 2012 at 10:09 Moin Moin, heute kam meine neue Bestellung mit dem 20x4 LCD Display. Da habe ich mich gleich ran gesetzt und erstmal die Beispielscripte getestet. Bei Python 3.2.3 verweigert das Script seine Tätigkeit, das Display geht an aber den write Befehl führt er nicht aus. Hier das angepasste Script: #!/usr/bin/env python # -*- coding: utf-8 -*- HOST = "localhost" PORT = 4223 UID = "7Yo" # Change to your UID from ip_connection import IPConnection from bricklet_lcd_20x4 import LCD20x4 if __name__ == "__main__": ipcon = IPConnection(HOST, PORT) # Create ip connection to brickd lcd = LCD20x4(UID) # Create device object ipcon.add_device(lcd) # Add device to ip connection # Don't use device before it is added to a connection # Turn backlight on lcd.backlight_on() # Write "Hello World" lcd.write_line(0, 0, 'Hello World') input('Press key to exit\n') # Use input() in Python 3 ipcon.destroy() und der Fehler: Traceback (most recent call last): File "C:\Users\Adrian\Desktop\tinker\example_hello_world.py", line 22, in <module> lcd.write_line(0, 0, 'Hello World') File "C:\Users\Adrian\Desktop\tinker\ip_connection.py", line 67, in func return f(self, *args, **kwargs) File "C:\Users\Adrian\Desktop\tinker\bricklet_lcd_20x4.py", line 46, in write_line self.ipcon.write(self, LCD20x4.TYPE_WRITE_LINE, (line, position, text), 'B B 20s', '') File "C:\Users\Adrian\Desktop\tinker\ip_connection.py", line 244, in write write_data += struct.pack('<' + f, d) struct.error: argument for 's' must be a bytes object Unter 2.7 tritt der Fehler nicht auf. Ich kann leider mit dem Fehler nicht viel anfangen. Zitieren
photron Geschrieben May 5, 2012 at 10:27 Geschrieben May 5, 2012 at 10:27 Ersetz mal versuchsweise lcd.write_line(0, 0, 'Hello World') durch lcd.write_line(0, 0, b'Hello World') Zitieren
adrianbernhard Geschrieben May 5, 2012 at 10:34 Autor Geschrieben May 5, 2012 at 10:34 Jupp funktioniert. Zitieren
borg Geschrieben May 5, 2012 at 16:49 Geschrieben May 5, 2012 at 16:49 Oh, das ist aber ein Bug in den Bindings. Wir müssen Strings an der Stelle in Python 3 einfach anders behandeln. Zitieren
adrianbernhard Geschrieben May 6, 2012 at 17:39 Autor Geschrieben May 6, 2012 at 17:39 Achso. Nun gut ich habe jetzt noch mal in Java das ganze geschrieben. Da habe ich das Problem nicht mehr. Nun stehe ich aber vor einer neuen Frage: Welche Zeichen kann ich darstellen? Konkret: kann es nicht ° darstellen. Bei Python bekomme ich irgendeine Fehlermeldung (hab das an der Stelle nicht weiterverfolgt) und bei Java wird ein Minus angezeigt. Zitieren
borg Geschrieben May 6, 2012 at 22:03 Geschrieben May 6, 2012 at 22:03 Wir benutzen den KS0066U LCD Controller mit dem Standard English/Japanese Zeichensatz. Hier gibt es eine Tabelle mit dem Zeichensatz: http://www.display-elektronik.de/CHAR_KS0066-00(Engl-Japan).PDF 0b11011111 sieht aus wie ein °. Also in Python z.B. lcd.write_line(0, 0, chr(0b11011111)) (habs gerade getestet, es funktioniert so) Zitieren
adrianbernhard Geschrieben May 7, 2012 at 09:07 Autor Geschrieben May 7, 2012 at 09:07 Jupp, ihr seit einfach Klasse. Ich bin in der Hinsicht ja noch blutiger Anfänger Für Java sieht das ganze beispielsweise so aus (für andere Anfänger ): lcd.writeLine((short)0, (short)0, "Temp: " + temperature/100.0 + " " + (char)0b11011111 + "C"); Zitieren
AuronX Geschrieben May 7, 2012 at 09:25 Geschrieben May 7, 2012 at 09:25 Ist es nicht möglich den Zeichensatz transparent mappen zu lassen? Ich müsste mir das mal anschauen, aber beispielsweise bieten ja die OutputStreamWriter an nen zeichensatz zu spezifizieren... Ergänzung: Im Moment sieht der Code zum Schreiben des Strings so aus: for(int i = 0; i < 20; i++) { try { bb.put((byte)text.charAt(i)); } catch(Exception e) { bb.put((byte)0); } } Also vollkommen frei von Encoding-Gedanken. String definiert auch die Methode public byte[] getBytes(String charsetName). Da gibt es dann ein Array von Bytes das nach einem spezifischen Zeichensatz dargestellt wird. Dieses byte-array ließe sich dann in den ByteBuffer schieben. Für den Fall, dass das CharSet schlecht unterstützt wird kann man wohl auch einen eigenen CharsetEncoder schreiben, habe ich aber noch nie gemacht ^^ P.S.: Habe noch nicht geprüft wie gut sich eine solche Ändeurng mit dem Code-Generator verträgt. Zitieren
Christian Geschrieben May 7, 2012 at 11:18 Geschrieben May 7, 2012 at 11:18 Ja mir ist auch schon aufgefallen, dass via BrickV Sonerzeichen wie die deutschen (ä, ö, ü, ß) und auch das °-Zeichen für 25°C sich nicht schreiben lassen. Da passiert dann einfach nichts... Mit C# oder ähnlichen hab ich das LCD noch nicht traktiert, da ich das erst seit heut Vormittag am Tisch liegen hab :-) ich weiß nur von PHP dass man halt eine Konvertierung in den entsprechenden Zeichensatz vornehmen muss. Wär natürlich cool, wenn die entsprechende Bricklet-Klasse standardmäßig UTF-8 entgegen nimmt und dann anschließend in den passenden Zeichensatz des KS0066U konvertiert. Entweder es gibt nen sprachspezifischen Weg zur Konvertierung oder via Mapping... Gruß Christian Zitieren
photron Geschrieben May 15, 2012 at 15:40 Geschrieben May 15, 2012 at 15:40 Oh, das ist aber ein Bug in den Bindings. Wir müssen Strings an der Stelle in Python 3 einfach anders behandeln. Okay, dieses Python 3 Problem ist in Python Bindings 1.0.8 jetzt behoben. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.