python实现Lin总线PID与ID对应表

#获取bit位
def get_bit(num):
    bit0 = num >> 0 & 0x1
    bit1 = num >> 1 & 0x1
    bit2 = num >> 2 & 0x1
    bit3 = num >> 3 & 0x1
    bit4 = num >> 4 & 0x1
    bit5 = num >> 5 & 0x1
    return {
        'ID0': bit0,
        'ID1': bit1,
        'ID2': bit2,
        'ID3': bit3,
        'ID4': bit4,
        'ID5': bit5,
        'ID': num,
    }


"""
P0,P1校验位计算公式
P0 = ID0 ⊕ ID1 ⊕ ID2 ⊕ ID4
P1 = ¬(ID1 ⊕ ID3 ⊕ ID4 ⊕ ID5)
"""
# 计算P0,P1校验位的值
def caul_check_bit(bit: dict):
    P0 = bit.get('ID0') ^ bit.get('ID1') ^ bit.get('ID2') ^ bit.get('ID4')
    P1 = bit.get('ID1') ^ bit.get('ID3') ^ bit.get('ID4') ^ bit.get('ID5')
    
    # P1取反
    if P1 == 1:
        P1 -= 1
    else:
        P1 += 1
        
    PID = f"0b{P1}{P0}{bit.get('ID5')}{bit.get('ID4')}{bit.get('ID3')}{bit.get('ID2')}{bit.get('ID1')}{bit.get('ID0')}"
    
    print(f"P0:{P0}    P1:{P1}    ID:0x{bit.get('ID'):02x}    PID:0x{int(PID, 2):02x}")


if __name__ == '__main__':

    for i in range(64):
        dic_bit = get_bit(i)
        caul_check_bit(dic_bit)
       
# 运行结果
"""
P0:0    P1:1    ID:0x00    PID:0x80
P0:1    P1:1    ID:0x01    PID:0xc1
P0:1    P1:0    ID:0x02    PID:0x42
P0:0    P1:0    ID:0x03    PID:0x03
P0:1    P1:1    ID:0x04    PID:0xc4
P0:0    P1:1    ID:0x05    PID:0x85
P0:0    P1:0    ID:0x06    PID:0x06
P0:1    P1:0    ID:0x07    PID:0x47
P0:0    P1:0    ID:0x08    PID:0x08
P0:1    P1:0    ID:0x09    PID:0x49
P0:1    P1:1    ID:0x0a    PID:0xca
P0:0    P1:1    ID:0x0b    PID:0x8b
P0:1    P1:0    ID:0x0c    PID:0x4c
P0:0    P1:0    ID:0x0d    PID:0x0d
P0:0    P1:1    ID:0x0e    PID:0x8e
P0:1    P1:1    ID:0x0f    PID:0xcf
P0:1    P1:0    ID:0x10    PID:0x50
P0:0    P1:0    ID:0x11    PID:0x11
P0:0    P1:1    ID:0x12    PID:0x92
P0:1    P1:1    ID:0x13    PID:0xd3
P0:0    P1:0    ID:0x14    PID:0x14
P0:1    P1:0    ID:0x15    PID:0x55
P0:1    P1:1    ID:0x16    PID:0xd6
P0:0    P1:1    ID:0x17    PID:0x97
P0:1    P1:1    ID:0x18    PID:0xd8
P0:0    P1:1    ID:0x19    PID:0x99
P0:0    P1:0    ID:0x1a    PID:0x1a
P0:1    P1:0    ID:0x1b    PID:0x5b
P0:0    P1:1    ID:0x1c    PID:0x9c
P0:1    P1:1    ID:0x1d    PID:0xdd
P0:1    P1:0    ID:0x1e    PID:0x5e
P0:0    P1:0    ID:0x1f    PID:0x1f
P0:0    P1:0    ID:0x20    PID:0x20
P0:1    P1:0    ID:0x21    PID:0x61
P0:1    P1:1    ID:0x22    PID:0xe2
P0:0    P1:1    ID:0x23    PID:0xa3
P0:1    P1:0    ID:0x24    PID:0x64
P0:0    P1:0    ID:0x25    PID:0x25
P0:0    P1:1    ID:0x26    PID:0xa6
P0:1    P1:1    ID:0x27    PID:0xe7
P0:0    P1:1    ID:0x28    PID:0xa8
P0:1    P1:1    ID:0x29    PID:0xe9
P0:1    P1:0    ID:0x2a    PID:0x6a
P0:0    P1:0    ID:0x2b    PID:0x2b
P0:1    P1:1    ID:0x2c    PID:0xec
P0:0    P1:1    ID:0x2d    PID:0xad
P0:0    P1:0    ID:0x2e    PID:0x2e
P0:1    P1:0    ID:0x2f    PID:0x6f
P0:1    P1:1    ID:0x30    PID:0xf0
P0:0    P1:1    ID:0x31    PID:0xb1
P0:0    P1:0    ID:0x32    PID:0x32
P0:1    P1:0    ID:0x33    PID:0x73
P0:0    P1:1    ID:0x34    PID:0xb4
P0:1    P1:1    ID:0x35    PID:0xf5
P0:1    P1:0    ID:0x36    PID:0x76
P0:0    P1:0    ID:0x37    PID:0x37
P0:1    P1:0    ID:0x38    PID:0x78
P0:0    P1:0    ID:0x39    PID:0x39
P0:0    P1:1    ID:0x3a    PID:0xba
P0:1    P1:1    ID:0x3b    PID:0xfb
P0:0    P1:0    ID:0x3c    PID:0x3c
P0:1    P1:0    ID:0x3d    PID:0x7d
P0:1    P1:1    ID:0x3e    PID:0xfe
P0:0    P1:1    ID:0x3f    PID:0xbf
"""

由上可以得知, PID 不会出现全 0 或全 1 的情况,因此,如果从机节点收到了“0xFF”或“0x00”,可判断
为传输错误。

posted @ 2022-10-08 17:05  荒诞的X  阅读(2300)  评论(0编辑  收藏  举报