linux - 在Linux(Xubuntu 18.04)上无法使用pyserial进行读取/写入

标签 linux python-3.x ubuntu 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上的行为相同。
额外信息
在Python3.5上运行。
我用的是完全相同的USB设备和数据线。
我试过电脑上的所有端口。
所有操作系统上的代码都是完全相同的,只是端口名因所述操作系统的性质不同而有所不同。
串行端口被确认为我需要的设备(我打印名称)并被确认为打开(我打印出串行对象)。
我玩过超时和波特率,但没有用。
我试过用一个if(ser.in_waiting): reply = ser.read()来交换阅读,但没有什么真正的改变。
我已验证设备是否在端口/dev/ttyACM0上。
遇到OSError:[Errno 13]权限被拒绝:'/dev/ttyACM0'错误后,我已将权限添加到该端口。
在阅读了此处的一些解决方案后,通过同时使用sudo chmod 666 /dev/ttyACM0sudo usermod -aG dialout $USER添加了权限。
我用time.sleep()做过实验。
[编辑]尝试了@michael-o给出的建议。运气不好。
其他一些我研究和尝试过的问题,没有特别的顺序:
Serial Ports Linux vs Windows
OSError: [Errno 13] Permission denied: '/dev/ttyACM0' - using pyserial from Python to Arduino
pySerial can write, but not read
PySerial non-blocking read loop
任何信息/想法将不胜感激!
[编辑2]这个问题变得更加奇怪。我今天试过的是:
首先,我在Windows机器上编程了一个Arduino,让它不断地打印一个数字,如果接收到任何东西,它就会闪烁LED。然后我在Linux机器上测试,一切都很好。
然后,我们对硬件进行了编程,以实现同样的功能——不断打印一个数字,如果收到任何信号,LED就会闪烁。
即使逻辑相同,它仍然无法读取或写入任何内容。我甚至尝试使用GtkTerm来检查设备和计算机之间的通信。没有什么。
然而!向设备发送“X”将触发一个定制的小型终端,该终端具有一些内置命令,如用于压力测试的“S”等。
这里的重要命令是“E”,它退出终端。如果这样做了(在GtkTerm中),设备会突然开始打印前面提到的号码。这里的直觉是,在Linux(或者至少在GtkTerm中)上,“X”被发送到设备是出于任何原因。所以我们试着退出那个定制终端。
不幸的是在Python中没有。它仍然继续接收与前面描述的相同的包。
所以。。。我们卡住了。但似乎这是一个固件问题,与操作系统的一些奇怪的怪癖捆绑在一起。如果我们发现的话会更新的。

最佳答案

如果在将用户添加到组dialout后没有重新启动计算机,请尝试在重新启动计算机后执行此操作。
连接时尝试发送与设备相关的其他信息,如XON/XOFFparitystopbits等。
在脚本开头添加# coding: utf-8

关于linux - 在Linux(Xubuntu 18.04)上无法使用pyserial进行读取/写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55064724/

相关文章:

android - 适用于 Linux 的 Android JETCreator 在哪里?

linux - 在 Go 中使用目录观察器时,等待文件复制完成

c++ - 如何使用 Linux 中的套接字层在 C++ 上编写 .wav 文件?

python - 根据条件过滤元组列表

sqlite - 找不到参数的方法 compile() [项目 ':react-native-sqlite']

c++ - Libusb - ubuntu - Psoc5。 libusb_open_device_with_vid_pid 返回 0

python - 将变量从 python 脚本传递到 bash 脚本

linux - 链接库的 2 个冲突版本

python - 如何在 Tkinter 应用程序上收听终端?

python - 如何在Python中增加数字而不加入它们