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.
{
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");
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;
}
}
}
}
}