【发布时间】:2012-07-20 22:20:01
【问题描述】:
我正在尝试将结构传递给函数(通过引用)并在该函数中设置结构的多个值。
结构如下:
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() 底部的三个赋值行不起作用。第一个打印语句给出了正确的加速度计值。第二个打印语句为 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
}
【问题讨论】:
-
听起来很奇怪。关闭优化设置有帮助吗?
-
您的代码对我来说看起来不错。它要么是您的编译器/平台,要么是您发布的范围之外的其他东西。
-
@aschepler 我不确定如何关闭优化设置.....抱歉。你是说fast_io之类的东西?
-
这很奇怪,只是出于好奇,如果你用
(*s).ax = ...试试呢? -
我猜那 s 并没有指向你的结构。尝试在 main 中为 ax、ay 和 az 赋值,并在 readAccel 的开头添加另一个 fprintf(如最后一个)。
标签: c memory pointers struct pic