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

时间:2019-03-08 13:57:12

标签: linux python-3.x ubuntu pyserial

我有一个专有设备,该设备已通过USB电缆连接到计算机。

在我的Xubuntu安装上运行代码时,我无法成功读取(或写入,或两者兼有?)。

注意:相同的逻辑在 Windows (在7、8和10上测试)和 Mac (在优胜美地和莫哈韦沙漠)。

这是我要运行的代码(为简单起见,对一些值进行了硬编码):

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设备电缆。

  • 我已经尝试了计算机上的所有端口。

  • 代码在所有操作系统上都完全相同,只是端口名称由于所述操作系统的性质而有所不同。

  • 已确认串行端口为我需要的设备(我打印名称),并已确认为打开(我打印出串行对象)。

  • 我玩过超时波特率,但无济于事。

  • 我尝试用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给出的建议。不好运。

  • 我研究并尝试过的其他一些SO问题(无特定顺序):

任何信息/想法将不胜感激!

[EDIT2] 这个问题变得更加奇怪。这是我今天尝试过的:

  • 首先,我在Windows机器上对Arduino进行了编程,以不断打印数字并在接收到任何东西时使LED闪烁。然后,我在Linux机器上进行了测试,一切正常。

  • 然后,我们对硬件进行编程以执行相同的操作-不断打印数字,如果收到任何提示,则使LED闪烁。

  • 即使逻辑相同,它仍然无法读取或写入任何内容。我什至尝试使用GtkTerm来检查设备和计算机之间正在通信的内容。没事。

  • 但是!向设备发送“ X”会触发一个小型的定制终端,该终端具有一些内置命令,例如用于压力测试的“ S”等。

  • 此处的重要命令是“ E”,它退出终端。如果完成此操作(在GtkTerm中),则设备突然开始打印前面提到的那个号码。直觉是在Linux上(或至少在GtkTerm中),无论出于何种原因,“ X”都会发送到设备。因此,我们尝试退出该自定义终端。

  • 不幸的是,这不是在Python中实现的。它仍然继续接收与前面所述相同的数据包。

  • 所以...我们被困住了。但似乎这是固件问题,捆绑,其中包含一些操作系统的怪异现象。如果我们能解决的话会更新。

2 个答案:

答案 0 :(得分:0)

如果在将用户添加到组dialout后没有重新启动计算机,请尝试执行此操作。

尝试在连接时发送与您的设备有关的其他信息,例如XON/XOFFparitystopbits等。

在脚本的开头添加# coding: utf-8

答案 1 :(得分:0)

解决方案:

操作系统在初始连接后5-6秒钟将“ X”发送到设备。

无论启动什么应用程序,都会发生这种情况。它是在后台执行的。

我们对固件进行了编程,以使“ X”启动调试模式,该模式用于测试硬件的状态。必须先退出它,然后才能发送/接收任何有价值的东西。

我不确定系统为什么发送此字符,或者是否仅在单个安装中发生,但这是一台准系统计算机,几乎没有其他软件除了VS Code和Git之外,还安装了其他软件。

[最终更新]

在运行Linux的其他系统(更具体地说是Fedora实例)上也观察到相同的问题。