0

我正在尝试将一个结构传递给一个函数(通过引用)并在该函数中设置该结构的几个值。

这是结构:

struct Sensor
{
    BYTE accel_data[6];
    BYTE gyro_data[6];
    int ax;
    int ay;
    int az;
    int gx;
    int gy;
    int gz;
}; 

这是 main() 中的声明:

struct Sensor s;

这是函数的传递:

readAccel(&s);

读取加速功能:

void readAccel(struct Sensor* s)
{
int ax, ay, az;
// Read data from Accelerometer Chip

i2c_multiRead(ACCEL_READ_ADDR, ACCEL_DATA_ADDR, s->accel_data, 6);

ax = make16(s->accel_data[1],s->accel_data[0]);
ay = make16(s->accel_data[3],s->accel_data[2]);
az = make16(s->accel_data[5],s->accel_data[4]);

fprintf(COM_A,"x: %d\ty: %d\tz: %d\r\n", ax, ay, az);

s->ax = ax;
s->ay = ay;
s->az = az;

fprintf(COM_A,"x: %d\ty: %d\tz: %d\r\n", s->ax, s->ay, s->az);
}

出于某种原因,readAccel() 底部的三个赋值行不起作用。第一个打印语句给出了正确的加速度计值。第二个 print 语句给出了正确的 x 值,但 y 是垃圾值,z 始终为 0。

这是在 pic 微芯片上运行的稍微不标准的 c(ccs c 编译器)。编译器有一些怪癖(整数是 16 位,所有变量都必须在函数的开头声明等),但我认为这不应该是它不起作用的原因(尽管我认为这是可能的)。

感谢您抽出宝贵时间提供帮助!

编辑:

这是 i2c_multiread 函数:

void i2c_multiRead(char deviceAddrR, char registerAddr, BYTE data[], int numBytes)
{
    int x;
    i2c_start();
    i2c_write(deviceAddrR-0b00000001);
    i2c_write(registerAddr);
    i2c_start();
    i2c_write(deviceAddrR);
    for(x=0; x<numBytes-1; x++)
    {
        data[x]=i2c_read();
    }
    data[numBytes-1] = i2c_read(0); //NACK on last read
    i2c_stop();
}

void main ()
{
    struct Sensor s;
    int raw_accel_data[6];
    int i, data;
    char data_ready;
    fprintf(COM_A,"keyspan working \n\r");
    initAccel(&s);
    //initGyro(&s);
    fprintf(COM_A,"ALL SYSTEMS GO (accel initialized successfully)\n\r");

while(true) {

     //data_ready = i2c_singleRead(ACCEL_READ_ADDR,ACCEL_INT_MAP);
     //data_ready = data_ready >> 7;
    readAccel(&s);
    //readGyro(&s);
    //displayGyroData(&s);
    //displayGyroRawData(&s);

    delay_ms(100);
}
// Address of ITG (Gyro Chip)
//  Read:  0xD1
//  Write: 0xD0
}
4

1 回答 1

1

难道这只是您的 fprintf 实现的一个“功能”吗?

fprintf(COM_A,"x: %d\ty: %d\tz: %d\r\n", s->ax, s->ay, s->az);

格式字符串表示您将提供 3 个整数,但您将提供 3 个字节。fprintf 实现可能会为第二个和第三个参数生成错误的地址。

于 2012-07-21T14:02:41.413 回答