UDS_CommunicationControl(0x28)服务

一、服务功能

        通信控制服务,主要是涉及到CAN通信接收和发送相关的控制。

        0x28服务就是Client向Server请求打开或关闭某类或多类报文信息的发送和接收功能,该诊断服务对诊断报文没有控制作用,此服务起作用的是应用程序报文NM Frame

通信控制基本原理:

                ①Tester发送28请求到Server,Server会将该诊断报文请求传递到DCM模块;

                ②DCM调用28服务对应的上层应用函数首先进行输入参数的基本校验,校验无误之后然后传递相关控制模式请求到BswM模块;

                ③BswM模块根据静态配置的规则来实现对应请求中的通道通信状态控制;

常见的12种通信控制模式

报文类型EnableTXAndEnableRxEnableTXAndDisableRxDIsableTXAndDisableRxDisableTXAndEnableRx
应用报文YESYESYESYES
网络管理报文YESYESYESYES
应用报文+网络管理报文YESYESYESYES

二、应用场景

        ①某些测试场景,比如只希望接受或者发送对应的APP Frame和NM Frame

        ②在进行程序刷写时候,为了降低总线负载,就需要将某些控制器的APP Frame 或NM Frame关闭,就是通过28服务进行控制,在此过程中一般会配合85服务一起使用。

三、服务请求:

请求格式:

★:nodeIdentificationNumber参数:当子功能=0x04或0x05,此参数才存在。

CommunicationControl Request SID:固定为0x28

SubFunction

Communication Type:

四、服务响应:

正响应格式:

Response SID :0x68

ControlType :与请求保持一致

五、支持的NRC:

六、常见Bug:

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/@!Encoding:936/ includes { } variables { char panelTitle[50] = "UDSFlash"; long txMsgCount; long total; dword diagPysicalAddress; // Pysical Address dword diagFunctionAddress; // Function Address dword diagResponseAddress = 0x777; // Response Address dword diagMessageDLC = 8; // diag dlc dword item_name; // item name dword item_type; // item type dword cycle; // whether the cycle dword cycle_interval; // cycle interval // UDS transport layer type const byte UDS_TP_SF = 0x00; // Single Frame const byte UDS_TP_FF = 0x01; // First Frame const byte UDS_TP_CF = 0x02; // Consecutive Frame const byte UDS_TP_FC = 0x03; // Flow Control Frame struct diagRxDataStruct { dword index; word dataLenth; byte data[1024]; }; struct diagRxDataStruct diagRxData; char waitForResponseTextEvent[20] = "response received!"; byte udsCfSn = 1; byte udsFcFs = 0; byte udsFcBs = 0; byte udsFcStmin = 0; long handle; // TP time word udsP2Server = 3000; word udsP2StarServer = 5000; long udsAs = 25; long udsBs = 75; long udsAr = 25; long udsCr = 150; char buffer[4096]; char var[5][100]; long i=0; long len; char configFilePath[100]="./bin/uds_flash.ini"; // Configuration file path } /* Create CAN connection */ void create_connection() { handle = CanTpCreateConnection(0); CanTpSetRxIdentifier(handle, diagResponseAddress); write("handle %x", handle); if (diagMessageDLC > 7) { create_canfd_connection(); // Enable CANFD } CanTpSetTimeoutAs(handle, udsAs); CanTpSetTimeoutBs(handle, udsBs); CanTpSetTimeoutAr(handle, udsAr); CanTpSetTimeoutCr(handle, udsCr); CanTpSetPadding(handle, 0x00); CanTpSetBlockSize(handle, 0); } /* Create CANFD connection */ void create_canfd_connection() { dword maxCANFDFrameLength; maxCANFDFrameLength = diagMessageDLC; CanTpSetBitRateSwitch(handle, 1); CanTpSetMaxCANFDFrameLength(handle, maxCANFDFrameLength); } MainTest() { create_connection(); } 解释一下,这段代码,每一行都在做什么
07-13
这段代码是用C语言编写的,主要用于创建CAN连接并进行相关设置。下面是对每一行代码的解释: 1. `/*@!Encoding:936*/`:该行注释指定了编码格式为936,可能是为了支持中文字符。 3-30. `variables` 块:这一块声明了一系列变量,包括面板标题、消息计数、物理地址、功能地址等。这些变量用于存储程序运行时需要的值。 33-44. `const byte UDS_TP_SF = 0x00;` ... `const byte UDS_TP_FC = 0x03;`:这一块定义了UDS传输层类型的常量,用于表示不同类型的传输帧。 47-56. `struct diagRxDataStruct` ... `byte data[1024];`:这一块定义了一个名为`diagRxDataStruct`的结构体,用于存储接收到的数据。结构体包含了索引、数据长度和数据本身的成员。 57. `char waitForResponseTextEvent[20] = "response received!";`:定义了一个名为`waitForResponseTextEvent`的字符数组,并初始化为字符串"response received!"。该数组可能用于存储接收到消息后的事件文本。 59-62. `byte udsCfSn = 1;` ... `byte udsFcStmin = 0;`:定义了一些字节类型的变量,可能与UDS传输相关的设置有关。 64. `long handle;`:定义了一个名为`handle`的长整型变量,可能用于存储CAN连接的句柄。 67-75. `word udsP2Server = 3000;` ... `long udsCr = 150;`:定义了一些字长类型的变量,可能表示UDS传输协议中的时间参数。 78-88. `char buffer[4096];` ... `char configFilePath[100]="./bin/uds_flash.ini";`:定义了一些字符数组类型的变量,用于存储缓冲区和配置文件路径。 92-122. `void create_connection()` ... `CanTpSetBlockSize(handle, 0);`:这一部分是一个函数`create_connection()`的定义,用于创建CAN连接并进行相关设置。具体操作包括创建连接、设置接收标识符、设置超时时间等。如果`diagMessageDLC`大于7,则调用`create_canfd_connection()`函数。 126-136. `void create_canfd_connection()` ... `CanTpSetMaxCANFDFrameLength(handle, maxCANFDFrameLength);`:这一部分是一个函数`create_canfd_connection()`的定义,用于创建CANFD连接并进行相关设置。具体操作包括设置最大CANFD帧长度等。 140-145. `MainTest()` ... `create_connection();`:这部分是主函数`MainTest()`的定义,调用了`create_connection()`函数来创建CAN连接。 希望这能帮助到你理解这段代码的功能和每一行的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值