linlib¶
The following sections contain sample code for inspiration on how to use Kvaser Python linlib.
Basic master slave usage¶
"""basic_master_slave_lin.py
This code opens up one master and one slave, sets bitrate and then the slave
sends a wakeup message to the master.
"""
# import the linlib wrapper from the canlib package
from canlib import linlib
# print information about device firmware version
print(linlib.getChannelData(channel_number=0,
item=linlib.ChannelData.CARD_FIRMWARE_REV))
# open the first channel as a Master
master = linlib.openChannel(channel_number=0,
channel_type=linlib.ChannelType.MASTER)
# open the next channel as a Slave
slave = linlib.openChannel(channel_number=1,
channel_type=linlib.ChannelType.SLAVE)
# setup bitrate
master.setBitrate(10000)
slave.setBitrate(10000)
# activate the LIN interface by going bus on
master.busOn()
slave.busOn()
# send a wakeup frame from the slave
slave.writeWakeup()
# read the frame when it arrives at the master
frame = master.read(timeout=100)
print(frame)
# go bus off
master.busOff()
slave.busOff()
Sending message from master¶
"""send_lin_message.py
This example uses two shorthand helper functions to open the channels. We then
send some messages from the master and see that they arrive.
"""
from canlib import linlib, Frame
# open the first channel as Master, using helper function
master = linlib.openMaster(0)
# open the next channel as a Slave, using helper function
slave = linlib.openSlave(1)
# go bus on
master.busOn()
slave.busOn()
# send some messages from master
NUM_MESSAGES = 2
for i in range(NUM_MESSAGES):
master.writeMessage(Frame(id_=i, data=[1, 2, 3, 4, 5, 6, 7, 8]))
master.writeSync(100)
# print the received messages at the slave
for i in range(NUM_MESSAGES):
frame = slave.read(timeout=100)
print(frame)
# the master should also have recorded the messages
for i in range(NUM_MESSAGES):
frame = master.read(timeout=100)
print(frame)
# go bus off
master.busOff()
slave.busOff()
Requesting LIN 2.0 message¶
"""request_lin_message.py
Here we look at using LIN 2.0 and setting up a message, using the `Frame`
object, on the slave which is then requested by the master.
"""
from canlib import linlib, Frame
ID = 0x17
DATA = bytearray([1, 2, 3, 4])
# open the first channel as Master, using helper function
master = linlib.openMaster(0, bps=20000)
# open the next channel as a Slave, using helper function
slave = linlib.openSlave(1)
master.busOn()
slave.busOn()
# configure channels to use LIN 2.0
slave.setupLIN(flags=linlib.Setup.ENHANCED_CHECKSUM | linlib.Setup.VARIABLE_DLC)
master.setupLIN(flags=linlib.Setup.ENHANCED_CHECKSUM | linlib.Setup.VARIABLE_DLC)
# setup a message in the slave
slave.updateMessage(Frame(id_=ID, data=DATA))
# request the message and print it
master.requestMessage(ID)
frame = master.read(timeout=100)
print(frame)
# clear the message
slave.clearMessage(0x17)
# we should now get an empty message
master.requestMessage(0x17)
frame = master.read(timeout=100)
print(frame)
# go bus off
master.busOff()
slave.busOff()