首页 > 其他分享 >CANoe_UDS-boorloader 自动化测试系列(二)基本功能:CAPL实现UDS协议下的CAN报文接收#解析#发送

CANoe_UDS-boorloader 自动化测试系列(二)基本功能:CAPL实现UDS协议下的CAN报文接收#解析#发送

时间:2024-08-19 11:26:25浏览次数:16  
标签:UDS service CANoe 报文 CAPL responsecode byte ID

目录

一、前言

二、CAPL实现

1、报文接收

接收报文函数:

2、报文发送

发送报文函数:

三、总结展望


一、前言

halle,大家好,我是小鸟鹏。

上篇文章《CANoe_UDS-boorloader 自动测试系列(二)基本刷写流程》简单介绍了整Bootloader的基本刷写流程,包括具体使用哪些服务实现哪些功能,对刷写流程还不熟悉的小伙伴请移步观看上一篇文章。

从本章开始,我开始介绍基于CANoe的UDS bootloader,如何用CAPL实现刷写和自动化测试。那么今天我们就先使用CAPL实现一个基本功能:UDS报文的接收和解析,以及如何将数据组成UDS报文对外发送。分享源码及思路

二、CAPL实现

1、报文接收

CAN报文的接收使用CAPL的内置函数是:

testWaitForMessage(RESPONSE_ID_DEFAULT,g_P2server); //等待CAN报文

TestGetWaitEventMsgData(g_RxMessage); //接收CAN报文数据

以上组合可以实现超时等待指定ID报文,testWaitForMessage()第一个参数为要等待的报文ID号,第二个参数为超时时间,返回值为1表示等待到了报文。TestGetWaitEventMsgData()则是接收保报文数据。

接收报文函数:

variables
{
    const dword PHYSICS_ID_DEFAULT  = 0x722;
    const dword FUNTION_ID_DEFAULT  = 0x7DF;
    const dword RESPONSE_ID_DEFAULT = 0x734;
    const dword g_P2server = 5000;
}

void WaitServerResponse(byte responsecode ,dword id ,byte service)
{

    if(responsecode == 0)//不需要响应
    {
        if(1 == testWaitForMessage(RESPONSE_ID_DEFAULT,g_P2server)) //等待报文
        {
            CanTp_RxMessageData(); //接收报文数据
            write("====》service:0x%x fail0",service);
        }
        else
        {
            write("====》service:0x%x 当前服务响应正确",service);
        }
    }
    else//需要回响应
    {  
        if(1 == testWaitForMessage(RESPONSE_ID_DEFAULT,g_P2server)) //等待报文
        {
            CanTp_RxMessageData(); //接收报文数据
         
            if(responsecode == service+0x40)//需要响应完整的正响应请求
            {             
                if(g_RxMessage.byte(1) == responsecode || g_RxMessage.byte(2) == responsecode)//返正响应
                {   
                    write("====》service:0x%x 当前服务响应正确",service);
                    
                    if(g_RxMessage.byte(0) >= 0x10 && g_RxMessage.byte(0) < 0x20)//收到首帧的正响应
                    {
                        CanTp_TxFC(PHYSICS_ID_DEFAULT, 0x30, 0x00, 0x0A);//发送流控帧
                      
                        while(1)
                        {
                            if(1 == testWaitForMessage(RESPONSE_ID_DEFAULT,150))//收到连续帧
                            {
                                //连续帧
                                CanTp_RxMessageData();
                            }
                            else//没收到连续帧停止检测
                            {
                                break;
                            }
                        }
                    }
                }
                else
                {   
                    if((0x7F == g_RxMessage.byte(1)) && (0x78 == g_RxMessage.byte(3)))
                    {
                        Proces0x7Fxx0x78Response(responsecode);
                    }
                    else
                    {
                        write("====》service:0x%x fail1",service);
                    }
                }
            }
            else//需要负响应
            {
                if(g_RxMessage.byte(1) == 0x7F)//负响应
                {
                    if(g_RxMessage.byte(3) == responsecode)
                    {
                        write("====》service:0x%x 当前服务响应正确",service);
                    }
                    else
                    {   
                        write("====》service:0x%x fail2",service);
                    }
                }
                else
                {
                    write("====》service:0x%x fail3",service);
                }
            }
        }
        else//需要回复,却没回复响应帧
        {
            write("====》service:0x%x P2server Timout",service);
        }
    } 
}

定义好后就可以通过这个函数接收报文并且按照UDS帧格式解析,我们可以自定义server和期待返回的NRC,通过这个函数就可以判断下位机返回的NRC是否正确。

2、报文发送

CAN报文的发送使用CAPL的内置函数是:

output(g_TxMessage); //发送一帧CAN报文

发送报文函数:


void DiagnosticServiceSend(byte responsecode ,dword id ,dword dlc ,byte data[])
{
    int DataLength,i,Tp_n;
    byte Tp_Buf[4096];
	byte ErrorStatus = E_NOT_OK;
  
    DataLength = Tp_n = 0;//初始化

    g_TxMessage.id = id;
    g_TxMessage.dlc = 8;
	
    if(dlc > 0x00)
	  {
        if(dlc <= 0x07)
        {   
            g_TxMessage.byte(0) = dlc;//单帧长度
  		  
            for(DataLength = 0; DataLength < 7; DataLength++)//单帧数据赋值
            {  
                g_TxMessage.byte(DataLength+1) = 0;
                g_TxMessage.byte(DataLength+1) = data[DataLength];
            }
            
            output(g_TxMessage);
        }
        else if(0x08 <= dlc && dlc <= 0xfff)//首帧
        {
            g_TxMessage.byte(0) = 0x10 + (dlc>>8);//首帧
            g_TxMessage.byte(1) = dlc&0xff;//首帧长度
  		  
            for(DataLength = 0; DataLength < 6; DataLength++)//首帧数据
            {
                g_TxMessage.byte(DataLength+2) = data[DataLength];
            }
            
            output(g_TxMessage);
  		  
            for(i = DataLength; i < (int)dlc; i++)//连续帧数据赋值
            {
                Tp_Buf[Tp_n] = data[i];
                Tp_n++;
            }
            CanTp_TxCF(responsecode, id, dlc, Tp_Buf);//连发续帧函数
        }
 
        WaitServerResponse(responsecode ,id,data[0]);//响应码检测
    }
}

定义好发送函数后通过这个函数可以实现发送任何服务请求和任意长度的UDS数据帧,自动等待响应后自动判断NRC的正确性。

通过以上的两个函数接口我们就可以任意服务的诊断了,底层的业务已经实现,剩下的就是根据协议对每个服务进行封装就行了。如果各位小伙伴有问题或者有更好的建议欢迎指正!【抱拳】。

三、总结展望

本文介绍了基于CAPL实现的两个函数接口,一个是UDS帧的接收和解析,一个是发送UDS帧。这两个函数接口是后续实现各种业务代码的基础,非常重要哦!

后续我会持续更新这个系列,但是时间不固定,视工作情况决定,但是有时间的话会尽快更新的。你们的关注是我更新最大的动力,码字不易,求个三连。。。

下一篇:

CANoe_UDS-booroader 自动测试系列(三)基本功能:CAPL实现#10服务会话控制

 

如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。

 

作者:小鸟鹏

联系方式:

邮箱:[email protected]

 

标签:UDS,service,CANoe,报文,CAPL,responsecode,byte,ID
From: https://blog.csdn.net/m0_68882790/article/details/141312615

相关文章

  • H7-TOOL新版固件2.26发布,增加20多款新系列芯片脱机烧录支持,CAN UDS解析,升级CAN助手,串
    H7-TOOL详细介绍(含操作手册):http://www.armbbs.cn/forum.php?mod=viewthread&tid=89934【PC软件】V2.261.PC软件取消自动检查版本,替换为手动按钮检查更新2.CAN助手  -支持时钟选择(20M40M80M),CANFD支持最高8M波特率(需支持8M的canPHY芯片)  -增加“J1939通用解......
  • AUTOSAR&UDS 理论要点及isolar实战-3E服务讲解及配置实战
    1.诊断设备在线3E服务此服务用于告知电控单元测试工具仍在线。该服务需周期性发送,用于重置S3server计时器并维持当前激活的非默认诊断会话。服务请求报文格式:相应格式:支持的否定响应码:2.配置实战2.1DcmDsdServiceTables的配置 3E服务的需求如下:支持3E服务及其......
  • 车载网络测试实操源码_使用CAPL脚本对CAN总线上的错误帧进行实时监控
    系列文章目录车载网络测试实操源码_使用CAPL脚本解析hex、S19、vbf文件车载网络测试实操源码_使用CAPL脚本对CAN报文的Counter、CRC、周期、错误帧进行实时监控车载网络测试实操源码_使用CAPL脚本模拟发送符合协议要求(Counter和CRC)的CAN报文车载网络测试实操源码_使用......
  • 【CANoe制作DataBase(DBC文件)】
            本篇是CANoe使用制作DBC文件,DBC是DatabaseCan的缩写,其代表的是CAN的数据库文件,里面定义了CAN总线上有哪些CAN节点、每个节点各自发出什么CAN报文,每个报文下又有哪些信号,CAN总线不管是开发、测试还是分析,DBC文件都是必不可少的。目录        本篇......
  • 【技术分享】解决CANoe软件Trace窗口筛选栏空白问题
    引言在汽车电子开发领域,Vector公司提供的CANoe、CANape和CANalyzer软件是我们不可或缺的工具。然而,近期一些用户在更新了Windows系统后,遇到了Trace窗口筛选栏变白的问题。本文将分享一个实用的解决方案,帮助您快速恢复软件功能。问题描述7月11日,Windows系统推送了新的更新。......
  • 基于capl的hex文件解析
    目录前言一、IntelHEX文件格式简介二、CAPL语言概述三、基于CAPL的hex文件解析步骤四、注意事项前言基于CAPL(CommunicationAccessProgrammingLanguage)的hex文件解析主要涉及对IntelHEX文件格式的理解和CAPL编程语言的运用。IntelHEX文件是一种由符合IntelHEX......
  • UDS学习总结
    1UDS简介1.1什么是UDSUDS(UnifiedDiagnosticServices)统一诊断服务,是车辆诊断的一种应用层协议,面向整车所有ECU,UDS协议ISO14229定义了应用层和会话层,在协议里面定义了诊断的请求,诊断响应的报文格式,以及ECU怎样处理诊断请求报文,以及诊断服务的应用。它不关心底层数据链路......
  • 有奖征文|赢ROG游侠2键盘、小米耳机Buds5、小米手环9、瑞幸咖啡代金券
    填写活动报名表文章要求1、文章有清晰的逻辑和结构,包括不限于如:前言、背景、目标、解题思路、方案设计、技术架构、实现细节、核心代码、效果展示、示例展示、参考附录等部分内容。2、文章内容与征文主题相关,建议在文章结尾处列出文章中所涉及到的高德地图开放平台API参......
  • 【UDS诊断协议:ISO-14229中文】【嵌入式车载测试收徒】
    每日直播时间:(直播方式:腾讯会议)周一到周五:20:00-23:00周六与周日:9:00-17:00                 进腾讯会议学习的,可以关注我并后台留言直播内容:(车厂真实项目实操测试)HIL(硬件在环)测试、UDS功能诊断、UDS自动化诊断、数据库制作、DTC故障制造、CAN......
  • Self-Supervised Learning for Point Clouds Data: A Survey
    摘要综述了自监督学习(SSL)在3D点云数据处理领域的最新进展,对现有SSL方法进行了细致的分类和评估,并在多个基准数据集上对代表性方法进行了性能比较。同时指出了现有研究的局限性,提出了未来研究的方向。Introduction文章主要是针对自监督学习的(SSL),详细阐述了3D点云数据由于其......