🙆♂️我是纯良思安,爱技术、爱分享,更爱生活🙆♂️
💖喜欢的朋友可以关注一下,下次更新不迷路💖
文章目录
基本介绍
使用Python-can实现CAN bus的报文收发与交互离不开Message
class can.Message(timestamp=0.0, arbitration_id=0, is_extended_id=True, is_remote_frame=False, is_error_frame=False, channel=None, dlc=None, data=None, is_fd=False, is_rx=True, bitrate_switch=False, error_state_indicator=False, check=False)
- Message对象用于表示CAN消息,用于发送、接收和其他用途,如在不同的日志格式之间进行转换
- Message可以使用扩展帧,远程帧或错误帧,包含数据,并且可以与通道相关联
- Message总是按ID进行比较,而从不按值进行比较,因为这可能会引入非预期的行为
- Message不支持“动态”属性,也就是说除了文档中的属性之外的任何其他属性,因为它使用__slots_。
要创建消息对象,只需将以下任何属性与其他参数一起作为关键字参数提供给构造函数即可。
>>> from can import Message
>>> test = Message(data=[1, 2, 3, 4, 5])
>>> test.data
bytearray(b'\x01\x02\x03\x04\x05')
>>> test.dlc
5
>>> print(test)
Timestamp: 0.000000 ID: 00000000 X Rx DL: 5 01 02 03 04 05
参数
- check(bool)–默认情况下,此类的构造函数不会严格检查输入。因此,调用方必须防止创建无效消息,或者将此参数设置为True,以在无效输入时引发错误。可能的问题包括dlc字段与数据长度不匹配,或者创建的消息is_remote_frame和is_error_frame都设置为True。
- timestamp(float)-CAN消息中的时间戳字段是一个浮点数字,表示自epoch以来接收消息的时间(以秒为单位)。
- arbitration_id(int)–CAN报文中的arbitration_id字段的长度可以是11位(标准帧,CAN 2.0A)或29位(扩展帧,CAN 2.0 B),并且python可以通过is_extended_id属性来暴露这种差异。
>>> print(Message(is_extended_id=False, arbitration_id=100)) Timestamp: 0.000000 ID: 064 S Rx DL: 0
- is_extended_id(bool)–控制arbitration_id字段的大小
>>> print(Message(is_extended_id=False)) Timestamp: 0.000000 ID: 000 S Rx DL: 0 >>> print(Message(is_extended_id=True)) Timestamp: 0.000000 ID: 00000000 X Rx DL: 0
- is_remote_frame(bool)–是否远程帧
>>> print(Message(is_remote_frame=True)) Timestamp: 0.000000 ID: 00000000 X Rx R DL: 0
- is_error_frame(bool)–是否错误帧
>>> print(Message(is_error_frame=True)) Timestamp: 0.000000 ID: 00000000 X Rx E DL: 0
- channel(str|int|None)–对应的收发报文的通道
- dlc(int|None)–CAN报文的DLC参数是一个介于0和8之间的整数,表示帧有效payload长度。在CAN FD报文的情况下,这表示以字节数表示的数据长度。
>>> m = Message(data=[1, 2, 3]) >>> m.dlc 3
- data(bytes|byterarray|int|Iterable[int]|None)–CAN报文的数据参数显示为长度在0到8之间的字节数组。
>>> example_data = bytearray([1, 2, 3]) >>> print(Message(data=example_data)) Timestamp: 0.000000 ID: 00000000 X Rx DL: 3 01 02 03
也可以用bytes或int列表创建:
>>> m1 = Message(data=[0x64, 0x65, 0x61, 0x64, 0x62, 0x65, 0x65, 0x66]) >>> print(m1.data) bytearray(b'deadbeef') >>> m2 = Message(data=b'deadbeef') >>> m2.data bytearray(b'deadbeef')
- is_fd(bool)–是否CAN FD报文
- is_rx(bool)–是发送(Tx)帧还是接收(Rx)帧
- bitrate_switch(bool)–如果是CAN FD报文,则表示数据传输使用了更高的比特率。
- error_state_indicator(bool)–如果是一条CAN FD信报文,则表示处于错误激活状态。
RAISES:
ValueError–如果且仅当check设置为True并且一个或多个参数无效
使用时可以实例化定义数据的报文,以及仲裁ID、标志和时间戳等所有属性的可选参数。
🎈如果文章对您有帮助,您可以“点赞、收藏、关注”,这也是我创作动力的源泉🎈
💘感谢支持💘