13 #include <nuttx/can/can.h>
17 const int fd = open(can_iface_name, O_RDWR | O_NONBLOCK);
29 const int close_result = close(ins->
fd);
37 memset(&fds, 0,
sizeof(fds));
39 fds.events |= POLLOUT;
41 const int poll_result = poll(&fds, 1, timeout_msec);
50 if ((fds.revents & POLLOUT) == 0)
55 struct can_msg_s transmit_msg;
56 memset(&transmit_msg, 0,
sizeof(transmit_msg));
57 transmit_msg.cm_hdr.ch_id =
frame->
id & CANARD_CAN_EXT_ID_MASK;
58 transmit_msg.cm_hdr.ch_dlc =
frame->data_len;
59 transmit_msg.cm_hdr.ch_extid = (
frame->
id & CANARD_CAN_FRAME_EFF) != 0;
62 const size_t msg_len = CAN_MSGLEN(transmit_msg.cm_hdr.ch_dlc);
63 const ssize_t nbytes = write(ins->
fd, &transmit_msg, msg_len);
64 if (nbytes < 0 || (
size_t)nbytes != msg_len)
75 memset(&fds, 0,
sizeof(fds));
79 const int poll_result = poll(&fds, 1, timeout_msec);
88 if ((fds.revents & POLLIN) == 0)
93 struct can_msg_s receive_msg;
94 const ssize_t nbytes = read(ins->
fd, &receive_msg,
sizeof(receive_msg));
95 if (nbytes < 0 || (
size_t)nbytes < CAN_MSGLEN(0) || (
size_t)nbytes >
sizeof(receive_msg))
100 out_frame->id = receive_msg.cm_hdr.ch_id;
101 out_frame->data_len = receive_msg.cm_hdr.ch_dlc;
102 memcpy(out_frame->data, receive_msg.cm_data, receive_msg.cm_hdr.ch_dlc);
104 if (receive_msg.cm_hdr.ch_extid != 0)
106 out_frame->id |= CANARD_CAN_FRAME_EFF;