Fix:CRC16 code check bug.
This commit is contained in:
parent
859a4b8ce2
commit
524fb9db30
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user