2015-07-03 3 views
0

я получаю сообщение об ошибке в следующей строке:неподдерживаемый тип операнда (ов) для%: «байт» и «ул»

command = input("please type command.example open 1") 
     #call the serial_connection() function 
     ser.write(b"%d\r\n"%command) 

По существу я хочу вход, написанный пользователем, и разобрать его в сер. писать, не спрашивая для входа и непосредственно положить строку в ser.write, такие как:

ser.write(b'close1\r\n') 

работал нормально, проблема только произошло, когда я пытаюсь использовать результат ввода в строку, чтобы включить в ser.write

немного больше кода:

ser = 0 

#Initialize Serial Port 
def serial_connection(): 
    COMPORT = int(input("Please enter the port number: ")) 
    ser = serial.Serial() 
    ser.baudrate = 38400 #Suggested rate in Southco documentation, both locks and program must be at same rate 
    ser.port = COMPORT - 1 #counter for port name starts at 0 

    #check to see if port is open or closed 
    if not ser.isOpen(): 
     print ('The Port %d is open - Will attempt to close lock 1 Stephan: '%COMPORT + ser.portstr) 
     #timeout in seconds 
     ser.timeout = 10 
     ser.open() 
     command = input("please type command.example open 1") 
     #call the serial_connection() function 
     ser.write(b"%d\r\n"%command) 

    else: 
     print ('The Port %d is **open** Stephan' %COMPORT) 

для каких-либо уточнений, пожалуйста, сообщите.

ответ

0

Может быть, вы можете попробовать сначала декодировать строку байта (если это не постоянная строка, иначе просто начните с нормальной строки), затем примените формат и затем запишите его обратно?

Кроме того, вы должны использовать %s вместо %d, потому что ваша `команда является прямым вводом от пользователя, который является строкой.

Exmaple -

ser.write(("%s\r\n"%command).encode()) 

Если вы не передаете никаких аргументов, он по умолчанию текущей кодировки по умолчанию системы, вы можете также указать кодировку использовать такие как utf-8 или ascii и т.д. Пример этого - ser.write(("%s\r\n"%command).encode('utf-8')) или ser.write(("%s\r\n"%command).encode('ascii'))

+0

спасибо за это предложение. с этим я получаю следующую ошибку: ser.write ((«% d \ r \ n»% command) .encode()) ТипError:% d формат: требуется номер, а не str –

+0

Если его str, используйте - % s. Обновление в ответ. –

+0

молодец спасибо –

0

В Python 3 следует использовать функцию форматирования строки:

ser.write(b"{0}\r\n".format(command)) 

Это работает байт в Python 3.5 (см link).

+0

Не работает для меня в Python 3.4 –

+0

Для Python 3.4 вы можете рассмотреть возможность использования строки присоединиться к функции 'B "" .join ([В'1' , B» 2 ', b'3']) ' –

+0

спасибо за это предложение, я к несчастью получаю следующую ошибку: ser.write (b" {0} \ r \ n ".format (команда)) AttributeError: объект 'bytes' не имеет атрибута 'format' –

1

Аргумент левой стороны для% должен быть строкой, но вы прошли b "% d \ r \ n", который является байтовым литералом.

Предлагайте замена

ser.write(("%d\r\n" % command).encode("ascii")) 
Смежные вопросы