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”,可判断
为传输错误。