как изменить 3 соединенных строки в байтах в python? - PullRequest
0 голосов
/ 30 апреля 2020

Я получаю сообщение об ошибке при запуске следующего кода в python 3, я просматриваю все, но не могу найти правильный способ сделать это. любая помощь будет оценена.

повышение TypeError ('строки Unicode не поддерживаются, пожалуйста, кодируйте в байтах: {! R}'. Format (seq)) TypeError: строки Unicode не поддерживаются, пожалуйста, кодируйте в байтах: 'relay read 7 \ n \ r '

Мне нужно отправить следующую строку через последовательный порт: relay read #of relay.

import sys
import serial

if (len(sys.argv) < 2):
    print ("Usage: relayread.py <PORT> <RELAYNUM>\nEg: relayread.py COM1 0")
    sys.exit(0)
else:
    portName = sys.argv[1];
    relayNum = sys.argv[2];

#Open port for communication    
serPort = serial.Serial(portName, 19200, timeout=1)

if (int(relayNum) < 10):
    relayIndex = str(relayNum)
else:
    relayIndex = chr(55 + int(relayNum))

serPort.write("relay read "+ relayIndex + "\n\r")

response = serPort.read(25)

if(response.find("on") > 0):
    print ("Relay " + str(relayNum) +" is ON")

elif(response.find("off") > 0):
    print ("Relay " + str(relayNum) +" is OFF")

#Close the port
serPort.close()

1 Ответ

0 голосов
/ 01 мая 2020

Используйте метод строки encode для создания соответствующей последовательности байтов.

В этом случае все символы в строке находятся в диапазоне ASCII, поэтому не имеет значения, какую схему кодирования вы используете , (Различия между схемами кодирования, как правило, имеют значение только тогда, когда вы имеете дело с не-ASCII-символами, значения которых ord() больше 127.) Так что в этом случае вам даже не нужно указывать конкретную схему кодирования, вы можете просто используйте метод encode без аргументов и позвольте Python применить кодировку платформы по умолчанию.

Для этого измените это:

serPort.write("relay read "+ relayIndex + "\n\r")

на следующее:

serPort.write(("relay read "+ relayIndex + "\n\r").encode())

Возможно, вам придется выполнить обратную операцию, чтобы получить строку из последовательности байтов, возвращенной serPort.read. Измените это:

response = serPort.read(25)

на:

response = serPort.read(25).decode()

КСТАТИ, как правило, окончания строк в передаваемых данных представляются символом возврата каретки с последующим переводом строки или "\r\n" , В вашем serPort.write звонке вы используете обратную, "\n\r". Это необычно, но если это то, что нужно вашему устройству, пусть будет так.

...