Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
串行端口在重写的Python代码中不起作用_Python_Serial Port_Arduino_Daemon - Fatal编程技术网

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

串行端口在重写的Python代码中不起作用,python,serial-port,arduino,daemon,Python,Serial Port,Arduino,Daemon,我有一个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

我有一个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守护程序库。在init部分中,我只定义端口名,然后:

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.py
hhv3.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')
        ...

这两个版本在我的测试中都运行良好。

看起来您在代码中混合了制表符和空格,这真是个坏主意:另外,您使用的是哪个守护程序库?(我知道它有点旧,但它似乎是“默认”版本)-我使用的是debian中安装的版本。我尝试过没有守护程序库的守护程序版本-调用
app.run()
,而不是创建守护程序?