#include /** * @brief 计算校验和 * @param buf: 数据缓冲区指针 (即你的 uart1_rx_buf) * @param start_pos: 校验数据的起始下标 (通常跳过帧头 "LOGI:") * @param length: 需要校验的数据长度 (不包含校验位本身和帧尾) * @return uint8_t: 计算得出的校验和 * * 算法说明: 将所有字节相加,取低8位 (相当于 % 256) */ uint8_t Calculate_CheckSum(uint8_t *buf, uint16_t start_pos, uint16_t length) { uint32_t sum = 0; // 使用32位防止累加溢出,虽然uint8累加也不会溢出单片机寄存器 uint16_t i; for (i = 0; i < length; i++) { sum += buf[start_pos + i]; } // 返回低8位,相当于 sum % 256 return (uint8_t)(sum & 0xFF); }