#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; 缓存中已经存储的长度
在给定的代码中,有以下几个问题和优化点:
-
在接收数据时,判断帧头是否为0xFE的逻辑有误。根据注释,应该是接收到帧头0xFE才开始接收数据,但代码中的判断条件是当帧头不为0xFE时才开始接收数据。修改判断条件为
if (tx_onebyte == 0xFE)。 -
在发送数据时,存在冗余的代码。在缓存数组已满时,通过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;
- 在发送数据时,可以将发送数据的逻辑提取为一个函数,以提高代码的可读性和可维护性。
下面是优化后的代码:
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;
}
}
这样优化后的代码结构更清晰,逻辑更明确,提高了可读性和可维护性
原文地址: http://www.cveoy.top/t/topic/h3Nq 著作权归作者所有。请勿转载和采集!