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

unsupported operand type(s) for %: 'bytes' and 'str'

我收到以下行的错误:

 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)

如有任何疑问,请指教。

在Python3中你应该使用字符串格式化函数:

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

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

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

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

示例 -

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

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

% 的左侧参数应该是一个字符串,但您传递的是 b"%d\r\n",它是一个字节文字。

建议替换为

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