Так что меня интересует стандартный способ структурирования ваших файлов / кода, когда дело доходит до чтения данных из файла драйвера. Итак, теперь у меня есть буфер, в котором должны храниться данные, которые мы, как пользователь, запросили из файла драйвера. Так как мы не можем передать массивы в функцию (распадается на указатель), то, что я делаю, - это переменная члена структуры pRxBuff
, указывающая на массив rxBuffer
, который находится в main
вместо определения внутри функции, потому что однажды функция возвращает, массив больше не действителен, и внутри функции Read()
я заполняю rxBuffer
разыменованием данных в указателе c index.
typedef struct {
I2C_TypeDef *pI2Cx;
I2C_Config_t I2C_Config;
I2C_State I2C_State;
uint8_t *txBuffer;
uint8_t *pRxBuffer;
uint8_t rxStartIndex;
uint8_t rxBufferSize;
uint8_t txBufferLength;
uint8_t rxBufferLength;
} I2C_Handle_t;
// sensor.c
void ReadData(I2C_Handle_t *I2C_handle)
{
// start I2C transaction
while (HAL_I2C_StartInterrupt(I2C_TX_BUSY) != I2C_READY);
I2C_handle->I2C_State = I2C_INIT;
// read the data from the sensor
for (int i = 0; i < I2C_handle->rxBufferSize/2; i++)
{
I2C_handle->I2C_State = I2C_INIT;
while (HAL_I2C_StartInterrupt(I2C_RX_BUSY) != I2C_READY);
}
// at this point, I have `rxBuffer` populated with raw data
// now I need to convert this raw data into human-readable
for (int i = 0; i < I2C_handle->rxBufferSize; i+=2)
{
ProcessData(I2C_handle->pRxBuffer, i); // currently not storing processed data anywhere
}
}
// main.c
const int bytesToRead = 6;
static uint8_t rxBuffer[bytesToRead];
I2C_Handle_t i2c;
int main(void) {
i2c.pRxBuffer = rxBuffer ;
// ...
ReadData(&i2c);
}
Проблемы с этим:
- хотя я смог заполнить
rxBuffer
, к которому я могу получить доступ в основном, это все еще правильный способ сделать это? - что если
rxBuffer
отличается размер, чем то, что потребуется обработанным данным. Например: 2 необработанных байта представляют одно обработанное десятичное значение. Как избежать создания двух разных буферов, каждый для хранения необработанных и обработанных данных? - При таком подходе мне пришлось создать отдельную переменную-член
rxStartIndex
для отслеживания индекса, в который должны быть записаны данные .