Files
hc32f460_boot/components/update_protocol.c
T

123 lines
2.6 KiB
C
Raw Normal View History

2026-04-23 13:49:53 +08:00
#include "update_protocol.h"
#include "string.h"
static struct
{
update_send_t pfnSend;
update_callback_t EventCb;
}g_update_protoc;
uint16_t CRC_Modbus(uint16_t wBase, uint8_t* para, uint16_t length)
{
uint16_t crc = 0xffff;
uint16_t index, i;
for (index = 0 ; index < length; index++)
{
crc ^= para[index];
for (i = 0; i < 8; i++)
{
if (crc & 1)
{
crc >>= 1;
crc ^= wBase;
}
else
crc >>= 1;
}
}
return crc;
}
void update_send_cmd(uint8_t Cmd, uint16_t Indx, int PageNum)
{
uint8_t sData[24]={0};
uint8_t sLen =0;
uint16_t crc16;
update_protocol_hd_t *Frame = (update_protocol_hd_t*)sData;
Frame->Header = 0x7a;
Frame->SlvAddr = 0x01;
Frame->Cmd = Cmd;
if (Cmd == 0x01)
{
Frame->PayloadLen = 1;
sData[sizeof(update_protocol_hd_t)] = Indx;
}
else if (Cmd == 0x02)
{
Frame->PayloadLen = 4;
update_protocol_get_t *GDData = (update_protocol_get_t*)&sData[sizeof(update_protocol_hd_t)];
GDData->PackageIndex = Indx;
GDData->PackageNum = PageNum;
}
sLen = sizeof(update_protocol_hd_t) + Frame->PayloadLen;
crc16 = CRC_Modbus(CRC16_BASE, sData, sLen);
sData[sLen++] = crc16;
sData[sLen++] = (crc16 >> 8) & 0x00ff;
g_update_protoc.pfnSend(sData, sLen);
}
void update_init(update_send_t pCbs)
{
g_update_protoc.pfnSend =pCbs;
}
void update_event_cbs_reg(update_callback_t pCbs)
{
g_update_protoc.EventCb = pCbs;
}
uint8_t update_unpack(uint8_t* rxData, int rLen,uint8_t *cmd, void *pload, int *pLen){
uint16_t crc16;
uint16_t check;
check = CRC_Modbus(CRC16_BASE, rxData, rLen - 2);
crc16 = (rxData[rLen - 1] << 8) | rxData[rLen - 2];
if (check != crc16 || rxData[0] !=0x7a || pload ==0)
{
return 0;
}
update_protocol_hd_t *Frame = (update_protocol_hd_t*)rxData;
*cmd = Frame->Cmd;
if (Frame->Cmd == 0x81){
//update_protocol_req_t *UpData = (update_protocol_req_t*)&rxData[sizeof(update_protocol_hd_t)];
pload = 0;
*pLen = 0;
}else if (Frame->Cmd == 0x82){
update_protocol_rsp_t *DownData = (update_protocol_rsp_t *)&rxData[sizeof(update_protocol_hd_t)];
memcpy(pload , &rxData[sizeof(update_protocol_hd_t) + sizeof(update_protocol_rsp_t)],DownData->DataLen);
*pLen = DownData->DataLen;
}else{
return 0;
}
return 1;
}