我正在尝试将结构传递给函数(通过引用)并在该函数中设置结构的几个值。
这是结构:
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
}
答案 0 :(得分:1)
难道这只是你的fprintf实现的“功能”吗?
fprintf(COM_A,"x: %d\ty: %d\tz: %d\r\n", s->ax, s->ay, s->az);
格式字符串表示您将提供3个整数,但您提供3个BYTE。 fprintf实现可能会为第二个和第三个参数生成错误的地址。