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