我有一个专有设备,该设备已通过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/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中实现的。它仍然继续接收与前面所述相同的数据包。
所以...我们被困住了。但似乎这是固件问题,捆绑,其中包含一些操作系统的怪异现象。如果我们能解决的话会更新。
答案 0 :(得分:0)
如果在将用户添加到组dialout
后没有重新启动计算机,请尝试执行此操作。
尝试在连接时发送与您的设备有关的其他信息,例如XON/XOFF
,parity
,stopbits
等。
在脚本的开头添加# coding: utf-8
。
答案 1 :(得分:0)
解决方案:
操作系统在初始连接后5-6秒钟将“ X”发送到设备。
无论启动什么应用程序,都会发生这种情况。它是在后台执行的。
我们对固件进行了编程,以使“ X”启动调试模式,该模式用于测试硬件的状态。必须先退出它,然后才能发送/接收任何有价值的东西。
我不确定系统为什么发送此字符,或者是否仅在单个安装中发生,但这是一台准系统计算机,几乎没有其他软件除了VS Code和Git之外,还安装了其他软件。
[最终更新]
在运行Linux的其他系统(更具体地说是Fedora实例)上也观察到相同的问题。