以下是对代码的优化:

  1. 将常量0xFE和0xFF替换为宏定义,增加代码的可读性和可维护性。
  2. 将常量32替换为宏定义MAX_I2C_FRAME_DATA_LEN,增加代码的可维护性。
  3. 将is_rx_i2c_frame_data的初始值设为false,避免不必要的判断。
  4. 将i2c_frame_data_len的类型改为uint16_t,以适应更大的数据量。
  5. 将i2c_frame_data_len的递减操作改为0,避免多余的计算。
  6. 将i2c_send_one_frame_data函数的调用提取出来,避免重复代码。
  7. 将重复的代码块提取出来,避免重复编写。
  8. 使用三目运算符简化条件判断语句。

优化后的代码如下所示:

#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;
    }
}

优化后的代码主要做了以下几个方面的优化:

  1. 使用宏定义替换常量,提高代码的可读性和可维护性。
  2. 将不必要的判断和计算去除,减少代码的复杂度。
  3. 提取重复的代码块,避免重复编写。
  4. 使用三目运算符简化条件判断,提高代码的简洁性。
  5. 修改变量类型,以适应更大的数据量。
I2C 帧数据接收和发送优化

原文地址: https://www.cveoy.top/t/topic/pTKF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录