在Python

时间:2015-10-30 17:23:04

标签: python ubuntu arduino serial-port ioerror

我在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分钟后导致此错误的原因是什么?

提前致谢!

2 个答案:

答案 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 来处理。