Files
Frame-rate-optimization/Middlewares/mx_frame_core.c
2026-04-09 10:14:20 +08:00

162 lines
3.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "mx_frame_core.h"
#include "string.h"
static uint16_t CalChecksum(uint8_t * data, uint16_t len)
{
uint16_t sum = 0;
for(int i = 0; i < len; ++i)
{
sum += data[i];
}
return sum;
}
/*
功能:帧接收处理校验函数
参数rev_buff--接收好一帧数据的buff地址,rev_buff_len--接收好一帧数据的长度,
返回:帧数据正确或错误代号
*/
uint8_t mx_frame_rev(uint8_t* rev_buff, uint16_t rev_buff_len, mx_frame_struct *mx_out_frame)
{
uint8_t scan_max_number = 30;
uint8_t state = 0;
uint16_t index = 0;
uint16_t start_index = 0;
uint16_t surplus_len = 0;
uint16_t frame_sof = 0;
uint8_t frame_trantype = 0;
uint16_t frame_datalen = 0;
uint8_t *frame_data = NULL;
uint8_t frame_type = 0;
uint16_t frame_checksum = 0;
if(rev_buff_len < 8)
{
return FRAME_LEN_LITTLE;
}
while(1)
{
switch(state)
{
case SOF_GET:
{
frame_sof = (rev_buff[index]<<8) + rev_buff[index + 1];
index++;
surplus_len = rev_buff_len - index;
if(frame_sof == FRAME_HEAD)
{
start_index = index - 1;
state = TRANTYPE_GET;
index++;
}
else if(index == scan_max_number || surplus_len < 8)
{
return SOF_ERR;
}
}
break;
case TRANTYPE_GET:
{
frame_trantype = rev_buff[index];
index++;
state = DATALEN_GET;
}
break;
case DATALEN_GET:
{
frame_datalen = rev_buff[index] + (rev_buff[index + 1]<<8);
index = index + 2;
surplus_len = rev_buff_len - index;
if(frame_datalen - 3 <= surplus_len)
{
state = TYPE_GET;
}
else
{
return DATA_LEN_OVER;
}
}
break;
case TYPE_GET:
{
frame_type = rev_buff[index];
index++;
state = DATA_GET;
}
break;
case DATA_GET:
{
frame_data = &rev_buff[index];
index = index + frame_datalen - 6;
state = CHECKSUM_GET;
}
break;
case CHECKSUM_GET:
{
frame_checksum = (rev_buff[index + 1]<<8) + rev_buff[index];
if(frame_checksum == CalChecksum((uint8_t*)&rev_buff[start_index], frame_datalen))
{
mx_out_frame->type = frame_type;
mx_out_frame->trantype = frame_trantype;
mx_out_frame->sof = frame_sof;
mx_out_frame->datalen = frame_datalen;
mx_out_frame->data = frame_data;
//memcpy(mx_out_frame->data,frame_data,frame_datalen-6);//有bug
mx_out_frame->checksum = frame_checksum;
return REV_SUCCESSFUL;
}
else
{
return CHECK_SUM_ERR;
}
}
}
}
}
uint16_t create_frame(uint8_t *out_frame_buff, uint16_t out_fram_buff_len, mx_frame_struct *mx_input_frame)
{
uint16_t num = 0;
uint16_t loop = 0;
uint16_t checksum = 0;
uint8_t *tx_buff = out_frame_buff;
if(tx_buff == NULL)
{
return 0;
}
tx_buff[num++] = (uint8_t)SERIAL_HEAD;
tx_buff[num++] = SERIAL_HEAD>>8;
tx_buff[num++] = mx_input_frame->trantype;
tx_buff[num++] = (mx_input_frame->datalen + 6) & 0xff;
tx_buff[num++] = (mx_input_frame->datalen + 6) >> 8;
tx_buff[num++] = mx_input_frame->type;
for(loop = 0; loop < mx_input_frame->datalen; loop++)
{
tx_buff[num++] = mx_input_frame->data[loop];
}
checksum = CalChecksum(tx_buff, num);
tx_buff[num++] = checksum & 0xff;
tx_buff[num] = checksum >> 8;
return num + 1;
}