python - Python 中长期串行连接出现 IO 错误 [Errno 5]

标签 python ubuntu arduino serial-port ioerror

我正在 Ubuntu 上运行一个相当简单的 python 代码,用于与 Arduino 进行通信。该代码按预期运行大约 15 分钟,然后抛出 I/O 错误 [Errno 5]。我搜索了许多有关此错误消息的线程,但似乎找不到适合我需要的解决方案。

Python 代码通过串口向 Arduino 发送命令,Arduino 执行该命令的任何操作。当抛出此错误时,Arduino 会被迫放弃其原始端口号。它从“/dev/ttyACM1”到“/dev/ttyACM2”

起初我以为这与 Arduino 的自动重置功能有关,我在 Reset 和 +5V 引脚之间使用 120 欧姆电阻绕过了该功能。这并没有解决问题。

接下来,我认为这是因为 Ubuntu 机器因不活动而自行挂起,因此我禁用了省电功能,但没有任何改善。

此外,我将最初运行 python 代码的终端 session 保持打开状态。

我确定问题与串行端口号问题有关,因为错误是由失败的 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 被机器重新注册,并被分配一个新的端口号。它被分配了一个新的端口号,因为驱动程序在几乎同时“删除”和“添加”arduino 时会打嗝。

为 udev 创建新规则来为设备分配静态端口将会有所帮助。

关于python - Python 中长期串行连接出现 IO 错误 [Errno 5],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33441579/

相关文章:

python - 如何将一种类型的标签替换为另一种类型的标签 (<a ...>..</a> => <p>..</p>)

mysql db 的 Python 结果与实际值不匹配 : comparison of values

Python JSON数据加载令人困惑的 "expecting , delimiter"错误

python - Python如何顺序读取目录下的所有文件并导出内容?

ubuntu - 如何将 nvim 路径更改为 .config

postgresql - Docker 容器中 PostgreSQL 的权限问题

arduino - 如何读取多个模拟传感器

macos - 如何在终端中设置 Mac 的波特率

php - 如何清除所有用户的 session ?

c - arduino 按钮不起作用