linux - 无法在 Linux (Xubuntu 18.04) 上使用 pyserial 读取/写入
问题描述
我有一个专有设备,它通过 USB 电缆连接到我的计算机。
在我的 Xubuntu 安装上运行代码时,我无法成功读取(或写入,或两者?)。
注意:相同的逻辑在Windows(在 7、8 和 10 上测试)和Mac(在 Yosemite 和 Mojave 上测试)上运行得非常完美。
这是我试图运行的代码(为简单起见,硬编码了一些值):
ser = serial.Serial('/dev/ttyACM0', 500000, timeout = 0.03, write_timeout = 0.015)
ser.write(bytes([248, 40, 0]))
ser.flush()
reply = ser.read(40)
当前行为
设备正在运行一些代码来响应它收到的数据包。在这个初始数据包中,我的 Python 代码请求设备状态的完整副本,它以高达 40 字节的数组接收该副本。
在 Linux 上,返回以下内容而不是请求的 40 个字节:
[248, 13, 10, 40, 13, 10, 0, 13, 10]
我发现有趣的是它返回的字节与我尝试写入的字节完全相同,它们之间有 13 和 10。
预期行为 在 Mac 和 Windows 上,都会返回类似这样的内容(内容并不那么重要):
[71, 89, 65, 32, 1, 4, 50, 0, 27, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 238, 1, 255, 255, 136, 1, 255, 255, 255, 255]
预期行为与 Mac 和 Windows 上的行为相同。
额外信息
在 Python 3.5 上运行。
我使用的是完全相同的USB 设备和电缆。
我已经尝试了计算机上的所有端口。
所有操作系统上的代码完全相同,只是端口名称因所述操作系统的性质不同而不同。
串行端口被确认为我需要的设备(我打印名称)并确认打开(我打印出串行对象)。
我玩过timeouts和baudrates,但无济于事。
我试过用 a 交换读取
if(ser.in_waiting): reply = ser.read()
但没有真正改变。我已验证该设备在端口上
/dev/ttyACM0
。在遇到OSError: [Errno 13] Permission denied: '/dev/ttyACM0'错误后,我已向该端口添加了权限。
通过使用两者
sudo chmod 666 /dev/ttyACM0
并sudo usermod -aG dialout $USER
在此处阅读一些解决方案后添加了权限。我已经试验过了
time.sleep()
。[编辑] 尝试了@michael-o给出的建议。没运气。
我研究并尝试过的其他一些 SO 问题,没有特别的顺序:
任何信息/想法将不胜感激!
[EDIT2]问题变得更加奇怪了。这是我今天尝试的:
首先,我在 Windows 机器上编写了一个 Arduino 程序,以不断打印一个数字,并在收到任何内容时使 LED 闪烁。然后我在 Linux 机器上进行了测试,一切都很好。
然后,我们对硬件进行编程以执行相同的操作 - 不断打印一个数字并在收到任何内容时闪烁 LED。
即使逻辑相同,它仍然无法读取或写入任何内容。我什至尝试使用 GtkTerm 来检查设备和计算机之间的通信内容。没有什么。
然而!向设备发送“X”会触发一个小型定制终端,该终端具有一些内置命令,例如用于压力测试的“S”等。
这里重要的命令是“E”,它退出终端。如果这样做了(在 GtkTerm 中),设备会突然开始打印前面提到的那个数字。这里的直觉是在 Linux 上(或至少在 GtkTerm 中),无论出于何种原因,“X”都会发送到设备。所以我们尝试退出那个自定义终端。
不幸的是,这在 Python 中没有。它仍然继续接收与之前描述的相同的数据包。
所以……我们被困住了。但它似乎是与操作系统的一些奇怪怪癖捆绑在一起的固件问题。如果我们弄清楚了,将会更新。
解决方案
如果在将用户添加到组后没有这样做,请尝试在重新启动计算机后执行此操作dialout
。
连接时尝试发送与您的设备相关的附加信息,例如XON/XOFF
、parity
等stopbits
。
# coding: utf-8
在脚本的开头添加。