adrianbernhard Posted May 5, 2012 at 10:09 AM Share Posted May 5, 2012 at 10:09 AM 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. Quote Link to comment Share on other sites More sharing options...
photron Posted May 5, 2012 at 10:27 AM Share Posted May 5, 2012 at 10:27 AM Ersetz mal versuchsweise lcd.write_line(0, 0, 'Hello World') durch lcd.write_line(0, 0, b'Hello World') Quote Link to comment Share on other sites More sharing options...
adrianbernhard Posted May 5, 2012 at 10:34 AM Author Share Posted May 5, 2012 at 10:34 AM Jupp funktioniert. Quote Link to comment Share on other sites More sharing options...
borg Posted May 5, 2012 at 04:49 PM Share Posted May 5, 2012 at 04:49 PM Oh, das ist aber ein Bug in den Bindings. Wir müssen Strings an der Stelle in Python 3 einfach anders behandeln. Quote Link to comment Share on other sites More sharing options...
adrianbernhard Posted May 6, 2012 at 05:39 PM Author Share Posted May 6, 2012 at 05:39 PM 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. Quote Link to comment Share on other sites More sharing options...
borg Posted May 6, 2012 at 10:03 PM Share Posted May 6, 2012 at 10:03 PM 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) Quote Link to comment Share on other sites More sharing options...
adrianbernhard Posted May 7, 2012 at 09:07 AM Author Share Posted May 7, 2012 at 09:07 AM 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"); Quote Link to comment Share on other sites More sharing options...
AuronX Posted May 7, 2012 at 09:25 AM Share Posted May 7, 2012 at 09:25 AM 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. Quote Link to comment Share on other sites More sharing options...
Christian Posted May 7, 2012 at 11:18 AM Share Posted May 7, 2012 at 11:18 AM 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 Quote Link to comment Share on other sites More sharing options...
photron Posted May 15, 2012 at 03:40 PM Share Posted May 15, 2012 at 03:40 PM 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. Quote Link to comment Share on other sites More sharing options...
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.