标准模式Linky电表TIC读取异常,求适配的Python串口脚本
Linky电表标准模式TIC接口读取问题解决及Python脚本示例
核心问题分析
Linky电表的**标准模式(Mode Standard)和历史模式(Mode Historique)**通信逻辑完全不同:
- 历史模式是单向推送:电表主动持续发送数据,无需外部触发,所以原脚本(仅被动读取)能正常工作。
- 标准模式是双向通信:必须先向电表发送启动命令帧,电表才会返回数据块,之后还可以发送其他命令请求特定数据。
原脚本无法运行的原因就是缺少了启动通信的关键步骤。
解决步骤
确认电表配置:
- 通过电表显示屏操作,进入设置菜单,将TIC接口模式设为
Standard(部分型号显示为Mode C)。 - 确认波特率为
9600(标准模式默认值,部分电表可修改,需保持与脚本一致)。
- 通过电表显示屏操作,进入设置菜单,将TIC接口模式设为
硬件连接检查:
- 使用3.3V电平的USB-TTL模块(禁止用5V模块,避免损坏电表)。
- 接线对应:模块TX → 电表TIC RX;模块RX → 电表TIC TX;模块GND → 电表GND。
标准模式专用Python脚本示例
import serial import time def calculate_bcc(frame): # 计算Linky TIC帧的BCC校验(所有字节异或) bcc = 0 for byte in frame: bcc ^= byte return bcc def send_start_frame(ser): # 构造标准模式启动帧:STX(0x02) + "0" + ETX(0x03) + BCC start_frame = b'\x020\x03' bcc = calculate_bcc(start_frame) start_frame += bytes([bcc]) ser.write(start_frame) time.sleep(0.1) # 等待电表响应 def read_tic_data(ser): buffer = b'' while True: byte = ser.read() if not byte: continue buffer += byte # 检测帧结束(ETX + BCC) if len(buffer) >= 2 and buffer[-2] == 0x03: # 校验BCC received_bcc = buffer[-1] calculated_bcc = calculate_bcc(buffer[:-1]) if received_bcc == calculated_bcc: # 解析帧内容(去掉STX和ETX) data = buffer[1:-2].decode('ISO-8859-1') # 按分号拆分数据项 for item in data.split(';'): if item: print(item) buffer = b'' # 每读取一帧后,重新发送启动帧获取下一组数据 send_start_frame(ser) else: # 校验失败,清空缓冲区 print("BCC校验失败,丢弃帧") buffer = b'' if __name__ == "__main__": try: # 初始化串口(参数与电表配置一致) ser = serial.Serial( port='/dev/ttyUSB1', baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1 ) print("串口连接成功,发送启动帧...") send_start_frame(ser) read_tic_data(ser) except KeyboardInterrupt: print("\n用户终止程序") except Exception as e: print(f"错误:{e}") finally: if 'ser' in locals() and ser.is_open: ser.close() print("串口已关闭")
脚本说明
send_start_frame函数:构造并发送标准模式的启动命令帧,触发电表发送数据。calculate_bcc函数:实现Linky TIC帧的异或校验,确保数据完整性。read_tic_data函数:持续读取电表响应,校验帧完整性后解析并打印数据项。- 每次读取完一帧数据后,会重新发送启动帧,持续获取最新数据。
内容的提问来源于stack exchange,提问作者Jean-Paul Pique
相关产品推荐
相关产品推荐

