Строка sys.argv, содержащая символы escape-последовательности, не будет правильно отображаться на ЖК-дисплее - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь получить текст для отображения на ЖК-дисплее 16x2, подключенном к Raspberry Pi (используя библиотеку Adafruit_CircuitPython_CharLCD).Когда в моем коде есть текстовая строка, все работает, но когда она предоставляется в качестве аргумента при запуске сценария, я не могу получить специальные / escape-символы для правильного отображения.

Я пытался преобразовать sys.argv[1] в байты, используя os.fsencode(sys.argv[1]), затем декодирование в utf-8 или ascii.Я искал библиотеку для какой-либо конкретной ссылки на кодировку.Я не очень разбираюсь в кодировке.

#!/usr/bin/env python3
#lcd.py

import os, sys
from time import sleep
import board
import digitalio
import adafruit_character_lcd.character_lcd as characterlcd

#LCD setup
lcd_columns = 16
lcd_rows = 2

lcd_rs = digitalio.DigitalInOut(board.D5)
lcd_en = digitalio.DigitalInOut(board.D6)
lcd_d4 = digitalio.DigitalInOut(board.D13)
lcd_d5 = digitalio.DigitalInOut(board.D16)
lcd_d6 = digitalio.DigitalInOut(board.D19)
lcd_d7 = digitalio.DigitalInOut(board.D26)

lcd = characterlcd.Character_LCD_Mono(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows)

#Special character definitions
degree = bytes([0xc, 0x12, 0x12, 0xc, 0x0, 0x0, 0x0, 0x0])
lcd.create_char(0, degree)


def display(text):
    lcd.clear()
    lcd.message = text

if __name__ == '__main__':
    display(" T: 19.5\x00C\nSet 21.0\x00C")
    sleep(5)
    display(sys.argv[1])

Я называю свой скрипт так: $ python3 lcd.py " T: 19.5\x00C\nSet 21.0\x00C"

Сейчас он отображается правильно в течение пяти секунд:

 T: 19.5°C
Set 21.0°C

И затем отображает эту красоту:

 T: 19.5¥x00C¥nS

С пустой второй строкой (\ n не распознается).

Любая помощь будет принята с благодарностью.Спасибо!

1 Ответ

0 голосов
/ 06 февраля 2019

Проблема состоит в том, что эта строка:

" T: 19.5\x00C\nSet 21.0\x00C"

, когда это литерал Python имеет последовательность символов \x00, интерпретируемую как ASCII 0, которую ваше устройство отображает каксимвол степени

Но когда это данные, введенные в командной строке , тогда \x00 означает 4 символа \ x 0 0.И трудно рекомендовать способ обойти это, потому что сложно ввести нулевой символ из командной строки.Многие промежуточные программы рассматривают этот символ как терминатор строки.Поэтому, если вы должны использовать \00 в качестве суррогата специального символа, позвольте программе продолжать управлять форматированием (нулевые символы, возврат каретки, «Set» и «T:»), а вы просто вводите числа из командной строки.,Измените вызов display() на

display(" T: {1}\x00C\nSet {2}\x00C".format(*sys.argv))

и, когда вы запустите программу, сделайте это следующим образом:

$ python3 lcd.py 19.5 21.0

Это работает, передавая две температуры как отдельные значения в sys.argv, который format() затем добавляет строку для отображения.

...