You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

标准模式Linky电表TIC读取异常,求适配的Python串口脚本

Linky电表标准模式TIC接口读取问题解决及Python脚本示例

核心问题分析

Linky电表的**标准模式(Mode Standard)和历史模式(Mode Historique)**通信逻辑完全不同:

  • 历史模式是单向推送:电表主动持续发送数据,无需外部触发,所以原脚本(仅被动读取)能正常工作。
  • 标准模式是双向通信:必须先向电表发送启动命令帧,电表才会返回数据块,之后还可以发送其他命令请求特定数据。

原脚本无法运行的原因就是缺少了启动通信的关键步骤。

解决步骤

  1. 确认电表配置:

    • 通过电表显示屏操作,进入设置菜单,将TIC接口模式设为Standard(部分型号显示为Mode C)。
    • 确认波特率为9600(标准模式默认值,部分电表可修改,需保持与脚本一致)。
  2. 硬件连接检查:

    • 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:17:14