gpt4 book ai didi

c - 使用 'for' 循环为变量赋值并在该函数中使用变量名称

转载 作者:行者123 更新时间:2023-11-30 16:06:45 29 4
gpt4 key购买 nike

我有一个 for 循环,可以从从属 i2c 设备获取数据。该设备有 3 轴,我需要读取每个轴的高位和低位,总共六次测量,然后将它们组合成一个变量。我一开始只是创建一个函数来获取数据并将从机地址和子寄存器地址传递给该函数,但现在我正在集成第二个从机设备,这意味着我需要调用该函数 12 次,然后就会有到 main 中的位组合或通过引用传递一些内容到另一个函数。

相反,我创建了一个循环遍历所有数据寄存器的函数,我想将其分配给该循环中的变量名称,然后在同一函数中进行位组合。我有一个变量名称数组和一个指向这些名称的指针,这些名称与数据子寄存器地址一起迭代。

char data_name[] = {'a', 'b', 'c', 'd', 'e', 'f'};

char *array_name_pointer[7];
array_name_pointer[i] = &data_name[i];
uint8_t sub_data_reg = 0x00;

for(i=0; i<6; i++){

if (HAL_I2C_Mem_Read(&hi2c1, Comp_Addr , sub_data_reg, sizeof(sub_data_reg), (uint8_t*)(&array_name_pointer), sizeof(data_name[i]), HAL_MAX_DELAY) != HAL_OK){
Error_Handler();
printf("Could not get raw data \n\r");
}

printf("%c has value %d \n\r", (data_name[i]), sub_data_reg);
sub_data_reg ++;
}

xl = a;
xh = b;
yl = c;
yh = d;
zl = e;
zh = f;

printf("xl: %d xh: %d yl: %d yh:%d \n\r", xl, xh, yl, yh);

float x_Raw = ((xh<<8)|xl);
float y_Raw = ((yh<<8)|yl);
float z_Raw = ((zh<<8)|zl);`

我的第一行 printf 行正确打印 a = 0 等,但是当我将变量名称更改为 xl 时,它给出了一个错误,其中 a, b, ... 之前没有使用过。我怀疑这是因为它们是 char 类型,所以我尝试将它们更改为 int 类型。当我这样做时,xl、xh 等的值始终为 0

如何将测量值分配给这些变量?这样做是好的做法吗?

谢谢!

最佳答案

字符常量'a''b'。您用来初始化 data_name[] 的变量与名为 ab 等的变量没有任何关系。

此外,在此代码中:

char *array_name_pointer[7];
array_name_pointer[i] = &data_name[i];

目前尚不清楚 i 的值是多少。如果 i 超出 0 到 6 的范围,则此数组访问将超出范围,导致未定义的行为

在此代码中:

    if (HAL_I2C_Mem_Read(&hi2c1, Comp_Addr , sub_data_reg, sizeof(sub_data_reg), (uint8_t*)(&array_name_pointer), sizeof(data_name[i]), HAL_MAX_DELAY) != HAL_OK){

char *array_name_pointer 数组被用作 uint8_t 值的缓冲区。假设指针有 4 个字节长,那么由于 i 从 0 到 5(含 0 和 5)循环(当 i == 6 时终止),这将破坏 中保存的任何指针值>array_name_pointer[0]array_name_pointer[1]

这段代码:

    printf("%c has value %d \n\r", (data_name[i]), sub_data_reg);
sub_data_reg ++;

将打印a = 0、b = 1、c = 2等。其中0、1和2不是从I2C寄存器读取的数据。它们只是正在读取的 I2C 寄存器的索引。

在此代码中:

xl = a;
xh = b;
yl = c;
yh = d;
zl = e;
zh = f;

变量ab等可能从未被初始化或赋值,从而导致编译器警告。

<小时/>

您可能需要做的是将 I2C 寄存器读入 uint8_t 数组并从该数组中提取值:

    uint8_t reg_vals[6];
uint8_t sub_data_reg = 0x00;

for (i = 0; i < 6; i++) {
if (HAL_I2C_Mem_Read(&hi2c1, Comp_Addr , sub_data_reg, sizeof(sub_data_reg), &reg_vals[i], sizeof(reg_vals[i]), HAL_MAX_DELAY) != HAL_OK){
Error_Handler();
printf("Could not get raw data \n\r");
}

printf("%c has value %d \n\r", data_name[i], reg_vals[i]);
sub_data_reg ++;
}

xl = reg_vals[0];
xh = reg_vals[1];
yl = reg_vals[2];
yh = reg_vals[3];
zl = reg_vals[4];
zh = reg_vals[5];

如果 I2C 设备支持读取具有自动递增寄存器地址的寄存器 block ,您可以将上面的代码更改为调用 HAL_I2C_Mem_Read 一次,而不是 6 次:

    uint8_t reg_vals[6];
uint8_t sub_data_reg = 0x00;

if (HAL_I2C_Mem_Read(&hi2c1, Comp_Addr , sub_data_reg, sizeof(sub_data_reg), &reg_vals[0], 6 * sizeof(reg_vals[0]), HAL_MAX_DELAY) != HAL_OK){
Error_Handler();
printf("Could not get raw data \n\r");
}
sub_data_reg += 6;

for (i = 0; i < 6; i++) {
printf("%c has value %d \n\r", data_name[i], reg_vals[i]);
}

xl = reg_vals[0];
xh = reg_vals[1];
yl = reg_vals[2];
yh = reg_vals[3];
zl = reg_vals[4];
zh = reg_vals[5];

关于c - 使用 'for' 循环为变量赋值并在该函数中使用变量名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59865289/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com