pyserial连接正常,但如何处理ser.readline()的输出?
我可以连接到一个能量计(波特率300!),日志文件有228行,数据慢慢进来。
line = ser.readline(eol='!')
print line
如果我使用上面的代码,整个日志文件都会显示出来。而且如果我用匹配的方法单独解析保存的日志文件,它能把正确的值整理到sqlite数据库里。所以这两个“部分”各自都能正常工作。
但是我的脚本无法把输出传递过去进行解析。它没有报错,只是显示给出的值都是0。
我缺少了什么呢?我开始以为是脚本运行得太快,跟不上慢慢输入的数据(需要超过一分钟),但脚本在完成之前等得够久。
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import serial
import time
import re
import sqlite3
ser = serial.Serial()
ser.baudrate = 300
ser.port = '/dev/ttyUSB0'
ser.timeout = 20
ser.parity = serial.PARITY_EVEN
ser.stopbits = serial.STOPBITS_ONE
ser.bytesize = serial.SEVENBITS
ser.open()
ser.isOpen()
#initiating logfile-output with /?!
time.sleep(2)
ser.write("/?!")
#time.sleep(0.001)
ser.write("\r\n")
time.sleep(2)
connection = sqlite3.connect('/var/www/zaehler/test1.db')
cursor = connection.cursor()
extrakt = []
#line = ser.readline(eol='!')
#print line-would work
for line in ser.readline(eol='!'):
match = re.search(r'(0\.0\.0|0\.9\.1|0\.9\.2|1\.6\.1|1\.8\.1)\(([0-9\.]+)', line)
if match:
version,value = match.groups()
extrakt.append(value)
cursor.execute('INSERT INTO energielog (sernr, time, date, peak, kwh) values (?, ?, ?, ?, ?)', extrakt)
connection.commit()
ser.close()
cursor.close()
connection.close()
1 个回答
1
我建议你使用WHILE循环,而不是FOR循环。因为readline这个函数不是一个可迭代的东西,所以你不能直接用它来循环取值。你写的这一行代码并没有达到你想要的效果:
for line in ser.readline(eol='!')
相反,你可以试试这样写:
ss = r'(0\.0\.0|0\.9\.1|0\.9\.2|1\.6\.1|1\.8\.1)\(([0-9\.]+)'
while (True):
line = ser.readline(eol='!')
if (len(line) == 0):
break
match = re.search(ss, line)
if match:
version,value = match.groups()
extrakt.append(value)