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

Рейтинг: 0Ответов: 0Опубликовано: 13.08.2025

Задача: на микроконтроллер приходит запрос на отправку от 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 он все равно будет учитываться.

Ответы

Ответов пока нет.