【问题标题】:ValueError: "port" must be None or a string, not <class 'int'>ValueError: "port" 必须是 None 或字符串,而不是 <class 'int'>
【发布时间】:2020-05-31 17:02:52
【问题描述】:

大家好,

我正在尝试向我的 USB 连接的锁控制器发出命令。代码运行良好,直到这一行:

Connected ports: 
['COM6']
Please enter the port number that has port connected. 
 i.e. if COM3 is shown, enter 3 when ask to enter port number. 
 If the above shows [] than no connected port is found and errors will follow
Please enter the port number: 6

然后出现以下错误:

ValueError: "port" must be None or a string, not <class 'int'>

我收到以下错误:

Traceback (most recent call last):
  File "[...]", line 44, in <module>
    serial_connection() #executes the function defined above

  File "[...]", line 29, in serial_connection
    ser.port = COMPORT - 1 #counter for port name starts at 0

  File "[...]", line 260, in port
    raise ValueError('"port" must be None or a string, not {}'.format(type(port)))

下面是代码:

#this library is required as it helps establish the serial connection
#Using  pyserial Library to establish connection
import serial #not being used because it was already called in portRead
from portRead import *

#Global Variables
ser = 0

#this will print out the port that can be used; ports that are connected. i.e. if COM3 is shown, enter 3 when ask to enter port number
#if shown [] then no usb is connected to a port and errors will follow
if __name__ == '__main__':
    print ("Connected ports: ") #print means printing information on screen
    print(serial_ports()) #function derived from portRead
    print("Please enter the port number that has port connected. \n "
          "i.e. if COM3 is shown, enter 3 when ask to enter port number. \n If the above shows [] than no connected port is found and errors will follow")

#defining the serial connection
def serial_connection():
    while True: #the while loop is used to continuously ask you to issue a new command until you decide to quit the program
        ser = serial.Serial()
        ser.baudrate = 38400 #Suggested rate in Southco documentation, both locks and program MUST be at same rate
        COMPORT = int(input("Please enter the port number: ")) #this refers to which port your usb is inserted into
        ser.port = COMPORT - 1 #counter for port name starts at 0

        print ('Port %d entered Stephan '%COMPORT)
        #timeout in seconds
        ser.timeout = 10
        ser.open()
        command = input("please type command - open1/close1, or open2/close2. \n"
                    "If already open and you try to open no action will be taken and vice-versa...: \n ")
        #call the serial_connection() function
        ser.write(("%s\r\n"%command).encode('ascii')) #Southco locks receives and sends commands in ASCII


serial_connection() #executes the function defined above

如果我正在解决这个问题,任何帮助都将不胜感激

【问题讨论】:

  • 我想你应该将端口设置为"COM{}".format(COMPORT) 而不是数字。
  • 感谢您的评论。我会在哪里加入它?
  • 你可能只是从int(input("..."))中删除int
  • 但是我必须从结果中提取 1,并且我无法将 int 与 str 进行比较

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


【解决方案1】:

您必须将ser.port 中的端口name 指定为字符串,而不仅仅是数字(我猜它可能是PRN,而不仅仅是@ 987654324@).

修复建议:

COMPORT = int(input("Please enter the port number: ")) #this refers to which port your usb is inserted into
ser.port = "COM{}".format(COMPORT-1)

查看文档:https://pythonhosted.org/pyserial/shortintro.html#opening-serial-ports

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 2014-02-26
    相关资源
    最近更新 更多