解决“无法使用python脚本在Rpi上导出GPIO问题

时间:2019-09-19 17:50:57

标签: python-3.x

我正在编写一个python应用程序,该应用程序通过SPI端口对atmel微控制器进行编程和测试。

该应用程序在RaspberryPi 3B +模型上运行,我使用命令行应用程序“ avrdude”来完成这项工作。我在我的python脚本中使用subprocess.Popen(),并且总体来说运行良好。

有时,SPI端口处于阻塞状态。然后,avrdude应用程序通常会报告类似“无法导出GPIO 8,是否已导出/忙碌?:设备或资源忙碌”

可以通过以下方法观察导出的GPIO:

pi@LeptestPost:/ $ ls /sys/class/gpio/
export  gpio10  gpio11  gpio8  gpiochip0  gpiochip504  unexport

我通过调用以下方法摆脱了这种情况:

pi@LeptestPost:/ $ sudo echo 8 > /sys/class/gpio/unexport

导致:

pi@LeptestPost:/ $ ls /sys/class/gpio/
export  gpio10  gpio11  gpiochip0  gpiochip504  unexport

因此,我可以全部取消导出并手动继续,但是我希望使用以下代码(在avrdude输出中检测到错误之后)在应用程序中将其自动化:

    args = ['sudo', 'echo', '8', '>', '/sys/class/gpio/unexport']
    result, error = self.runCommand(args, wait=True)


    def runCommand(self, args, wait = False, outputFileStr = "", errorFileStr = "", workingDir = ""):
    # documentation:
    #class subprocess.Popen(args,
    #                       bufsize=-1,
    #                       executable=None,
    #                       stdin=None,
    #                       stdout=None,
    #                       stderr=None,
    #                       preexec_fn=None,
    #                       close_fds=True,
    #                       shell=False,
    #                       cwd=None,
    #                       env=None,
    #                       universal_newlines=None,
    #                       startupinfo=None,
    #                       creationflags=0,
    #                       restore_signals=True,
    #                       start_new_session=False,
    #                       pass_fds=(),
    #                       *,
    #                       encoding=None,
    #                       errors=None,
    #                       text=None)

        print("Working on executing command " + str(args))
        if (outputFileStr != ""):
            stdoutFile = open(outputFileStr,'w')
        else:
            stdoutFile = None
        if (errorFileStr != ""):
            stderrFile = open(errorFileStr,'w')
        else:
            stderrFile = None
        if (workingDir != ""):
            cwdStr = workingDir
        else:
            cwdStr = None
        try:
            if (wait):
                p = subprocess.Popen(args, stdout = subprocess.PIPE, cwd = cwdStr)
                print("started subprocess with PID " + str(p.pid))
                p.wait() # Wait for child process to terminate, This will deadlock when using stdout=PIPE or stderr=PIPE
            else:
                #p = subprocess.Popen(args, stdin = None, stdout = None, stderr = None, close_fds = True)
                p = subprocess.Popen(args, stdin = None, stdout = stdoutFile, stderr = stderrFile, close_fds = True, cwd = cwdStr)
                print("started subprocess with PID " + str(p.pid))
            (result, error) = p.communicate(timeout=15) # Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached.           
        except subprocess.CalledProcessError as e:
            sys.stderr.write("common::run_command() : [ERROR]: output = %s, error code = %s\n" % (e.output, e.returncode))
            return e.output, e.returncode
        except FileNotFoundError as e:
            self.master.printERROR("common::run_command() : [ERROR]: output = %s, error code = " + str(e) + "\n")
            return "error", str(e)
        except subprocess.TimeoutExpired as e:
            self.master.printERROR("Process timeout on PID "+ str(p.pid) + ", trying to kill \n")
            p.kill()
            outs, errs = p.communicate()
            return "error", str(e)
        if (outputFileStr != ""):
            stdoutFile.close()        
        if (errorFileStr != ""):
            stderrFile.close()
        return result, error     

但这不能完成任务(没有错误,不是想要的结果)。我可以想象这与该过程如何在其外壳或环境中启动有关-但这超出了我的了解。

有任何想法如何使其正常工作吗?

注意:也可以使用'runco​​mmand'方法调用avrdude应用程序,并且运行良好。

0 个答案:

没有答案