Fix:CRC16 code check bug.

This commit is contained in:
Fancy code 2024-02-09 22:54:39 -08:00
parent 859a4b8ce2
commit 524fb9db30
6 changed files with 16 additions and 11 deletions

View File

@ -30,6 +30,7 @@ public:
private: private:
void CheckSerialNumber(const void *buf, const size_t &count); void CheckSerialNumber(const void *buf, const size_t &count);
void ChecCRC16Code(const void *buf, const size_t &count);
void ResetCheckCode(const void *buf, const size_t &count); void ResetCheckCode(const void *buf, const size_t &count);
void ReplySelectSucceed(std::shared_ptr<LinuxTest> &mock, const int &uartFd); void ReplySelectSucceed(std::shared_ptr<LinuxTest> &mock, const int &uartFd);
void IpcMissionProtocolHandle(std::shared_ptr<LinuxTest> &mock, const int &uartFd, const void *buf, size_t count); void IpcMissionProtocolHandle(std::shared_ptr<LinuxTest> &mock, const int &uartFd, const void *buf, size_t count);

View File

@ -29,7 +29,7 @@ unsigned char ASK_FEED_WATCH_DOG[] = {0xFA, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x81,
unsigned char ASK_SET_FEEDING_CYCLE[] = { unsigned char ASK_SET_FEEDING_CYCLE[] = {
0xFA, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, 0x0F, 0x01, 0x01, 0x01, 0xA7, 0x9A}; 0xFA, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, 0x0F, 0x01, 0x01, 0x01, 0xA7, 0x9A};
unsigned char REPLY_SET_FEEDING_CYCLE[] = { unsigned char REPLY_SET_FEEDING_CYCLE[] = {
0xFA, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x0F, 0x01, 0x01, 0x01, 0x52, 0x26}; 0xFA, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x0D, 0x01, 0x52, 0x26};
McuProtocolTestTool::McuProtocolTestTool() McuProtocolTestTool::McuProtocolTestTool()
{ {
mSerialNumberCheck = 0; mSerialNumberCheck = 0;
@ -42,6 +42,7 @@ void McuProtocolTestTool::Init(std::shared_ptr<LinuxTest> &mock, const UartInfo
auto api_write = [=, &mock](int fd, const void *buf, size_t count) { auto api_write = [=, &mock](int fd, const void *buf, size_t count) {
McuProtocolTestTool::PrintHexadecimalData(buf, count, WRITE_PRINT); McuProtocolTestTool::PrintHexadecimalData(buf, count, WRITE_PRINT);
CheckSerialNumber(buf, count); CheckSerialNumber(buf, count);
ChecCRC16Code(buf, count);
IpcMissionProtocolHandle(mock, uartFd, buf, count); IpcMissionProtocolHandle(mock, uartFd, buf, count);
CutOffPowerSupplyProtocolHandle(mock, uartFd, buf, count); CutOffPowerSupplyProtocolHandle(mock, uartFd, buf, count);
FeedWatchDogProtocolHandle(mock, uartFd, buf, count); FeedWatchDogProtocolHandle(mock, uartFd, buf, count);
@ -70,10 +71,15 @@ void McuProtocolTestTool::CheckSerialNumber(const void *buf, const size_t &count
mSerialNumberCheck++; mSerialNumberCheck++;
} }
} }
void McuProtocolTestTool::ChecCRC16Code(const void *buf, const size_t &count)
{
short code = calculate_check_sum((unsigned char *)buf, count - PROTOCOL_CHECK_CODE_LENGTH);
EXPECT_EQ(memcmp((unsigned char *)buf + count - PROTOCOL_CHECK_CODE_LENGTH, &code, 2), 0);
}
void McuProtocolTestTool::ResetCheckCode(const void *buf, const size_t &count) void McuProtocolTestTool::ResetCheckCode(const void *buf, const size_t &count)
{ {
short checkCode = calculate_check_sum((unsigned char *)buf, count - PROTOCOL_CHECK_CODE_LENGTH); short checkCode = calculate_check_sum((unsigned char *)buf, count - PROTOCOL_CHECK_CODE_LENGTH);
checkCode = htons(checkCode); // checkCode = htons(checkCode);
memcpy((unsigned char *)buf + count - PROTOCOL_CHECK_CODE_LENGTH, &checkCode, PROTOCOL_CHECK_CODE_LENGTH); memcpy((unsigned char *)buf + count - PROTOCOL_CHECK_CODE_LENGTH, &checkCode, PROTOCOL_CHECK_CODE_LENGTH);
} }
void McuProtocolTestTool::ReplySelectSucceed(std::shared_ptr<LinuxTest> &mock, const int &uartFd) void McuProtocolTestTool::ReplySelectSucceed(std::shared_ptr<LinuxTest> &mock, const int &uartFd)
@ -193,6 +199,7 @@ void McuProtocolTestTool::FeedingCycleProtocolInit(std::shared_ptr<LinuxTest> &m
{ {
LockProtocolHandle(); LockProtocolHandle();
memcpy(REPLY_SET_FEEDING_CYCLE + 2, (unsigned char *)buf + 2, PROTOCOL_SERIAL_NUMBER_LENGTH); memcpy(REPLY_SET_FEEDING_CYCLE + 2, (unsigned char *)buf + 2, PROTOCOL_SERIAL_NUMBER_LENGTH);
ResetCheckCode(REPLY_SET_FEEDING_CYCLE, sizeof(REPLY_SET_FEEDING_CYCLE));
ReplySelectSucceed(mock, uartFd); ReplySelectSucceed(mock, uartFd);
constexpr int LEFT_DATA_LENGTH = sizeof(REPLY_SET_FEEDING_CYCLE) - PROTOCOL_DATA_KEY_HEAD_LENGTH; constexpr int LEFT_DATA_LENGTH = sizeof(REPLY_SET_FEEDING_CYCLE) - PROTOCOL_DATA_KEY_HEAD_LENGTH;
auto apiReadKeyHead = [=](int fd, void *buf, size_t count) { auto apiReadKeyHead = [=](int fd, void *buf, size_t count) {

View File

@ -39,17 +39,13 @@ void LittleEndianHandle::HostByteOrderConversion(ProtocolPacket &packet)
packet.mHead = ntohs(packet.mHead); packet.mHead = ntohs(packet.mHead);
packet.mCommand = ntohs(packet.mCommand); packet.mCommand = ntohs(packet.mCommand);
packet.mLength = ntohs(packet.mLength); packet.mLength = ntohs(packet.mLength);
LogInfo("========2====== packet.mCheckCode = 0x%x\n", packet.mCheckCode);
packet.mCheckCode = ntohs(packet.mCheckCode); packet.mCheckCode = ntohs(packet.mCheckCode);
LogInfo("=========2===== packet.mCheckCode = 0x%x\n", packet.mCheckCode);
packet.mSerialNumber = ntohl(packet.mSerialNumber); packet.mSerialNumber = ntohl(packet.mSerialNumber);
} }
bool LittleEndianHandle::CheckoutTheCheckCode(const ProtocolPacket &packet) bool LittleEndianHandle::CheckoutTheCheckCode(const ProtocolPacket &packet)
{ {
short code = calculate_check_sum(mProtocolData, mProtocolDataLength - sizeof(short)); short code = calculate_check_sum(mProtocolData, mProtocolDataLength - sizeof(short));
LogInfo("============== packet.mCheckCode = 0x%x\n", packet.mCheckCode); code = ntohs(code); // TODO:
code = ntohs(code);
LogInfo("============== code = 0x%x\n", code);
if (code == packet.mCheckCode) { if (code == packet.mCheckCode) {
return true; return true;
} }

View File

@ -117,7 +117,7 @@ void McuProtocol::PushMcuData(const void *buf, const size_t &length)
} }
LogInfo("PushMcuData\n"); LogInfo("PushMcuData\n");
memcpy(data, buf, length); memcpy(data, buf, length);
ProtocolHandle::PrintHexadecimalData(data, length); ProtocolHandle::PrintHexadecimalData(data, length, "PushMcuData=");
std::lock_guard<std::mutex> locker(mMutex); std::lock_guard<std::mutex> locker(mMutex);
SingleMcuPacket packet(data, length); SingleMcuPacket packet(data, length);
mMcuDataList.push_back(packet); mMcuDataList.push_back(packet);

View File

@ -94,7 +94,7 @@ void ProtocolHandle::MakeNoUserDataPacket(const std::shared_ptr<VProtocolParam>
BigEndianConversion(packet); BigEndianConversion(packet);
memcpy(mProtocolData, &packet, KEY_HEAD_LENGTH); memcpy(mProtocolData, &packet, KEY_HEAD_LENGTH);
packet.mCheckCode = calculate_check_sum(mProtocolData, dataLength - sizeof(short)); packet.mCheckCode = calculate_check_sum(mProtocolData, dataLength - sizeof(short));
packet.mCheckCode = BigEndianConversion(packet.mCheckCode); // packet.mCheckCode = BigEndianConversion(packet.mCheckCode);
memcpy(mProtocolData + KEY_HEAD_LENGTH, &packet.mCheckCode, sizeof(short)); memcpy(mProtocolData + KEY_HEAD_LENGTH, &packet.mCheckCode, sizeof(short));
mProtocolDataLength = dataLength; mProtocolDataLength = dataLength;
} }
@ -137,7 +137,7 @@ void ProtocolHandle::MakeAskSetFeedingCyclePacket(const std::shared_ptr<VProtoco
memcpy(mProtocolData, &packet, KEY_HEAD_LENGTH); memcpy(mProtocolData, &packet, KEY_HEAD_LENGTH);
memcpy(mProtocolData + KEY_HEAD_LENGTH, feedingCycle, PARAM_DATA_LENGTH); memcpy(mProtocolData + KEY_HEAD_LENGTH, feedingCycle, PARAM_DATA_LENGTH);
packet.mCheckCode = calculate_check_sum(mProtocolData, dataLength - sizeof(short)); packet.mCheckCode = calculate_check_sum(mProtocolData, dataLength - sizeof(short));
packet.mCheckCode = BigEndianConversion(packet.mCheckCode); // packet.mCheckCode = BigEndianConversion(packet.mCheckCode);
memcpy(mProtocolData + dataLength - sizeof(short), &packet.mCheckCode, sizeof(short)); memcpy(mProtocolData + dataLength - sizeof(short), &packet.mCheckCode, sizeof(short));
mProtocolDataLength = dataLength; mProtocolDataLength = dataLength;
} }
@ -149,6 +149,7 @@ void ProtocolHandle::AnalyzeProtocolPacket(void)
(unsigned char *)mProtocolData + mProtocolDataLength - sizeof(unsigned short), (unsigned char *)mProtocolData + mProtocolDataLength - sizeof(unsigned short),
sizeof(unsigned short)); sizeof(unsigned short));
HostByteOrderConversion(packet); HostByteOrderConversion(packet);
PrintHexadecimalData(&packet, sizeof(ProtocolPacket), "HostByteOrderConversion=");
if (CheckoutTheCheckCode(packet) == false) { if (CheckoutTheCheckCode(packet) == false) {
LogError("CheckoutTheCheckCode failed.\n"); LogError("CheckoutTheCheckCode failed.\n");
return; return;

View File

@ -28,7 +28,7 @@ typedef struct protocol_packet
unsigned int mSerialNumber; unsigned int mSerialNumber;
short mCommand; short mCommand;
short mLength; short mLength;
char *mData; // char *mData;
short mCheckCode; short mCheckCode;
} ProtocolPacket; } ProtocolPacket;
#pragma pack() #pragma pack()