CAN_DEVCTL_READ_CANMSG_EXT
QNX SDP8.0Devctl and Ioctl CommandsDeveloper
Read an extended CAN message
Synopsis:
#include <sys/can_dcmd.h>
#define CAN_DEVCTL_READ_CANMSG_EXT __DIOF(_DCMD_MISC, CAN_CMD_CODE + 8, struct can_msg)
Arguments to devctl():
Argument | Value |
---|---|
filedes | A file descriptor that you obtained by opening the device |
dcmd | CAN_DEVCTL_READ_CANMSG_EXT |
dev_data_ptr | A pointer to a struct can_msg |
n_bytes | sizeof(struct can_msg) |
dev_info_ptr | NULL |
Description:
This command reads an extended CAN message, blocking if there's no message available unless you opened the device with O_NONBLOCK.
Input:
None.
Output:
A filled-in can_msg structure, which is defined in <sys/can_dcmd.h> as follows:
#define CAN_MSG_DATA_MAX 0x8 /* Max number of data bytes in a CAN message
as defined by CAN spec */
/* Extended CAN Message */
typedef struct can_msg_ext {
uint32_t timestamp; /* CAN message timestamp */
uint32_t is_extended_mid; /* 1=29-bit MID, 0=11-bit MID */
uint32_t is_remote_frame; /* 1=remote frame request, 0=data frame */
} CAN_MSG_EXT;
/* CAN Message */
typedef struct can_msg {
/* Pre-allocate CAN messages to the max data size */
uint8_t dat[CAN_MSG_DATA_MAX]; /* CAN message data */
uint8_t len; /* Actual CAN message data length */
uint32_t mid; /* CAN message identifier */
CAN_MSG_EXT ext; /* Extended CAN message info */
} CAN_MSG;
Errors:
The devctl() function can return the following, in addition to the error codes listed in its entry in the C Library Reference:
- EAGAIN
- There are no messages in the queue, and you opened the device with O_NONBLOCK.
- EINVAL
- The file descriptor doesn't correspond to a receive mailbox.
Example:
int ret;
unsigned i;
uint8_t dat[CAN_MSG_DATA_MAX];
char dat_str[sizeof(dat) + 1]; /* max size of a CAN message + '\0' */
if( (fd = open( "/dev/can1/rx0", O_RDWR)) == -1 )
{
printf("open of %s failed \n", devname);
exit(EXIT_FAILURE);
}
if(EOK != (ret = devctl(fd, CAN_DEVCTL_READ_CANMSG_EXT, &canmsg, sizeof(canmsg),
NULL)))
{
fprintf(stderr, "devctl CAN_DEVCTL_READ_CANMSG_EXT: %s\n", strerror(ret));
} else {
printf("READ_CANMSG_EXT:\n");
printf("mid = 0x%X\n", canmsg.mid);
printf("timestamp = 0x%X\n", canmsg.ext.timestamp);
printf("dat len = %d\n", canmsg.len);
/* Copy the data */
memcpy(dat, canmsg.dat, canmsg.len);
/* Print the data */
printf("dat =");
for (i=0; i < canmsg.len; i++) {
printf(" %.2x", dat[i]);
dat_str[i] = isprint(dat[i]) ? dat[i] : '.';
}
dat_str[i] = '\0';
printf("\t%s\n", dat_str);
}
See also:
CAN_DEVCTL_RX_FRAME_RAW_BLOCK, CAN_DEVCTL_RX_FRAME_RAW_NOBLOCK, CAN_DEVCTL_TX_FRAME_RAW, CAN_DEVCTL_WRITE_CANMSG_EXT
devctl() in the QNX OS C Library Reference
canctl in the Utilities Reference
Page updated: