Browse Source

update

master
zhaohe 2 years ago
parent
commit
ba164d14f5
  1. 49
      src/test/socketcan.cpp
  2. 48
      src/test/test_can.cpp

49
src/test/socketcan.cpp

@ -124,7 +124,7 @@ bool SocketCan::initialize(string canName, int bitrate, vector<can_filter_t> 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<can_filter_t> 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<CanFrame> 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));
}
}));
}

48
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> 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 = CanFrame::createExtDataFrame(0x11111111, data, 8);
shared_ptr<CanFrame> canframe = CanFrame::createExtDataFrame(0x11223344, data, 8);
logger->info("TX Frame {}", i);
socketCan->sendFrame(canframe);
i++;
if (i == 10) {
if (i == 30) {
break;
}

Loading…
Cancel
Save