在给定的代码中,有以下几个问题和优化点:

  1. 在接收数据时,判断帧头是否为0xFE的逻辑有误。根据注释,应该是接收到帧头0xFE才开始接收数据,但代码中的判断条件是当帧头不为0xFE时才开始接收数据。修改判断条件为if (tx_onebyte == 0xFE)

  2. 在发送数据时,存在冗余的代码。在缓存数组已满时,通过while循环将缓存数组中的数据发送出去,并清空缓存数组。然而,在while循环中的两个分支中,执行的代码是相同的,可以将两个分支合并为一个,减少冗余代码。修改为以下代码:

i2c_send_one_frame_data(i2c_frame_data + send_len, i2c_frame_data_len);
send_len += i2c_frame_data_len;
i2c_frame_data_len = 0;
  1. 在发送数据时,可以将发送数据的逻辑提取为一个函数,以提高代码的可读性和可维护性。

下面是优化后的代码:

void i2c_tx_onebyte(uint8_t tx_onebyte)
{
    static uint8_t i2c_frame_data[MAX_I2C_FRAME_DATA_LEN];
    static uint8_t i2c_frame_data_len = 0;
    static BOOL is_rx_i2c_frame_data = USER_FALSE;

    if (!is_rx_i2c_frame_data)
    {
        if (tx_onebyte == 0xFE)
        {
            is_rx_i2c_frame_data = USER_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
        {
            i2c_send_data_frame(i2c_frame_data, i2c_frame_data_len);
            i2c_frame_data_len = 0;
        }
        
        if (tx_onebyte == 0xFF)
        {
            if (i2c_frame_data_len > 0)
            {
                i2c_send_data_frame(i2c_frame_data, i2c_frame_data_len);
                i2c_frame_data_len = 0;
            }
            is_rx_i2c_frame_data = USER_FALSE;
        }
    }
}

void i2c_send_data_frame(uint8_t* data, uint8_t len)
{
    uint8_t send_len = 0;

    while (len > 0)
    {
        uint8_t send_data_len = (len > MAX_I2C_FRAME_DATA_LEN) ? MAX_I2C_FRAME_DATA_LEN : len;
        i2c_send_one_frame_data(data + send_len, send_data_len);
        send_len += send_data_len;
        len -= send_data_len;
    }
}

这样优化后的代码结构更清晰,逻辑更明确,提高了可读性和可维护性

#define MAX_I2C_FRAME_DATA_LEN 32void i2c_tx_onebyteuint8_t tx_onebyte static uint8_t i2c_frame_dataMAX_I2C_FRAME_DATA_LEN; 存储需要发送的数据帧最大32位 static uint8_t i2c_frame_data_len = 0; 缓存中已经存储的长度

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

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