我在Ubuntu上运行一个相当简单的python代码,用于与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分钟后导致此错误的原因是什么?
提前致谢!
答案 0 :(得分:1)
看看:
http://ubuntuforums.org/showthread.php?t=2057988
问题是由于udev为设备提供了动态名称。过了一会儿,机器重新注册了arduino并分配了一个新的端口号。它被分配了一个新的端口号,因为驱动程序在它被删除时被打嗝。并且&#39;添加&#39; arduino几乎同时出现。
为udev创建新规则以为设备分配静态端口将有所帮助。
答案 1 :(得分:1)
好吧,我遇到了同样的错误。我所做的真正有效的是简单地使用 connection.close()
关闭串行连接并使用 connection = serial.Serial(port,baudrate = baudrate)
重新建立它。特别是当 IOError[Errno 5] 发生时。您可以使用 try 和 catch 来处理。