新浪博客

用Python实现LIN数据收发

2024-01-15 10:46阅读:
LINLocal InterconnectNetwork)总线,是基于UART/SCIUniversal Asynchronous Receiver-Transmitter/SerialCommunication Interface通用异步收发器/串行通信接口)的低成本串行通信协议。
在汽车中作为CAN总线的辅助总线,常被运用于车门、车窗、车灯以及中控锁等车身控制领域。


LIN总线特点
单主控器/多从设备模式无需仲裁机制;
低成本,基于通用UART 接口所有控制机都具备LIN 必需的硬件;
单信号线传输,同时保证信号传输的延迟时间;
LIN
具有可预测的电磁兼容性能,为了限制EMC的强度,LIN协议规定最大传输速率为20kbps
LIN总线提供信号的配置、处理、识别和诊断功能。
用Python实现LIN数据收发
LIN总线ID64个,也就是0~3F。传输速率1kbps~20kbps



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('x' % i for i in frame.data),
timestamp=frame.timestamp
))

time.sleep(10)

# 移除句柄
lin_master.busOff()
lin_slave.busOff()

# 关闭通道
lin_master.close()
lin_slave.close()

运行结果:
用Python实现LIN数据收发

read的参数timeout超时前没收到数据就会报以下错误,终止程序进行。
canlib.linlib.exceptions.LinNoMessageError: No messages available. (-1)
Kvaser Leaf Professional LIN是一款单通道为LIN设计的USB产品。通过 MagiSyncTM功能实现时间戳自动同步,能提供实时连接任意几个产品至一台 PC。给客户提供方便同时也适合多通道使用。

主要性能
支持 LIN 1.3 和 2.x。
100% 支持用Kvaser的LINlib 语言,为任何一款Kvaser硬件编写的应用脚本。
出色的错误处理能力。
耗电量低。
出色的电磁兼容性(EMC)。
聚氨基甲酸乙酯导线能应对恶劣的工作环境。


我的更多文章

下载客户端阅读体验更佳

APP专享