%不支持的操作数类型:'bytes'和'str'

时间:2015-07-03 19:22:24

标签: python python-3.x serial-port hardware pyserial

我收到以下行中的错误:

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

基本上我想要用户编写的输入并将其解析为ser.write,而不需要输入并直接将字符串放入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)

任何澄清,请提出建议。

3 个答案:

答案 0 :(得分:1)

%的左手参数应该是一个字符串,但是你已经传递了b“%d \ r \ n”这是一个字节文字。

建议替换

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

答案 1 :(得分:0)

在Python 3中,您应该使用字符串格式函数:

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

这适用于Python 3.5中的字节(参见link)。

答案 2 :(得分:0)

也许你可以先尝试解码字节串(如果它不是常量字符串,否则只能用普通字符串开头),然后应用格式,然后再编码回来?

此外,您应该使用%s而不是%d,因为您的`命令是来自用户的直接输入,这是一个字符串。

Exmaple -

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

如果您没有传递任何参数,它默认为当前系统默认编码,您也可以指定要使用的编码,例如utf-8ascii等。示例 - {{1 }或ser.write(("%s\r\n"%command).encode('utf-8'))