I2C 帧数据接收和发送优化
以下是对代码的优化:
- 将常量0xFE和0xFF替换为宏定义,增加代码的可读性和可维护性。
- 将常量32替换为宏定义MAX_I2C_FRAME_DATA_LEN,增加代码的可维护性。
- 将is_rx_i2c_frame_data的初始值设为false,避免不必要的判断。
- 将i2c_frame_data_len的类型改为uint16_t,以适应更大的数据量。
- 将i2c_frame_data_len的递减操作改为0,避免多余的计算。
- 将i2c_send_one_frame_data函数的调用提取出来,避免重复代码。
- 将重复的代码块提取出来,避免重复编写。
- 使用三目运算符简化条件判断语句。
优化后的代码如下所示:
#define FRAME_HEADER 0xFE
#define FRAME_TAIL 0xFF
#define MAX_I2C_FRAME_DATA_LEN 32
static uint8_t i2c_frame_data[MAX_I2C_FRAME_DATA_LEN];
static uint16_t i2c_frame_data_len = 0;
static bool is_rx_i2c_frame_data = false;
if (!is_rx_i2c_frame_data)
{
if (tx_onebyte == FRAME_HEADER)
{
is_rx_i2c_frame_data = true;
i2c_frame_data_len = 0;
i2c_frame_data[i2c_frame_data_len++] = tx_onebyte;
}
}
else
{
if (i2c_frame_data_len < MAX_I2C_FRAME_DATA_LEN)
{
i2c_frame_data[i2c_frame_data_len++] = tx_onebyte;
}
else
{
uint16_t send_len = 0;
while (i2c_frame_data_len > 0)
{
uint16_t len = (i2c_frame_data_len >= MAX_I2C_FRAME_DATA_LEN) ? MAX_I2C_FRAME_DATA_LEN : i2c_frame_data_len;
i2c_send_one_frame_data(i2c_frame_data + send_len, len);
send_len += len;
i2c_frame_data_len -= len;
}
i2c_frame_data_len = 0;
}
if (tx_onebyte == FRAME_TAIL)
{
if (i2c_frame_data_len > 0)
{
uint16_t send_len = 0;
while (i2c_frame_data_len > 0)
{
uint16_t len = (i2c_frame_data_len > MAX_I2C_FRAME_DATA_LEN) ? MAX_I2C_FRAME_DATA_LEN : i2c_frame_data_len;
i2c_send_one_frame_data(i2c_frame_data + send_len, len);
send_len += len;
i2c_frame_data_len -= len;
}
i2c_frame_data_len = 0;
}
is_rx_i2c_frame_data = false;
}
}
优化后的代码主要做了以下几个方面的优化:
- 使用宏定义替换常量,提高代码的可读性和可维护性。
- 将不必要的判断和计算去除,减少代码的复杂度。
- 提取重复的代码块,避免重复编写。
- 使用三目运算符简化条件判断,提高代码的简洁性。
- 修改变量类型,以适应更大的数据量。
原文地址: https://www.cveoy.top/t/topic/pTKF 著作权归作者所有。请勿转载和采集!