diff --git a/src/test/socketcan.cpp b/src/test/socketcan.cpp index 3dbc564..6009cc0 100644 --- a/src/test/socketcan.cpp +++ b/src/test/socketcan.cpp @@ -124,7 +124,7 @@ bool SocketCan::initialize(string canName, int bitrate, vector fil return false; } - setCanBitrate(canName, bitrate); + // setCanBitrate(canName, bitrate); m_canfd = socket(PF_CAN, SOCK_RAW, CAN_RAW); if (m_canfd < 0) { @@ -136,6 +136,12 @@ bool SocketCan::initialize(string canName, int bitrate, vector fil strcpy(ifr.ifr_name, canName.c_str()); ioctl(m_canfd, SIOCGIFINDEX, &ifr); + const int bufsize = 0; + if (setsockopt(m_canfd, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize)) != 0) { + logger->error("setsockopt SO_SNDBUF fail,{}", strerror(errno)); + return -1; + } + struct sockaddr_can addr = {0}; addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; @@ -181,37 +187,50 @@ int SocketCan::sendFrame(shared_ptr frame) { } return 0; } +#if 0 +struct canfd_frame { + canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ + __u8 len; /* frame payload length in byte */ + __u8 flags; /* additional flags for CAN FD */ + __u8 __res0; /* reserved / padding */ + __u8 __res1; /* reserved / padding */ + __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8))); +}; +#endif + void SocketCan::startListen() { m_thread.reset( // new Thread(fmt::format("SocketCan_{}_ListenThread", m_canName), // [this]() { ThisThread thisThread; - fd_set readFileDescriptors; - - timeval waitTime; - waitTime.tv_sec = 3; - waitTime.tv_usec = 0; - + fd_set readfds, readFileDescriptors; FD_ZERO(&readFileDescriptors); FD_SET(m_canfd, &readFileDescriptors); while (!thisThread.getExitFlag()) { - canfd_frame_t canframe; + canfd_frame_t canframe; + struct canfd_frame frame; + + timeval waitTime; + waitTime.tv_sec = 3; + waitTime.tv_usec = 0; - logger->info("select...."); - size_t n = select(m_canfd + 1, &readFileDescriptors, 0, 0, &waitTime); + readfds = readFileDescriptors; + + int n = select(m_canfd + 1, &readfds, 0, 0, &waitTime); + logger->info("select.... {}", n); if (n <= 0) { continue; } memset(&canframe, 0x00, sizeof(canframe)); int ret = read(m_canfd, &canframe, sizeof(canframe)); - if (ret != sizeof(canframe)) { - logger->error("read fail,{}", strerror(errno)); - continue; - } + // if (ret != sizeof(canframe)) { + // logger->error("read fail,{}", strerror(errno)); + // continue; + // } - logger->info("RX:{}", StringUtils().bytesToString((uint8_t *)&canframe, sizeof(canframe))); + logger->info("RX({}):{}", ret, StringUtils().bytesToString((uint8_t *)&canframe, ret)); } })); } diff --git a/src/test/test_can.cpp b/src/test/test_can.cpp index fc1670d..d9aab42 100644 --- a/src/test/test_can.cpp +++ b/src/test/test_can.cpp @@ -57,52 +57,10 @@ class Main { } void onSIGINT() { exit(0); } int main(int argCount, char* argValues[]) { -#if 0 - int s, nbytes; - struct sockaddr_can addr; - struct ifreq ifr; - struct can_frame frame[2] = {{0}}; - s = socket(PF_CAN, SOCK_RAW, CAN_RAW); - printf("send_s = %d\n", s); - strcpy(ifr.ifr_name, "can0"); - ioctl(s, SIOCGIFINDEX, &ifr); - addr.can_family = AF_CAN; - addr.can_ifindex = ifr.ifr_ifindex; - bind(s, (struct sockaddr*)&addr, sizeof(addr)); - - setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0); - - frame[0].can_id = 0x11; - frame[0].can_dlc = 1; - frame[0].data[0] = 'Y'; - frame[1].can_id = 0x410; - frame[1].can_dlc = 1; - frame[1].data[0] = 'N'; - - while (1) { - nbytes = write(s, &frame[0], sizeof(frame[0])); - if (nbytes != sizeof(frame[0])) { - printf("Send Error frame[0]!\n"); - break; - } - - sleep(1); - - nbytes = write(s, &frame[1], sizeof(frame[1])); - if (nbytes != sizeof(frame[1])) { - printf("Send Error frame[1]!\n"); - break; - } - - sleep(1); - } - - close(s); - while(1) sleep(1000); -#endif socketCan.reset(new SocketCan()); socketCan->initialize("can0", 500000, {}); + socketCan->startListen(); socketCan->signalOnFrame.connect([this](shared_ptr canframe) { if (canframe) { @@ -116,11 +74,11 @@ class Main { while (!thisThread.getExitFlag()) { thisThread.sleepForMs(10); uint8_t data[8] = {1, 2, 3, 4, 5, 6, 7, 8}; - shared_ptr canframe = CanFrame::createExtDataFrame(0x11111111, data, 8); + shared_ptr canframe = CanFrame::createExtDataFrame(0x11223344, data, 8); logger->info("TX Frame {}", i); socketCan->sendFrame(canframe); i++; - if (i == 10) { + if (i == 30) { break; }