Массив указателей

Задача: на микроконтроллер приходит запрос на отправку от 1 до 10 unsigned short'ов, микроконтроллер должен сформировать пакет данных содержащий

  • несколько протокольных байтов
  • от 1 до 10 unsigned short'ов сообщения
  • crc.

Предполагаемое решение: чтобы расчет crc производился верно, планирую в .hpp файле создать структуру массивов размером от 1 до 10:

struct dataBufer {
    unsigned short oneSize[1];
    unsigned short twoSize[2];
    unsigned short threeSize[3];
    ...
    unsigned short tenSize[10];
} ;

Так как размер сообщения я буду получать из переменной, назовем ее n_byteX2, хотелось бы не делать 10 if/else, а сделать что-то типа цикла в котором я бы мог заносить в указатель newDataBufer[размер буфера].num[порядковый номер элемента буфера] , не обязательно прям так, но это то, к чему я пришел.

У меня есть файл modbus.hpp, в котором есть класс Modbus, внутри которого я бы и хотел все это разместить, чтобы в modbus.cpp я бы мог обращаться к этому массиву в различных void. Вот какое решение у меня:

//modbus.hpp

class Modbus{
public:
    struct dataBufer {
        unsigned short oneSize[1];
        unsigned short twoSize[2];
        unsigned short threeSize[3];
        ...
        unsigned short tenSize[10];
    } ;
    struct DB_info {
        unsigned short* num;
        unsigned char size;
    } ; 
}


//modbus.cpp

void ModBus::initial(void){
    databufer db;
    DB_info newDataBufer[] = {
        {db.oneSize, 1},
        {db.twoSize, 2},
        ...
        {db.tenSize, 10},
    };
};

Этот код работает прямо так, как хочу я, но при условии, что все обращения будут внутри initial, а мне необходимо обращаться в различных функциях внутри одного .cpp файла. Как это можно было бы обойти в условии, что я использую компилятор 2006 года, который естественно не поддерживает современные версии с++.

UPD:

добавил функцию CRC, она не моя и вносить правки в нее я не особо то и могу.

unsigned short System::CRC (unsigned char *puchMsg, unsigned long usDataLen){
    unsigned char uchCRCH = 0xff;
    unsigned char uchCRCL = 0xff;
    unsigned char uIndex;

    while (usDataLen--) {
        uIndex = uchCRCL ^ *puchMsg* ;
        uchCRCL = uchCRCH ^ auchCRCH[uIndex];
        uchCRCH = auchCRCL[uIndex];
    }
    return (((unsigned short)uchCRCH << 8) | uchCRCL ) ;
}

Можно проверять массив и не до конца, но формат посылки примерно такой:

[адрес устройства][функция][количество байтов данных][байт1][байт2][байт3][байт4][crcH][crcL] 

Если бы все, что мне требовалось - это обрезать, например байт4, то проблемы особо нет, но если мне требуется обрезать байт 1 при подсчете crc он все равно будет учитываться.


Ответы (0 шт):