结构指针赋值

时间:2012-07-20 22:20:02

标签: c memory pointers struct pic

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

这是结构:

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);

readAccel函数:

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语句给出了正确的加速度计值。第二个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
}

1 个答案:

答案 0 :(得分:1)

难道这只是你的fprintf实现的“功能”吗?

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

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