MX Foundation 4
Error Detection

The MXF_CANBUS_DATAREC.control field is used to detect errors on the received record. Many errors can be detected on a received record.

The example below shows how a program can receive CAN words and detect receive errors.

The data are read from the rx buffer and each record is check for data error.

The receive errors can be detected at two levels:

  • With the datarec control field
  • Further, we also check for queue detected errors by using the status parameters of the function. Typical errors of this type are reception queue overflow because the data was not read fast enough.
{
// Reads the acquisition data
rc = mxfCanBusRxAcqRead(rxBuffer, 0, sizeof(rec), &status, &msgCount, &byteCount, rec);
if(!rc)
{
if(status & MXF_RXACQ_STATUS_OVERFLOW)
printf("Acquisition Buffer overflow \n");
if(status & MXF_RXACQ_STATUS_BUFFER_FULL)
printf("Acquisition Buffer full \n");
if(status & MXF_RXACQ_STATUS_MODULE_PORT_OVERFLOW)
printf("Acquisition Module overflow \n");
if(status & MXF_RXACQ_STATUS_OUT_OF_RESOURCE)
printf("Acquisition out of resources \n");
// Checks error detected on a message basis
canRec = (MXF_CANBUS_DATAREC*)rec;
for(i=0; i < msgCount; i++)
{
if(canRec->control & MXF_CANBUS_RX_REC_CTRL_CRC_ERROR)
printf("CAN record #%d -> CRC error \n", i);
if(canRec->control & MXF_CANBUS_RX_REC_CTRL_ERROR_ID)
printf("CAN record #%d -> ID error \n", i);
if(canRec->control & MXF_CANBUS_RX_REC_CTRL_ERROR_DLC)
printf("CAN record #%d -> DLC error \n", i);
if(canRec->control & MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT)
{
switch (canRec->control & MXF_CANBUS_RX_REC_CTRL_ERROR_CODE)
{
case MXF_CANBUS_RX_REC_CTRL_ERROR_CODE_BIT:
printf("CAN record #%d -> BIT error, ", i);
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_CODE_FORM:
printf("CAN record #%d -> Form error, ", i);
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_CODE_STUFF:
printf("CAN record #%d -> Stuff error, ", i);
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_CODE_OTHER:
printf("CAN record #%d -> Other error, ", i);
break;
}
if ((canRec->control & MXF_CANBUS_RX_REC_CTRL_ERROR_DIR) == MXF_CANBUS_RX_REC_CTRL_ERROR_DIR_RX)
printf("RX, ");
else
printf("TX, ");
switch (canRec->control & MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT)
{
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_SOF:
printf("segment SOF\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_ID28_ID21:
printf("segment ID[28-21]\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_ID20_ID18:
printf("segment ID[20-18]\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_SRTR:
printf("segment SRTR\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_IDE:
printf("segment IDE\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_ID17_ID13:
printf("segment ID[17-13]\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_ID12_ID5:
printf("segment ID[12-5]\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_ID4_ID0:
printf("segment ID[4-0]\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_RTR:
printf("segment RTR\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_RESERVED1:
printf("segment reserved1\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_RESERVED0:
printf("segment reserved0\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_LEN_CODE:
printf("segment DLC\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_DATA:
printf("segment Data\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_CRC_SEQ:
printf("segment CRC sequence\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_CRC_DEL:
printf("segment CRC delimiter\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_ACK_SLOT:
printf("segment ACK slot\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_ACK_DEL:
printf("segment ACK delimiter\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_EOF:
printf("segment EOF\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_INTER:
printf("segment intermission\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_ACTIVE_ERR_FLAG:
printf("segment active error flag\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_PASSIVE_ERR_FLAG:
printf("segment passive error flag\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_TOLERATE_DOMINANT_BIT:
printf("segment tolerate dominant bits\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_ERR_DEL:
printf("segment error delimiter\n");
break;
case MXF_CANBUS_RX_REC_CTRL_ERROR_SEGMENT_OVERLOAD_FLAG:
printf("segment overload flag\n");
break;
}
}
}
}
}
Updated 10/23/2023