cansend: send multiple frames in one invocation
It is sometimes convenient to be able to send multiple frames with a single cansend invocation, otherwise the time between frames can get very large. Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>pull/93/head
parent
f811b53dfe
commit
b541771b7b
|
|
@ -11,7 +11,7 @@ subsystem (aka SocketCAN):
|
|||
|
||||
* candump : display, filter and log CAN data to files
|
||||
* canplayer : replay CAN logfiles
|
||||
* cansend : send a single frame
|
||||
* cansend : send single frames
|
||||
* cangen : generate (random) CAN traffic
|
||||
* cansniffer : display CAN data content differences (just 11bit CAN IDs)
|
||||
|
||||
|
|
|
|||
14
cansend.c
14
cansend.c
|
|
@ -60,14 +60,15 @@ int main(int argc, char **argv)
|
|||
int s; /* can raw socket */
|
||||
int required_mtu;
|
||||
int mtu;
|
||||
int enable_canfd = 1;
|
||||
int enable_canfd = 0;
|
||||
int framecnt;
|
||||
struct sockaddr_can addr;
|
||||
struct canfd_frame frame;
|
||||
struct ifreq ifr;
|
||||
|
||||
/* check command line options */
|
||||
if (argc != 3) {
|
||||
fprintf(stderr, "Usage: %s <device> <can_frame>.\n", argv[0]);
|
||||
if (argc < 3) {
|
||||
fprintf(stderr, "Usage: %s <device> <can_frame>...\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -100,8 +101,9 @@ int main(int argc, char **argv)
|
|||
return 1;
|
||||
}
|
||||
|
||||
for (framecnt = 2; framecnt < argc; framecnt++) {
|
||||
/* parse CAN frame */
|
||||
required_mtu = parse_canframe(argv[2], &frame);
|
||||
required_mtu = parse_canframe(argv[framecnt], &frame);
|
||||
if (!required_mtu){
|
||||
fprintf(stderr, "\nWrong CAN-frame format! Try:\n\n");
|
||||
fprintf(stderr, " <can_id>#{R|data} for CAN 2.0 frames\n");
|
||||
|
|
@ -119,6 +121,7 @@ int main(int argc, char **argv)
|
|||
|
||||
if (required_mtu > CAN_MTU) {
|
||||
|
||||
if (enable_canfd == 0) {
|
||||
/* check if the frame fits into the CAN netdevice */
|
||||
if (ioctl(s, SIOCGIFMTU, &ifr) < 0) {
|
||||
perror("SIOCGIFMTU");
|
||||
|
|
@ -132,11 +135,13 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
/* interface is ok - try to switch the socket into CAN FD mode */
|
||||
enable_canfd = 1;
|
||||
if (setsockopt(s, SOL_CAN_RAW, CAN_RAW_FD_FRAMES,
|
||||
&enable_canfd, sizeof(enable_canfd))){
|
||||
printf("error when enabling CAN FD support\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* ensure discrete CAN FD length values 0..8, 12, 16, 20, 24, 32, 64 */
|
||||
frame.len = can_dlc2len(can_len2dlc(frame.len));
|
||||
|
|
@ -147,6 +152,7 @@ int main(int argc, char **argv)
|
|||
perror("write");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
close(s);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue