diff --git a/src/mc/src/can_driver.cpp b/src/mc/src/can_driver.cpp index d6d4ffb..219ed83 100644 --- a/src/mc/src/can_driver.cpp +++ b/src/mc/src/can_driver.cpp @@ -167,6 +167,13 @@ void CANDriver::receiveThreadFunc() frame.ext = rec[i].ExternFlag != 0; frame.rtr = rec[i].RemoteFlag != 0; frame.dlc = rec[i].DataLen; + + if (frame.dlc > 8) + { + std::cerr << "Invalid CAN data length: " << (int)frame.dlc << std::endl; + frame.dlc = 8; // 或跳过此帧 + } + std::memcpy(frame.data, rec[i].Data, frame.dlc); callback(frame, userData); } diff --git a/src/mc/src/mc.cpp b/src/mc/src/mc.cpp index 2eb81ba..fd9c3bd 100644 --- a/src/mc/src/mc.cpp +++ b/src/mc/src/mc.cpp @@ -95,7 +95,9 @@ void receiveHandler(const CANFrame &frame, void *userData) auto msg = sweeperMsg::CanFrame(); msg.id = frame.id; msg.dlc = frame.dlc; - msg.data.assign(frame.data, frame.data + frame.dlc); + size_t len = frame.dlc <= 8 ? frame.dlc : 8; + msg.data.assign(frame.data, frame.data + len); + publisher->publish(msg); // 根据开关决定是否打印 CAN 消息