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:
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 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);

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[] = {
0xFA, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, 0x0F, 0x01, 0x01, 0x01, 0xA7, 0x9A};
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()
{
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) {
McuProtocolTestTool::PrintHexadecimalData(buf, count, WRITE_PRINT);
CheckSerialNumber(buf, count);
ChecCRC16Code(buf, count);
IpcMissionProtocolHandle(mock, uartFd, buf, count);
CutOffPowerSupplyProtocolHandle(mock, uartFd, buf, count);
FeedWatchDogProtocolHandle(mock, uartFd, buf, count);
@ -70,10 +71,15 @@ void McuProtocolTestTool::CheckSerialNumber(const void *buf, const size_t &count
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)
{
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);
}
void McuProtocolTestTool::ReplySelectSucceed(std::shared_ptr<LinuxTest> &mock, const int &uartFd)
@ -193,6 +199,7 @@ void McuProtocolTestTool::FeedingCycleProtocolInit(std::shared_ptr<LinuxTest> &m
{
LockProtocolHandle();
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);
constexpr int LEFT_DATA_LENGTH = sizeof(REPLY_SET_FEEDING_CYCLE) - PROTOCOL_DATA_KEY_HEAD_LENGTH;
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.mCommand = ntohs(packet.mCommand);
packet.mLength = ntohs(packet.mLength);
LogInfo("========2====== packet.mCheckCode = 0x%x\n", packet.mCheckCode);
packet.mCheckCode = ntohs(packet.mCheckCode);
LogInfo("=========2===== packet.mCheckCode = 0x%x\n", packet.mCheckCode);
packet.mSerialNumber = ntohl(packet.mSerialNumber);
}
bool LittleEndianHandle::CheckoutTheCheckCode(const ProtocolPacket &packet)
{
short code = calculate_check_sum(mProtocolData, mProtocolDataLength - sizeof(short));
LogInfo("============== packet.mCheckCode = 0x%x\n", packet.mCheckCode);
code = ntohs(code);
LogInfo("============== code = 0x%x\n", code);
code = ntohs(code); // TODO:
if (code == packet.mCheckCode) {
return true;
}

View File

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

View File

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

View File

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