Python实现CAN总线J1939报文接收、发送

article/2025/10/19 8:13:41

前言

J1939协议是由美国汽车工程师协会(SAE) (SAE协会简介)定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。在许多方面,J1939标准类似于旧版J1708和J1587标准,但J1939标准协议建立在CAN(控制器区域网络,ISO11898)上。
物理层(J1939/11)描述了针对客车的电气接口。数据链路层描述了构建报文、访问总线以及诊断传送故障的规则。应用层(J1939/71和J1939/73)定义了在网络中传送的每条报文的具体数据。

J1939主要特性
J1939协议标准基于CAN的高层协议
J1939协议应用于重型车辆
J1939协议传送速度稳定在250kbps
————————————————
 

一、环境搭建

1.概述

本文主要是通过Python3实现CAN总线上J1939报文接收、发送等功能,通过模拟单帧、多帧实现定期发送报文等模拟场景。

2.CAN工具

本案例采用的是PCAN-USB工具

973f62a7ec6fb5cb97f98c852f1a3971.png

PCAN-USB驱动:https://www.peak-system.com/fileadmin/media/files/pcan-basic.zip

3.Python安装

下载地址:https://www.python.org/ftp/python/3.7.9/python-3.7.9-amd64.exe

 库:pip install can-j1939

二、项目演示

1.J1939报文接收

80bd868b0dc005213a8a2acf7f74df46.png

2.J1939报文发送

用另一台CAN工具查看报文,接收正常:

d17cb250a4d49fb74be90befd8d7bad5.png

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55av54uC55qE5py65Zmo5Lq6,size_20,color_FFFFFF,t_70,g_se,x_16

三、完整代码

#!/usr/bin/python
# _*_ coding:utf-8 _*_import time, j1939, threadingdef on_message(priority, pgn, sa, timestamp, data):"""接收来自总线的消息"""print(priority, pgn, sa, timestamp, [data[i] for i in range(len(data))])  # 打印消息def recv_j1939(read_time):"""订阅总线消息"""ecu.subscribe(on_message)time.sleep(read_time)ecu.unsubscribe(on_message)  # 停止订阅消息def cycle_send_j1939():"""发送j1939报文"""j1939_loog_data = [{'cycle': 1000, "pgn": 65251, "dp": 0, "pf": 254, "ps": 227, "p": 6, "sa": 0,"data": [0, 25, 132, 112, 63, 137, 64, 31, 133, 128, 37, 133, 32, 53, 136, 155, 66, 255, 255,164, 3, 0, 0,60, 70, 213, 125, 133, 155, 66, 134, 0, 255, 255, 255, 255, 255, 255, 255,255]}]  # j1939长帧报文j1939_data = [{'cycle': 250, "can_id": 0x18FEDF00, 'pgn': 65247, "data": [130, 128, 37, 125, 251, 255, 255, 240]},{'cycle': 50, "can_id": 0x18F00400, "pgn": 61444, "data": [14, 189, 130, 0, 0, 0, 0, 125]},{'cycle': 100, "can_id": 0x18FE9200, "pgn": 65170,"data": [255, 255, 254, 255, 255, 255, 0, 0]}]  # j1939短帧报文for i in j1939_loog_data:i['currenttime'] = int(round(time.time() * 1000))for i in j1939_data:i['currenttime'] = int(round(time.time() * 1000))while True:currenttime = int(round(time.time() * 1000))for i in j1939_loog_data:interval = currenttime - i['currenttime']if interval >= i['cycle']:ecu.send_pgn(data_page=i["dp"], pdu_format=i["pf"], pdu_specific=i["ps"], priority=i["p"],src_address=i["sa"], data=i["data"])  # 发送长帧报文print('PGN%d:长帧报文发送成功' % i['pgn'])i['currenttime'] = currenttime  # 更新发送时间for i in j1939_data:interval = currenttime - i['currenttime']if interval >= i['cycle']:ecu.send_message(can_id=i["can_id"], data=i["data"])  # 发送短帧报文print('PGN%d:短帧报文发送成功' % i['pgn'])i['currenttime'] = currenttime  # 更新发送时间if __name__ == '__main__':print("初始化总线")ecu = j1939.ElectronicControlUnit()  # 创建ECUecu.connect(bustype='pcan', channel='PCAN_USBBUS1', bitrate=500000)  # 连接CAN总线# s1 = threading.Thread(target=recv_j1939, name="接收J1939消息线程",args=(10,))# s1.start()s2 = threading.Thread(target=cycle_send_j1939, name="发送J1939消息线程")s2.start()# print('取消初始化')# ecu.disconnect()   #断开总线连接


http://chatgpt.dhexx.cn/article/m8domQOH.shtml

相关文章

J1939标准概述【小白入门】

文章目录 J1939标准概述:J1939/11物理层J1939/13板外诊断连接器J1939/21数据链路层J1939/31网络层J1939/71车辆应用层J1939/73应用层-诊断层J1939/81网络管理总结 J1939标准概述: J1939由下列子标准组成: J1939 – 串行控制和通信车辆网络…

J1939-21数据链路层多帧协议PDU解析

一、协议数据单元(PDU) P 是优先级,R 是保留位,DP 是数据页,PF 是PDU 格式,PS 是特定PDU,SA 是源地址 优先级(P):这三位仅在总线传输中用来优化消息延迟&…

CAN总线的特点及J1939协议通信原理、内容和应用

众多国际知名汽车公司早在20世纪80年代就积极致力于汽车网络技术的研究及应用。迄今已有多种网络标准,如专门用于货车和客车上的SAE的J1939、德国大众的ABUS、博世的CAN、美国商用机器的AutoCAN、ISO的VAN、马自达的PALMNET等。 在我国的轿车中已基本具有电子控制和…

IPEmotion采集J1939协议信号

一 背景 由于商用车相对于乘用车更注重实用性,功能也较单一,且具有产量小的特点,因此在设计开发时需要进行约束,以更大程度实现软硬件的复用和成本的降低,在此需求下J1939协议便随之产生了。 J1939协议是由美国汽车工…

SAE J1939协议读取车辆故障码

基于SAE J1939协议的车辆,默认开启数据广播。当有故障码时,也会按照故障码的格式进行广播。 此处基于外设主动:读取故障码个数->读取故障码->故障码解析 这个步骤来讲,如果被动接收故障码广播,如下解析也适用。 …

车用总线技术 | J1939协议实用指南与J1939数据记录方案

“没错,这是一份SAE J1939协议的简单、实用指南。”—虹科 开篇:在这篇介绍中,我们介绍了J1939协议的基本知识,其中包括PGN和SPN。因为这是一篇偏向应用的简介,所以您还将会学习到如何通过DBC文件解码J1939数据、如何…

SAE J1939协议学习笔记

引用百度百科: SAE J1939(以下简称J1939)是美国汽车工程协会(SAE)的推荐标准,用于为中重型道路车辆上电子部件间的通讯提供标准的体系结构。它由“卡车与大型客车电气与电子委员会”(Track &am…

J1939学习(二)

PDU 应用或网络层提供被同化为协议数据单元(PDU)的信息串。PDU提供了一个框架,用于组织对发送的每个CAN数据帧至关重要的信息。SAE J1939 PDU由七个字段组成:(1)P、(2)EDP、&#x…

CAN总线(J1939)速成指南【1】

本文转载在我的微信公众号:古德曼汽车工业。公众号文章都会知识星球、知乎进行转载,请有兴趣的朋友可以关注我的微信公众号 原文地址:CAN总线(J1939)速成指南【1】 很久以前当思想对CAN总线还一窍不通的时候,尝试百度搜索过非常…

J1939协议实用指南与J1939数据记录方案

“没错,这是一份SAE J1939协议的简单、实用指南。”—虹科 开篇:在这篇介绍中,我们介绍了J1939协议的基本知识,其中包括PGN和SPN。因为这是一篇偏向应用的简介,所以您还将会学习到如何通过DBC文件解码J1939数据、如何记…

车载通信——J1939故障码

一、诊断 UDS是统一诊断系统 冻结帧:出现故障码时,ECU存储故障码出现时的数据,就是冻结帧。 二、J1939故障诊断 SAE J1939应用层定义了12种诊断报文(Diagnostic Message,DM)、诊断故障码(DTC&#xff0…

UDS,ISO14229,ISO15765,ISO15031,J1939车辆诊断协议入门系列

(图片来源于网络) 目录 摘要1. 基础概念1.1 诊断的概念1.2 诊断的目标1.3 诊断的实现1.4 诊断是分层的 2. 项目应用3. 协议栈开发 摘要 回想当年刚进去汽车行业,做新能源车的某个“ECU”,和客户沟通需求时,人家上来就…

J1939故障码诊断说明

1:1939整体协议说明 这里主要说明1939不同的协议,对应不同的网络分层 注意了,这里只进行文档解析说明,具体查看去搜素协议的关键字进行理解 2:DMx和FMI 说明 想知道每个代号的具体含义,可以去 saeJ1939…

J1939协议之通俗易懂----简介

J1939简介 J1939协议简介 J1939协议是由美国汽车工程师协会(SAE) (SAE协会简介)定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。在许多方面,J1939标准类似于旧版J1708和J1587标准,但J1939标准协议建立在CAN…

J1939协议简介

J1939简介 J1939协议简介 J1939协议是由美国汽车工程师协会(SAE) (SAE协会简介)定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。在许多方面,J1939标准类似于旧版J1708和J1587标准,但J1939标准协议建立在CAN&…

了解J1939协议和J1939数据记录仪(车辆工程机械中的黑匣子)

SAE J1939是由汽车工程师协会(SAE J1939)定义的标准,专门用于提供微处理器系统之间的串行数据通信。虽然CAN存在并且被广泛用于小型车辆,但SAE J1939被设计为大型车辆复杂网络的专用通信和诊断协议。J1939通常应用于重型车辆&…

SAE J1939协议(一)

SAE J1939 是 基 于 CAN 总 线 的 协议,波特率可达250Kbps,是一种传输速率较高的C类通信网络协议。SAE J1939主要用于卡车、客车等的网络系统控制与通信。 SAE J1939分层结构模型: SAE J1939标准的文档构成: 1、 SAE J1939物理层…

J1939 学习(一)

J1939简介 SAE J1939(以下简称J1939)是美国汽车工程协会(SAE)的推荐标准,用于为中重型道路车辆上电子部件间的通讯提供标准的体系结构。它由“卡车与大型客车电气与电子委员会”(Track & Bus Electric…

J1939协议解析

关于对J1939的一点理解,有错误的话请指正。 缩写定义 PGN 在CAN数据帧的数据域中需要指明参数群时,PGN是表示成24位。PGN是一个24位的值,包括以下要素:保留位、数据页位、PDU格式域(8位)和群扩展域&#…

J1939协议简介【小白入门】

文章目录 J1939协议简介J1939主要特性报文格式及使用方法(J1939/21)地址和名称 (J1939/81)地址请求报文传递(J1939/21和J1939/7x)TP_BAM报文TP_CM报文报文接收(J1939/21和J1939/7x)ECU设计(J1939/1x,J1939/21和J1939/7x)接线布局 - 物理层(J1939/1x)如何…