我试图通过P1接口读出我的智能电表。 一些python脚本被发布到web上,我尝试了它们,但是似乎从我的串行接口中得到了一些部分垃圾(不是完全的),所以我的假设是串行设置是正确的。另外,因为我是从其他似乎有效的脚本中复制的)。在
当试图读出使用cu命令的接口时,它确实显示了正确的输出,所以我的硬件似乎可以工作。在
我正在运行这个:Linux版本3.10.25+(dc4@dc4-臂-01)(gcc版本4.7.2 20120731(预发布)(crosstool NG linaro-1.13.1+bzr2458-linaro gcc 2012.08))#622 PREEMPT 2014年1月3日星期五18:41:00 GMT
以下是输出的外观-检索方式:
命令:
cu -l /dev/ttyUSB0 -s 9600 --parity=none
输出
^{pr2}$使用以下Python代码:
# DSMR P1 uitlezen
# (c) 10-2012 - GJ - gratis te kopieren en te plakken
versie = "1.0"
import sys
import serial
##############################################################################
#Main program
##############################################################################
print ("DSMR P1 uitlezen", versie)
print ("Control-C om te stoppen")
print ("Pas eventueel de waarde ser.port aan in het python script")
#Set COM port config
ser = serial.Serial()
ser.baudrate = 9600
ser.bytesize=serial.SEVENBITS
ser.parity=serial.PARITY_EVEN
ser.stopbits=serial.STOPBITS_ONE
ser.xonxoff=0
ser.rtscts=0
ser.timeout=20
ser.port="/dev/ttyUSB0"
#Open COM port
try:
ser.open()
except:
sys.exit ("Fout bij het openen van %s. Aaaaarch." % ser.name)
#Initialize
#p1_teller is mijn tellertje voor van 0 tot 20 te tellen
p1_teller=0
while p1_teller < 20:
p1_line=''
#Read 1 line van de seriele poort
try:
p1_raw = ser.readline()
print str(p1_teller),':', p1_raw
except:
sys.exit ("Seriele poort %s kan niet gelezen worden. Aaaaaaaaarch." % ser.name )
#p1_str=str(p1_raw)
#p1_line=p1_str.strip()
# als je alles wil zien moet je de volgende line uncommenten
#print (p1_line.encode('ascii','ignore'))
p1_teller = p1_teller +1
#Close port and show status
try:
ser.close()
except:
sys.exit ("Oops %s. Programma afgebroken. Kon de seriele poort niet sluiten." % ser.name )
输出变成:
('DSMR P1 uitlezen', '1.0')
Control-C om te stoppen
Pas eventueel de waarde ser.port aan in het python script
0 : INTENTIONALLY ALTERED BUT ALSO WITH THE ? SYMBOLS IN THE ORIGINAL OUTPUT
1 : �
2 : 0-0:96.�.�(393�393635353�30�0�0�0�0�0�0�0�0��
3 : �-0:�.�.�(05090.�9����詍
4 : �-0:�.�.�(066��.��3���詍
5 : �-0:�.�.�(00000.000���詍
6 : �-0:�.�.�(00000.000���詍
7 : 0-0:96.��.0(000���
8 : �-0:�.�.0(0000.�0��ש�
9 : �-0:�.�.0(0000.00��ש�
10 : 0-0:��.0.0(999�A��
11 : 0-0:96.3.�0(���
12 : 0-0:96.�3.�(��
13 : 0-0:96.�3.0(��
14 : 0-�:96.�.0(3�3�303�3�30303�3�303333363�3�3�3���
15 : 0-�:��.�.0(03��
16 : 0-�:��.3.0(��0�06��0000�(�é(60�(��(0-�:��.�.0�(�3��
17 : (03���.�0���
18 : 0-�:��.�.0(���
19 : !�
所以在我的python输出中有很多字符,我认为这是一些编码问题。。但不确定也不确定如何解决这个问题。。。所以任何帮助都是感激的。在
这就是我最终如何修复它的方法-也将尝试Ldevries方法。。。。看上去很干净:
看起来您读取的字节可能仍然包含奇偶校验位,使它们成为无效字符。尝试删除第8位:
我想这和数据解码有关。使用textIOWrapper解码对我来说很好。希望你能以我的观点做任何事情:
为了使p1协议的读取尽可能容易,我建议使用前面提到的TextIOWrapper,这样您仍然可以使用readline方法读取串行端口。“!”总是结束P1电报,这样可以用来检测消息的结尾,而不是使用计数器。当收到完整的电报后,可以对电报进行处理。示例:
祝你好运!在
相关问题 更多 >
编程相关推荐