Python实现LIN数据收发
前言
LIN(Local InterconnectNetwork)总线,是基于UART/SCI(Universal Asynchronous Receiver-Transmitter/SerialCommunication Interface通用异步收发器/串行通信接口)的低成本串行通信协议。
在汽车中作为CAN总线的辅助总线,常被运用于车门、车窗、车灯以及中控锁等车身控制领域。
支持LIN测试的软件就显然没有CAN总线那么多,busmaster作为性价比最高的总线软件(没有什么是比开源更香的,如果有,那就是开源且功能强大)。
但是busmaster也无法支持所有的LIN卡,就比如Kvaser Hybrid CAN/LIN系列的LIN通道就无法被识别,所以只能进行二次开发(主要是为了节约,收费的软件还是可以支持的)
直接上Python代码
import time
from canlib import canlib, Frame
from canlib import linlib
def print_channels():
for ch in range(canlib.getNumberOfChannels()):
chdata = canlib.ChannelData(ch)
if "LIN" in chdata.channel_name:
print(
"{ch}. {name} ({ean} / {serial})".format(
ch=ch,
name=chdata.channel_name,
ean=chdata.card_upc_no,
serial=chdata.card_serial_no,
)
)
if __name__ == '__main__':
# 打印出当前检测到的LIN接口信息
print_channels()
# 打开Lin通道,并设置为master,句柄接入总线
# linlib.openChannel(0, linlib.ChannelType.MASTER)
lin_master = linlib.openMaster(0)
lin_master.setBitrate(19200)
lin_master.busOn()
# 打开Lin通道,并设置为slave,句柄接入总线
# linlib.openChannel(1, linlib.ChannelType.SLAVE)
lin_slave = linlib.openSlave(1)
lin_slave.setBitrate(19200)
lin_slave.busOn()
# 发送数据
msg = Frame(
id_=12,
data=[1, 2, 3, 4, 5, 6, 7, 8],
dlc=8,
flags=0
)
lin_master.writeMessage(msg)
# 接收数据
frame = lin_slave.read(timeout=50)
print("{id:0>8X} {dlc} {data} {timestamp}".format(
id=frame.id,
dlc=frame.dlc,
data=' '.join('%02x' % i for i in frame.data),
timestamp=frame.timestamp
))
time.sleep(10)
# 移除句柄
lin_master.busOff()
lin_slave.busOff()
# 关闭通道
lin_master.close()
lin_slave.close()
运行结果:
read的参数timeout超时前没收到数据就会报以下错误,终止程序进行。
canlib.linlib.exceptions.LinNoMessageError: No messages available. (-1)
busmaster界面
听说官方软件CANking已经在更新当中,不知道是否能将LIN也支持上,期待…