1

我可以连接到一个电表(波特率 300!),228 行的日志文件慢慢进入。

line = ser.readline(eol='!') 
print line

如果我使用上面的代码,则会显示完整的日志文件。如果我用 match 解析单独保存的日志文件,它会将正确的值分类到 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()

我试过没有成功:

ser.readline(eol='!') = z   
for line in z:
match..

引发错误 SyntaxError:无法分配给函数调用

4

1 回答 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)
于 2011-02-02T15:54:07.867 回答