Can't send Raw Telegram Request through CAPL on CANoe

1.5k Views Asked by At

EDIT: The main problem has been solved, but I stilla have a question, check the third attempt to see it.

I'm trying to send a Diagnostic Request that is not defined on my Diagnostic Description.

I have the following on my script:

 variables
{
    //Diagnostic Request that doesn't exist on the .cdd
    diagRequest ReadParameter Parameter_Req;
}

on preStart
{
  //Sets Diganostic Target just as it was configured
  diagSetTarget("DUT");
  
}

on key 's'
{
    //Setting request size to 3 bytes
//I asigned the size to a variable to be able to read which value it had after resizing if but
//everytime I got 0xFF9E or something like that the case is it seems the diagResize is not working
        diagResize(Parameter_Req,0x3);
    
    //Setting bytes on the request to creat 22 05 70 (read by identifier)
    Parameter_Req.SetPrimitiveByte(0,0x22);
    Parameter_Req.SetPrimitiveByte(1,0x05);
    Parameter_Req.SetPrimitiveByte(2,0x70);

    //Send Request
    diagSendRequest(Parameter_Req);
}

But the request is never sent, nothing new is seen on the Trace window. Does anybody know what I am doing wrong? I tried this with a Diagnostic Request that is declared on the Diagnostic Description and it works the request is sent, so I know my diagnostic configuration is OK. Also, no error is reported by CANoe

Thanks for your help

Edit: I also tried this other way

variables
{
  byte ReadDID0570[3];
}

on preStart
{
  //Sets Diganostic Target just as it was configured
  diagSetTarget("DUT"); 
}

on key 's'
{
//Set bytes and Send Read Request
    ReadDID0570[0] = 0x22;
    ReadDID0570[1] = 0x05;
    ReadDID0570[2] = 0x70;

//Send request
DiagSendRequestPDU(ReadDID0570, elCount(ReadDID0570));
}

But the result the same absolutely nothing happens.

Edit After the suggestion of M. Spiller

variables
{
  diagRequest * Parameter_Req;
}

on preStart
{
  //Sets Diganostic Target just as it was configured
  diagSetTarget("DUT"); 
}

on key 's'
{
//Resize the request to three bytes
diagResize(Parameter_Req,0x3);

//Set bytes
Parameter_Req.SetPrimitiveByte(0,0x22);
Parameter_Req.SetPrimitiveByte(1,0x05);
Parameter_Req.SetPrimitiveByte(2,0x70);

//Send Request
diagSendRequest(Parameter_Req);
}

This worked! The request is sent, although is not showed in the Trace window, I know it was sent because the response could be seen on Trace. Now my only question is how can I use diagGetLastResponse(Parameter_res); and on diagResponse Parameter_res using this same method to declare the response?

diagResponse * Parameter_Res;

Because those functions receive the name of the request/response declared on the Diagnostic Description, but using this method the type of request is * so how do I use it?

1

There are 1 best solutions below

0
On

You have used diagGetLastResponse(Parameter_res) to save the response to the Parameter_res variable. Since this is a variable declared with *, you won't have access to the parameters as specified in your Diagnostic Description.
You can make use of the function diagInterpretRespAs to convert this response variable to a suitable class according to your description file. After this, you can use diagGetParameter to get the parameter with the resolution and offset considered.
Otherwise, you can simply use the raw response variable and use diagGetPrimitiveByte to access the bytes in the response.