繁体   English   中英

串行端口在重写的Python代码中不起作用

[英]Serial port does not work in rewritten Python code

我有一个Python程序,它从Arduino读取一些参数并将其存储在数据库中。 串口设置和使用如下:

ser = serial.Serial(port=port, baudrate=9600)
ser.write('*')
while 1 :
    ser.write('*')
    out = ''
    # Let's wait one second before reading output (let's give device time to answer).
    time.sleep(1)
    while ser.inWaiting() > 0:
        out += ser.read(1)
    if out != '': 
        etc ... handling data

(Arduino设置为当它收到一个星形时,它会发回一个数据字符串。)我想把它重写为一个守护进程 ,所以我使用的是python-daemon库。 init -part中,我只定义端口名称,然后:

def run(self):
    self.ser = serial.Serial(port=self.port,baudrate=9600)
    while True:
        self.ser.write('*')
        out = ''
        # Let's wait one second before reading output (give device time to answer).
        time.sleep(1)
        while self.ser.inWaiting() > 0:
            out += self.ser.read(1)
        if out != '':
            etc ...

一切都是平等的,除了我现在在App对象中进行串行处理。 第一个版本运行正常,当我尝试运行后者时,我得到了

File "storedaemon.py", line 89, in run
 while self.ser.inWaiting() > 0:
 File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 435, in inWaiting
 s = fcntl.ioctl(self.fd, TIOCINQ, TIOCM_zero_str)
 IOError: [Errno 9] Bad file descriptor

我无法看到发生了什么变化 - 除了我在新对象中抛出代码。 我已尝试在init和run中进行初始化 ,但最终得到的结果相同。

(完整的脚本可以在hhv3.sickel.net/b/storedata.pyhhv3.sickel.net/b/storedaemon.py 。)

在应用程序的守护程序期间,除stdin,stderr和stdout外,所有文件处理程序都将关闭。 这包括与/dev/log的连接,然后失败并出现fd错误(因此看起来这与串行fd无关,而是与处理程序的套接字无关)。

您需要将此FD添加到排除列表:

class App():
    def __init__(self):
        ...
        self.files_preserve = [handler.socket]
        ...

或者,在守护进程分叉后设置处理程序:

class App():
    def run(self):
        handler = logging.handlers.SysLogHandler(address = '/dev/log')
        my_logger.addHandler(handler)
        my_logger.debug(appname+': Starting up storedata')
        ...

在我的测试中,两个版本运行正常

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM