Page 1 of 1

How to send 11 and 29 bit identifier

Posted: Wed 7. Aug 2019, 12:18
by Cappo
Hello,

with UDSApi.Write how can I send an uudt 11 or 29 bit message id?
ie 0x100 in 11 bit format id and 0x100 in 29 bit format

Best Regards
cappo

Re: How to send 11 and 29 bit identifier

Posted: Wed 7. Aug 2019, 12:25
by F.Vergnaud
Dear cappo,

You will find a complete UUDT example in the documentation of the PCAN - UDS API :
- §4.3.3 "UUDT Read / Write example" p.343.

Code: Select all

void sample_rw_uudt(TPUDSCANHandle channelTx, TPUDSCANHandle channelRx) {
	TPUDSStatus status;
	int iBuffer;
	TPUDSMsg Message;
	int count;
	// Initializes UDS Communication for the transmitting channel
	status = UDS_Initialize(channelTx, PUDS_BAUD_500K, 0, 0, 0);
	printf("Initialize UDS: %i\n", (int)status);
	// Initializes UDS Communication for the receiving channel
	status = UDS_Initialize(channelRx, PUDS_BAUD_500K, 0, 0, 0);
	printf("Initialize ChannelRx: %i\n", (int)status);
	// Define "channelTx" Address as ECU #9
	iBuffer = 0xF9;
	status = UDS_SetValue(channelTx, PUDS_PARAM_SERVER_ADDRESS, &iBuffer, 1);
	printf("  Set ServerAddress: %i (0x%02x)\n", (int)status, iBuffer);
	// Define "channelRx" Address as External equipement
	iBuffer = 0xF1;
	status = UDS_SetValue(channelRx, PUDS_PARAM_SERVER_ADDRESS, &iBuffer, 1);
	printf("  Set ServerAddress: %i (0x%02x)\n", (int)status, iBuffer);

	// Prepare mapping configuration: 
  //  UUDT physical response from ECU_#9 to External_Equipment : ID=0x526
	Message.NETADDRINFO.SA = 0xF9;
	Message.NETADDRINFO.TA = 0xF1;
	Message.NETADDRINFO.TA_TYPE = PUDS_ADDRESSING_PHYSICAL;
	Message.NETADDRINFO.RA = 0x00;
	Message.NETADDRINFO.PROTOCOL = PUDS_PROTOCOL_NONE;
	Message.LEN = 4;
	// data[0..3] holds CAN ID
	Message.DATA.RAW[0] = 0x00;
	Message.DATA.RAW[1] = 0x00;
	Message.DATA.RAW[2] = 0x05;
	Message.DATA.RAW[3] = 0x26;

	// Add "channelTx" mapping (in order to send message)
  //  for UUDT physical response from ECU_#9 to External_Equipment : ID=0x526
	status = UDS_SetValue(channelTx, PUDS_PARAM_MAPPING_ADD, &Message, sizeof(Message));
	printf("  Add UUDT mapping: 0x%04x\n", status);
	// Add "channelRx" mapping (in order to receive message)
  //  for UUDT physical response from ECU_#9 to External_Equipment : ID=0x526
	status = UDS_SetValue(channelRx, PUDS_PARAM_MAPPING_ADD, &Message, sizeof(Message));
	printf("  Add ChannelRx UUDT mapping: 0x%04x\n", status);

	// Write a message from "channelTx" to "channelRx"
	Message.LEN = 6;
	Message.DATA.RAW[4] = 0xCA;
	Message.DATA.RAW[5] = 0xB1;
	status = UDS_Write(channelTx, &Message);
	printf("  UDS_Write UUDT: 0x%04x\n", status);
	// Read message on channel Rx
	printf("  Reading message on ChannelRx...\n");
	memset(&Message, 0, sizeof(Message));
	count = 0;
	do {
		count++;
		Sleep(100);
		status = UDS_Read(channelRx, &Message);
	} while (status == PUDS_ERROR_NO_MESSAGE && count < 10);
	if (status == PUDS_ERROR_NO_MESSAGE)
		printf("Failed to read message on Channel RX !");
	else {
		// Received message will hold Network Address Information
		//  as defined by the mapping.
		// The CAN ID information is removed from the DATA.RAW field.
		displayMessage(NULL, &Message);
	}
	UDS_Uninitialize(channelTx);
}

Re: How to send 11 and 29 bit identifier

Posted: Wed 7. Aug 2019, 12:34
by Cappo
Hello,

I wrote here after I read that example...
So take the example code

Code: Select all

   Message.NETADDRINFO.SA = 0xF9;
   Message.NETADDRINFO.TA = 0xF1;
   Message.NETADDRINFO.TA_TYPE = PUDS_ADDRESSING_PHYSICAL;
   Message.NETADDRINFO.RA = 0x00;
   Message.NETADDRINFO.PROTOCOL = PUDS_PROTOCOL_NONE;
   Message.LEN = 4;
   // data[0..3] holds CAN ID
   Message.DATA.RAW[0] = 0x00;
   Message.DATA.RAW[1] = 0x00;
   Message.DATA.RAW[2] = 0x05;
   Message.DATA.RAW[3] = 0x26;

   // Add "channelTx" mapping (in order to send message)
  //  for UUDT physical response from ECU_#9 to External_Equipment : ID=0x526
   status = UDS_SetValue(channelTx, PUDS_PARAM_MAPPING_ADD, &Message, sizeof(Message));
0x256 can be an 11 or 29 bit identifier..... and how can I set this parameter?
To be claer the same thing that in isotp write is PCANTP_ID_CAN_29BIT or PCANTP_ID_CAN_11BIT.

Thanks
cappo

Re: How to send 11 and 29 bit identifier

Posted: Wed 7. Aug 2019, 14:51
by F.Vergnaud
You are right. Currently the PCAN-UDS UUDT mechanism does not handle 29 bit flag.
Nevertheless you can write your UUDT message with PCAN-ISO-TP API using the CAN handle initialized by PCAN-UDS as such:

Code: Select all

void sample_rw_uudt_29b(TPUDSCANHandle channelTx, TPUDSCANHandle channelRx) {
	...
	// Write a 11 bit message from "channelTx" to "channelRx" with PCAN-UDS
	//Message.LEN = 6;
	//Message.DATA.RAW[4] = 0xCA;
	//Message.DATA.RAW[5] = 0xB1;
	//status = UDS_Write(channelTx, &Message);

	// Write a 29 bit message from "channelTx" to "channelRx" with PCAN-ISO-TP
	TPCANTPMsg tpmsg = {};
	tpmsg.FORMAT = PCANTP_FORMAT_NONE;
	tpmsg.MSGTYPE = PCANTP_MESSAGE_UNKNOWN;
	tpmsg.IDTYPE = PCANTP_ID_CAN_29BIT;
	tpmsg.TA_TYPE = PCANTP_ADDRESSING_UNKNOWN;
	tpmsg.LEN = 6;
	tpmsg.DATA[0] = 0x00;
	tpmsg.DATA[1] = 0x00;
	tpmsg.DATA[2] = 0x05;
	tpmsg.DATA[3] = 0x26;
	tpmsg.DATA[4] = 0xCA;
	tpmsg.DATA[5] = 0xB1;
	status = CANTP_Write(channelTx, &tpmsg);
	printf("  UDS_Write UUDT: 0x%04x\n", status);
	...
The UDS_Read function will return a UDS message with CAN ID 0x526 in the DATA field, but you will not be able to tell if it is a 11bit or 29 bit CAN ID.

Re: How to send 11 and 29 bit identifier

Posted: Wed 7. Aug 2019, 14:55
by Cappo
Okay, thanks! :D

Best Regards
cappo