Python 中长期串行连接的 IO 错误 [Errno 5]
IO Error [Errno 5] with long term Serial Connection in Python
我是 运行 一个相当简单的 python Ubuntu 代码,用于与 Arduino 通信。该代码按预期工作约 15 分钟,然后抛出 I/O 错误 [Errno 5]。我搜索了很多关于此错误消息的主题,但似乎找不到适合我需要的解决方案。
python 代码通过串行端口向 Arduino 发送命令,arduino 执行该命令的任何操作。抛出此错误时,Arduino 将被迫关闭其原始端口号。它从“/dev/ttyACM1”到“/dev/ttyACM2”
起初我认为这与 Arduino 的自动复位功能有关,我在复位和 +5V 引脚之间用一个 120 欧姆的电阻绕过了它。这并没有解决问题。
其次,我认为是Ubuntu机器因不活动而挂起,所以我禁用了那个省电功能,但没有改善。
此外,我让终端会话保持打开状态,其中 python 代码最初是 运行。
我确定问题与串口号问题有关,因为错误是由失败的 ser.write 命令触发的
产生该错误的python代码的子程序如下:
def sc_loop(ptime,maxiter, file):
iter = 1 ## Initialize cycle count
totalvol = 0
cyclevol = 0
while iter < maxiter:
ts = time.time()
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
print >>file, st, " - pump cycle #", iter
## Tell the arduino to begin pumping
ser.write("1".encode())
pump = ser.readline()
if pump == 'P':
ts = time.time()
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
print >>file, st, " - Sample chamber pump turned ON"
ts = time.time()
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
print >>file, st, " - Sample chamber pump turned ON"
time.sleep(ptime)
ser.write("2".encode())
ts2 = time.time()
st2 = datetime.datetime.fromtimestamp(ts2).strftime('%Y-%m-%d %H:%M:%S')
print >>file, st2, " - Sample Chamber Pump turned OFF"
print >>file, st2, " - Pump was on for",ts2-ts, "seconds"
cyclevol = 0.0667*(ts2-ts)
print >>file, st2, " - ", cyclevol," mL of sample were pumped this cycle"
totalvol = totalvol+cyclevol
print >>file, st2, " - ", totalvol, " mL of sample have been pumped so far"
time.sleep(3)
runcamera(file) ## Run camera
## imaged = raw_input("Sample is ready for imaging [Press any key once imaged] ")
iter = iter+1
return
此代码可以完美运行,尽管是暂时的。我的问题是,在 python 代码 运行 的 10-15 分钟后导致此错误的原因是什么?
提前致谢!
看看:
http://ubuntuforums.org/showthread.php?t=2057988
问题是由于 udev 为设备提供了动态名称。过了一会儿,arduino被机器重新注册,并分配了一个新的端口号。它被分配了一个新的端口号,因为驱动程序在 'removes' 和 'adds' arduino 几乎同时打嗝。
为 udev 创建一个新规则来为设备分配一个静态端口将会有所帮助。
嗯,我运行陷入了同样的错误。我所做的真正有效的是简单地用 connection.close()
关闭串行连接并用 connection = serial.Serial(port,baudrate = baudrate)
重新建立它。特别是当 IOError[Errno 5] 发生时。您可以使用 try 和 catch 来处理它。
我是 运行 一个相当简单的 python Ubuntu 代码,用于与 Arduino 通信。该代码按预期工作约 15 分钟,然后抛出 I/O 错误 [Errno 5]。我搜索了很多关于此错误消息的主题,但似乎找不到适合我需要的解决方案。
python 代码通过串行端口向 Arduino 发送命令,arduino 执行该命令的任何操作。抛出此错误时,Arduino 将被迫关闭其原始端口号。它从“/dev/ttyACM1”到“/dev/ttyACM2”
起初我认为这与 Arduino 的自动复位功能有关,我在复位和 +5V 引脚之间用一个 120 欧姆的电阻绕过了它。这并没有解决问题。
其次,我认为是Ubuntu机器因不活动而挂起,所以我禁用了那个省电功能,但没有改善。
此外,我让终端会话保持打开状态,其中 python 代码最初是 运行。
我确定问题与串口号问题有关,因为错误是由失败的 ser.write 命令触发的
产生该错误的python代码的子程序如下:
def sc_loop(ptime,maxiter, file):
iter = 1 ## Initialize cycle count
totalvol = 0
cyclevol = 0
while iter < maxiter:
ts = time.time()
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
print >>file, st, " - pump cycle #", iter
## Tell the arduino to begin pumping
ser.write("1".encode())
pump = ser.readline()
if pump == 'P':
ts = time.time()
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
print >>file, st, " - Sample chamber pump turned ON"
ts = time.time()
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
print >>file, st, " - Sample chamber pump turned ON"
time.sleep(ptime)
ser.write("2".encode())
ts2 = time.time()
st2 = datetime.datetime.fromtimestamp(ts2).strftime('%Y-%m-%d %H:%M:%S')
print >>file, st2, " - Sample Chamber Pump turned OFF"
print >>file, st2, " - Pump was on for",ts2-ts, "seconds"
cyclevol = 0.0667*(ts2-ts)
print >>file, st2, " - ", cyclevol," mL of sample were pumped this cycle"
totalvol = totalvol+cyclevol
print >>file, st2, " - ", totalvol, " mL of sample have been pumped so far"
time.sleep(3)
runcamera(file) ## Run camera
## imaged = raw_input("Sample is ready for imaging [Press any key once imaged] ")
iter = iter+1
return
此代码可以完美运行,尽管是暂时的。我的问题是,在 python 代码 运行 的 10-15 分钟后导致此错误的原因是什么?
提前致谢!
看看:
http://ubuntuforums.org/showthread.php?t=2057988
问题是由于 udev 为设备提供了动态名称。过了一会儿,arduino被机器重新注册,并分配了一个新的端口号。它被分配了一个新的端口号,因为驱动程序在 'removes' 和 'adds' arduino 几乎同时打嗝。
为 udev 创建一个新规则来为设备分配一个静态端口将会有所帮助。
嗯,我运行陷入了同样的错误。我所做的真正有效的是简单地用 connection.close()
关闭串行连接并用 connection = serial.Serial(port,baudrate = baudrate)
重新建立它。特别是当 IOError[Errno 5] 发生时。您可以使用 try 和 catch 来处理它。