我有一个 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 ...
一切都是平等的,除了我现在在 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
。)