if((cs[idx] == 'R') || (cs[idx] == 'r')){ /* RTR frame */
cf->can_id |= CAN_RTR_FLAG;
+
+ /* check for optional DLC value for CAN 2.0B frames */
+ if(cs[++idx] && (tmp = asc2nibble(cs[idx])) <= CAN_MAX_DLC)
+ cf->len = tmp;
+
return ret;
}
for (i=0, dlen=0; i < maxdlen; i++){
- if(cs[idx] == DATA_SEPERATOR) /* skip (optional) seperator */
+ if(cs[idx] == DATA_SEPERATOR) /* skip (optional) separator */
idx++;
if(idx >= len) /* end of string => end of data */
/* standard CAN frames may have RTR enabled. There are no ERR frames with RTR */
if (maxdlen == CAN_MAX_DLEN && cf->can_id & CAN_RTR_FLAG) {
- sprintf(buf+offset, "R");
+
+ /* print a given CAN 2.0B DLC if it's not zero */
+ if (cf->len && cf->len <= CAN_MAX_DLC)
+ sprintf(buf+offset, "R%d", cf->len);
+ else
+ sprintf(buf+offset, "R");
+
return;
}