Изучение C и некоторые проблемы с указателями / массивами. Использование MPLAB X и PIC24FJ128GB204 в качестве целевого устройства, но я не думаю, что это имеет значение для этого вопроса. Ответ может быть очевиден, но без особых знаний в C (пока) трудно найти аналогичный вопрос, который, как я понимаю, достаточен, чтобы сделать выводы.
Я написал библиотеку I2 C с следующая функция:
int I2C1_Write(char DeviceAddress, unsigned char SubAddress, unsigned char *Payload, char ByteCnt){
int PayloadByte = 0;
int ReturnValue = 0;
char SlaveWriteAddr;
// send start
if(I2C1_Start() < 0){
I2C1_Bus_SetDirty;
return I2C1_Err_CommunicationFail;
}
// address slave
SlaveWriteAddr = (DeviceAddress << 1) & ~0x1; // shift left, AND with 0xFE to keep bit0 clear
ReturnValue = I2C1_WriteSingleByte(SlaveWriteAddr);
switch (ReturnValue){
case I2C1_OK:
break;
case I2C1_Err_NAK:
I2C1_Stop();
I2C1_Bus_SetDirty;
return I2C1_Err_BadAddress;
default:
I2C1_Stop();
I2C1_Bus_SetDirty;
return I2C1_Err_CommunicationFail;
}
// part deleted for brevity
// and finally payload
for(PayloadByte = 0; PayloadByte < ByteCnt; PayloadByte++){
// send byte one by one
if(I2C1_WriteSingleByte(Payload[PayloadByte]) != I2C1_ACK){
I2C1_Stop();
I2C1_Bus_SetDirty;
return I2C1_Err_CommunicationFail;
}
}
return I2C1_OK;
}
Я хочу вызвать эту функцию из другой, используя предопределенный констант:
const unsigned char CMD_SingleShot[3] = {2, 0x2C, 0x06};
Это имеет длину команды в качестве первого байта, затем байты команды.
Вызывающая функция:
int SHT31_GetData(unsigned char MeasurementData[]){
// address device and start measurement
if(I2C1_Write(SHT31_Address,
0xFF,
CMD_SingleShot[1], // this is where the error message is given
CMD_SingleShot[0])
< 1){
return -1;
}
//code omitted for brevity
return 1;
}
Сообщение об ошибке:
.. / Sensirion_SHT31. c : 40: 17: предупреждение: передача аргумента 3 в 'I2C1_Write' делает указатель из целого числа без приведения
.. / I2C1.h: 66: 5: note: ожидается «unsigned char *», но аргумент имеет введите 'unsigned char'
Проблема явно (unsigned char)CMD_SingleShot[1]
, где я пытаюсь дать указатель на второй байт массива unsigned char.
Я пробовал:
- чтение по указателям и массивам и попытка понять
- searchin g для аналогичных функций
- разочарованы пониманием и попыткой случайных вещей, надеясь, что сообщения об ошибках приведут меня к правильному способу сделать это. Вещи вроде:
CMD_SingleShot[1]
&CMD_SingleShot[1]
(unsigned char)CMD_SingleShot + 1
это просто выдало другие сообщения об ошибках.
Мои вопросы:
- при условии, что функция I2C1_Write как есть (ожидание неподписанного char *) (например, если это не мой код, и я не могу его изменить), как бы я передал указатель на второй байт в массиве продолжение без знака? Насколько я понимаю, массив является указателем, поэтому
- , поскольку это мой код, есть ли лучший способ сделать это вообще?