标签: pyserial

pyserial 错误 - 无法打开端口

我在 stackoverflow 中看到了在 Python 3.3 的 USB 端口中使用 pyserial 的简单代码,但我无法让它在我新安装的 pyserial 2.7 [在 Windows 7,64 位,带有 3 个 USB 端口] 上工作。pyserial 的安装很顺利,我可以毫无错误地导入,并且 Pyscripter IDE 中可以识别方法,这增强了对良好安装的信心,但是:

代码精简到产生错误的要点是:

import serial
def main():
  ser = serial.Serial(port='COM2')
  ser.close()

if __name__ == '__main__':
   main
Run Code Online (Sandbox Code Playgroud)

由此我收到一个对话框,其中包含错误“SerialException:无法打开端口“COM2”:FileNotFoundError(2,'系统找不到指定的文件。',无,2)”

回溯指出:

*** Remote Interpreter Reinitialized  ***
>>>
Traceback (most recent call last):
  File "<string>", line 420, in run_nodebug
  File "C:\Python33\Lib\site-packages\scanport2.py", line 19, in <module>
main()
  File "C:\Python33\Lib\site-packages\scanport2.py", line 15, in main
ser = serial.Serial(port='COM2')
  File "C:\Python33\Lib\site-packages\serial\serialwin32.py", line 38, in __init__ …
Run Code Online (Sandbox Code Playgroud)

python usb pyserial

5
推荐指数
1
解决办法
5万
查看次数

使用 pySerial 读取响应 AT 命令

我有以下示例代码:

import serial

ser = serial.Serial('/dev/ttyUSB1', 115200, timeout=5)
ser.write("AT\r")
response =  ser.readline()
ser.write(chr(26)) 
ser.close()

print response
Run Code Online (Sandbox Code Playgroud)

我的目标是发送AT命令并得到您的回答OK

PySerial readline()的文档说读取接收到的数据,直到找到换行符,问题是我的打印没有返回任何内容。

我确定在AT命令之后,3G 调制解调器发送给我的响应是OK。任何人都知道您无法检索答案的原因?

PS:使用像CuteCom这样的程序,我确认设备可以工作并且它响应AT命令。

python pyserial

5
推荐指数
2
解决办法
3万
查看次数

如何在串行通信中使用 pyserial 解码字节

我是 Python 的初学者。我有一个使用 pyserial 库与串行设备通信的程序。程序向机器发送一个字节的数字并接收字节数作为回复。

我的代码是

   import serial, string
   port = serial.Serial("COM9", 38400, timeout=10.0)
   serial.PARITY_NONE
   serial.EIGHTBITS
   serial.STOPBITS_ONE
   port.write(bytes([53, 1, 4, 0, 83]))
   print("Write done")
   data = port.read(20)

   data1= data.decode('utf-8')
   print(data1)
Run Code Online (Sandbox Code Playgroud)

输出是

   Write done
   Traceback (most recent call last):
   File "C:\Python34\serialcomm.py", line 18, in <module>
   data1= data.decode('utf-8')
   UnicodeDecodeError: 'utf-8' codec can't decode byte 0x84 in position 8:                                                                                                               
   invalid start byte
Run Code Online (Sandbox Code Playgroud)

输出应该是 [53,1,4,0​​,83,53,1,63,83]

如果我排除解码,我得到

  Write done
  b'5\x01\x04\x00S5\x1b\x00\x84S'
Run Code Online (Sandbox Code Playgroud)

python serial-port decode pyserial

5
推荐指数
1
解决办法
2万
查看次数

python 串行写入超时

我已经使用 pyserial 几天了。然而,今天出现了一个问题。我遇到了串行写入超时。前几天,当我使用开关时,一切正常。但今天我又换了一个开关。然后出现串口写入超时。我没有更改任何代码,但问题实际上相当严重。更严重的是,超时并不总是发生,这意味着有时我可以成功写入串行。

ser = serial.Serial( #Serial COM configuration
    port='COM5',
    baudrate=9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    rtscts=True,
    timeout=2,
    writeTimeout=5
  )
strInput = "show ver"
ser.flushInput()
ser.flushOutput()
ser.write(strInput.encode('utf-8')+b'\n')
Run Code Online (Sandbox Code Playgroud)

我已经确保端口是COM5,交换机的波特率是9600。非常感谢您回答我的问题。

python pyserial

5
推荐指数
1
解决办法
2万
查看次数

pySerial - 仅读取一个字节

我正在尝试使用 pySerial 通过串行读取和写入传感器。我没有软件或硬件流量控制。

我能够向设备发送一串十六进制字符串,但我只收到一个字节,而不是我应该看到的两到十个字节。传感器正在工作——我已经使用 Realterm 验证了这一点。

我尝试过使用 ser.readline() (而不是 inWaiting 循环)和 ser.read(2); 这只会导致程序挂起。我还尝试增加睡眠时间,并尝试不同的波特率(在电脑和传感器上),但似乎没有任何效果。

有人有建议吗?

import time
import serial

# configure the serial connections
ser = serial.Serial(
    port='COM1',
    baudrate=115200,
    parity=serial.PARITY_EVEN,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS
)

ser.isOpen()

print 'Enter your commands below.\r\nInsert "exit" to leave the application.'

while 1 :
    # get keyboard input
    data_in = raw_input(">> ")

    if data_in == 'exit':
        ser.close()
        exit()
    else:
        # send the character to the device
        ser.write(data_in.decode('hex') + '\r\n')

        out = ''
        time.sleep(1)
        while ser.inWaiting() > 0:
            out …
Run Code Online (Sandbox Code Playgroud)

python serial-port pyserial

5
推荐指数
1
解决办法
2万
查看次数

PySerial 和设备的 ioctl 不合适

我一直在尝试使用 N-UB 转换器(适用于此类扫描仪的 USB 转换器)控制 Keyence BL-1301 条码扫描仪。

我为此使用 pyserial (端口和其他设置正确):

serial.Serial(
    port     = '/dev/bus/usb/001/003',
    baudrate = 9600,
    parity   = serial.PARITY_NONE,
    stopbits = serial.STOPBITS_ONE,
    bytesize = serial.EIGHTBITS,
    writeTimeout = 0,
    timeout = 30,
    rtscts=True )
Run Code Online (Sandbox Code Playgroud)

但。python 给我:无法配置端口:(25,'不适合设备的 ioctl')

另外,我已经尝试过 Windows 的官方驱动程序,它可以工作。我需要 Linux (Ubuntu) 支持该设备。

任何想法??谢谢迈克

python linux barcode-scanner pyserial

5
推荐指数
0
解决办法
9006
查看次数

Python 中的 Pyserial(列出可用的 comports,无需 for 循环)

import serial.tools.list_ports

ports = serial.tools.list_ports.comports()

print(ports)
#[<serial.tools.list_ports_common.ListPortInfo object at 0x000001D48771C9B0>, <serial.tools.list_ports_common.ListPortInfo object at 0x000001D48866FB00>]
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,comports 不可读,我可以通过 for 循环使其可读,但我需要将其放在具有可读单词的列表中,例如。[“COM1”,“COM2”,“COM3”]

有人有任何想法来改变它吗?我尝试创建一个新列表并附加到循环中也没有运气。当我打印出来时,结果是一样的。

更新:我认为我上次所做的是将每个对象再次附加在一起。我可以使用下面的代码获取我想要的 COM 特定信息:

import serial.tools.list_ports

ports = serial.tools.list_ports.comports()

available_ports = []

for p in ports:
    available_ports.append(p.device)

print(available_ports)
Run Code Online (Sandbox Code Playgroud)

python port pyserial python-3.5

5
推荐指数
1
解决办法
1万
查看次数

何时刷新 Pyserial 缓冲区?

我正在使用 Pyserial,并且有一个关于刷新输入和输出缓冲区的最佳实践的问题。目前,我在发送命令之前重置输出缓冲区,并在读取回复之前重置输入。看来我偶尔会错过回复的开始,因此我正在考虑修改我的程序以在发送命令之前重置输入缓冲区。我还在考虑链接我的发送和接收函数,以便发送始终调用接收并希望收紧循环。

    def send_cmd(self, cmd_to_send):
        self.ser.reset_output_buffer()
        self.ser.write(cmd_to_send)

    def receive_cmd(self):
        self.ser.reset_input_buffer()
        # Read logic below
Run Code Online (Sandbox Code Playgroud)

考虑过渡到这样的事情

    def send_cmd(self, cmd_to_send):
        self.ser.reset_output_buffer()
        self.ser.reset_input_buffer()
        self.ser.write(cmd_to_send)
        self.receive_cmd()

    def receive_cmd(self):
        # Read logic below
Run Code Online (Sandbox Code Playgroud)

python serial-port pyserial

5
推荐指数
1
解决办法
9591
查看次数

如何使用“serial.tools.list_ports”python 模块获取可用串行端口的列表?

我是 python 新手,我需要一个可用串行端口列表来在程序中选择其中一个。根据This,该serial.tools.list_ports模块可以通过执行方法为我做到这一点serial.tools.list_ports.comports()。因此,我在python解释器中执行了以下代码:

import serial.tools.list_ports
a=serial.tools.list_ports.comports()
print(a)
Run Code Online (Sandbox Code Playgroud)

结果是:

[<serial.tools.list_ports_linux.SysFS object at 0x7f2503d27be0>]
Run Code Online (Sandbox Code Playgroud)

ubuntu当我在终端中使用以下命令时

python3 -m serial.tools.list_ports
Run Code Online (Sandbox Code Playgroud)

它返回我想要的:

/dev/ttyUSB0        
1 ports found
Run Code Online (Sandbox Code Playgroud)

哪里有问题?

python pyserial python-3.x

5
推荐指数
1
解决办法
2万
查看次数

pySerial 中的 readline() 有时会捕获从 Arduino 串行端口流式传输的不完整值

每隔一秒,Arduino 就会(串行)打印“当前时间(以毫秒为单位)和 Hello world ”。在串行监视器上,输出看起来不错。

但在 中pySerial,有时字符串中间会出现换行符。

313113   Hel
lo world
314114   Hello world
315114   Hello world
Run Code Online (Sandbox Code Playgroud)

我的Python代码如下:

import serial
import time
ser = serial.Serial(port='COM4',
                    baudrate=115200,
                    timeout=0)

while True:
   str = ser.readline()         # read complete line
   str = str.decode()           # decode byte str into Unicode
   str = str.rstrip()           

   if str != "":
      print(str)
   time.sleep(0.01)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

我的配置:

Python 3.7
pySerial 3.4
板 Arduino Mega

python arduino pyserial python-3.x

5
推荐指数
1
解决办法
5650
查看次数