Page 1 of 1

I receive only first frame

Posted: Fri 25. Feb 2022, 14:12
by clem69
I manage to receive the first frame but the other frames do not arrive. Why?
it's 0x725 which send the first frame and other frame.

Thank you

an extract

Code: Select all

	res = CANTP_MsgDataAlloc_2016(&tx_msgI, PCANTP_MSGTYPE_ISOTP);


	//Allocate rx message
	res = CANTP_MsgDataAlloc_2016(&rx_msgI, PCANTP_MSGTYPE_NONE);


	// Create a simple physical mapping: 
	//    - Source 0xF1 (transmitter), target 0x01 (receiver), CAN id 0x725, CAN ID flow control 0x715
	//    - Diagnostic message in a classic format
	mapping_ISO.can_id = 0x715;
	mapping_ISO.can_id_flow_ctrl = 0x725;
	mapping_ISO.can_msgtype = PCANTP_CAN_MSGTYPE_STANDARD;
	mapping_ISO.netaddrinfo.extension_addr = 0x00;
	mapping_ISO.netaddrinfo.format = PCANTP_ISOTP_FORMAT_NORMAL;
	mapping_ISO.netaddrinfo.msgtype = PCANTP_ISOTP_MSGTYPE_DIAGNOSTIC;
	mapping_ISO.netaddrinfo.source_addr = 0xF1;
	mapping_ISO.netaddrinfo.target_addr = 0x01;
	mapping_ISO.netaddrinfo.target_type = PCANTP_ISOTP_ADDRESSING_PHYSICAL;
	
	mapping_ISO2.can_id = 0x725;
	mapping_ISO2.can_id_flow_ctrl = 0x715;
	mapping_ISO2.can_msgtype = PCANTP_CAN_MSGTYPE_STANDARD;
	mapping_ISO2.netaddrinfo.extension_addr = 0x00;
	mapping_ISO2.netaddrinfo.format = PCANTP_ISOTP_FORMAT_NORMAL;
	mapping_ISO2.netaddrinfo.msgtype = PCANTP_ISOTP_MSGTYPE_DIAGNOSTIC;
	mapping_ISO2.netaddrinfo.source_addr = 0xF1;
	mapping_ISO2.netaddrinfo.target_addr = 0x01;
	mapping_ISO2.netaddrinfo.target_type = PCANTP_ISOTP_ADDRESSING_PHYSICAL;

	
	 // Add request mapping
	res = CANTP_AddMapping_2016(transmitter_handle, &mapping_ISO);
	if (!CANTP_StatusIsOk_2016(result, PCANTP_STATUS_OK,false))
	{
		//printf("Failed to add request mapping. Error");
		MessagePopup( "Message free error","error");  
	}
	result = CANTP_AddFiltering_2016(PCANTP_HANDLE_USBBUS1, 0x715, 0x725, true, PCANTP_CAN_MSGTYPE_STANDARD);
  
	res = CANTP_MsgDataInit_2016(&tx_msgI, 0x715, mapping_ISO.can_msgtype, 3, NULL, &mapping_ISO.netaddrinfo);
	tx_msgI.msgdata.isotp->data[0] = 0x22;
	tx_msgI.msgdata.isotp->data[1] = 0xF1;
	tx_msgI.msgdata.isotp->data[2] = 0x95;



	// Write "42" message
	res = CANTP_Write_2016(transmitter_handle, &tx_msgI);

	res = CANTP_MsgDataFree_2016(&tx_msgI);

Re: I receive only first frame

Posted: Fri 25. Feb 2022, 14:37
by F.Vergnaud
Hello clem69,

You initialized the 2nd mapping but didn't call AddMapping.
In order to bind CAN frame 0x715 to an ISOTP communication registering mapping_ISO2 is required.

Moreover there are issues in your mappings configuration regarding the consistency between CAN_IDs and source/target addresses.
Here is a modified version of your code considering:
- CAN id 0x715 is from Source 0x01 to Target 0xF1
- CAN id 0x725 is from Source 0xF1 to Target 0x01

Code: Select all

	res = CANTP_MsgDataAlloc_2016(&tx_msgI, PCANTP_MSGTYPE_ISOTP);

	//Allocate rx message
	res = CANTP_MsgDataAlloc_2016(&rx_msgI, PCANTP_MSGTYPE_NONE);

	// Create a simple physical mapping: 
	//    - Source 0x01, target 0xF1, CAN id 0x715, CAN ID flow control 0x725
	//    - Diagnostic message in a classic format
	mapping_ISO.can_id = 0x715;
	mapping_ISO.can_id_flow_ctrl = 0x725;
	mapping_ISO.can_msgtype = PCANTP_CAN_MSGTYPE_STANDARD;
	mapping_ISO.netaddrinfo.extension_addr = 0x00;
	mapping_ISO.netaddrinfo.format = PCANTP_ISOTP_FORMAT_NORMAL;
	mapping_ISO.netaddrinfo.msgtype = PCANTP_ISOTP_MSGTYPE_DIAGNOSTIC;
	mapping_ISO.netaddrinfo.source_addr = 0x01;
	mapping_ISO.netaddrinfo.target_addr = 0xF1;
	mapping_ISO.netaddrinfo.target_type = PCANTP_ISOTP_ADDRESSING_PHYSICAL;
		
	//    - Source 0xF1 (transmitter), target 0x01 (receiver), CAN id 0x725, CAN ID flow control 0x715
	//    - Diagnostic message in a classic format
	mapping_ISO2.can_id = 0x725;
	mapping_ISO2.can_id_flow_ctrl = 0x715;
	mapping_ISO2.can_msgtype = PCANTP_CAN_MSGTYPE_STANDARD;
	mapping_ISO2.netaddrinfo.extension_addr = 0x00;
	mapping_ISO2.netaddrinfo.format = PCANTP_ISOTP_FORMAT_NORMAL;
	mapping_ISO2.netaddrinfo.msgtype = PCANTP_ISOTP_MSGTYPE_DIAGNOSTIC;
	mapping_ISO2.netaddrinfo.source_addr = 0xF1;
	mapping_ISO2.netaddrinfo.target_addr = 0x01;
	mapping_ISO2.netaddrinfo.target_type = PCANTP_ISOTP_ADDRESSING_PHYSICAL;

	
	// Add mapping communication from 0xF1 to 0x01
	res = CANTP_AddMapping_2016(transmitter_handle, &mapping_ISO2);
	if (!CANTP_StatusIsOk_2016(result, PCANTP_STATUS_OK,false))
	{
		//printf("Failed to add request mapping. Error");
		MessagePopup( "Message free error","error");  
	}
	// Add mapping communication from 0x01 to 0xF1
	res = CANTP_AddMapping_2016(transmitter_handle, &mapping_ISO);
	if (!CANTP_StatusIsOk_2016(result, PCANTP_STATUS_OK,false))
	{
		//printf("Failed to add request mapping. Error");
		MessagePopup( "Message free error","error");  
	}
  
	res = CANTP_MsgDataInit_2016(&tx_msgI, mapping_ISO2.can_id, mapping_ISO2.can_msgtype, 3, NULL, &mapping_ISO2.netaddrinfo);
	tx_msgI.msgdata.isotp->data[0] = 0x22;
	tx_msgI.msgdata.isotp->data[1] = 0xF1;
	tx_msgI.msgdata.isotp->data[2] = 0x95;

	// Write "42" message
	res = CANTP_Write_2016(transmitter_handle, &tx_msgI);

	res = CANTP_MsgDataFree_2016(&tx_msgI);
Also you don't need to call CANTP_AddFiltering_2016(..., 0x715, 0x725, ...), this is needed when you need to filter and receive non ISO-TP frames.