gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 17:47:17 25 4
gpt4 key购买 nike

我有一个 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 被设置为当它收到一颗星星时,它会发回一个数据字符串。)我想将其重写为 daemon ,所以我正在使用 python-daemon 库。在 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 ...

一切都是平等的,除了我现在在应用程序对象中进行串行处理。第一个版本运行良好,当我尝试运行后者时,我得到了

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 和运行中都进行初始化,但我最终得到了相同的结果。

(完整的脚本可在 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]
...

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

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

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

关于python - 串行端口在重写的 Python 代码中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16243752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com