Существует ли какой-либо стандартный способ определения соответствующих структур данных для считывания данных датчика из файла драйвера / приложения? - PullRequest
0 голосов
/ 25 апреля 2020

Так что меня интересует стандартный способ структурирования ваших файлов / кода, когда дело доходит до чтения данных из файла драйвера. Итак, теперь у меня есть буфер, в котором должны храниться данные, которые мы, как пользователь, запросили из файла драйвера. Так как мы не можем передать массивы в функцию (распадается на указатель), то, что я делаю, - это переменная члена структуры 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 для отслеживания индекса, в который должны быть записаны данные .
...