Одномерный массив в n -мерный массив с некоторыми условиями.

ak62
Offline
Зарегистрирован: 03.01.2019

Добрый день. Помогите с кодом. Задача расписана в самом коде.

byte exByte[5][8] = {
  {0xA1, 0x00, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x20},
  {0xA2, 0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65},
  {0xA3, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20},
  {0xA4, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20},
  {0xA5, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20}
};

String input_string = "";
char incomingByte; // from serial
void setup()
{
  Serial.begin(115200);
  /*задача: добить входящую строку пробелами. В начало добавить три
    пробела, в конец добить до длинны 21 знак. В итоге получим строку
    из 21 знака. Эту строку нужно преобразовать в byte, разделить на
    три блока по 7 байт и заменить содержимое exByte начиная с exByte[2]
    не трогая первый байт массива.
    Например получили строку:
    some data
    добили пробелами, загнали в промежуточный массив:
    {0x20,0x20,0x20,0x73,0x6F,0x6D,0x65,0x20,0x64,0x61,0x74,0x61,0x20,0x20,
    0x20,0x20,0x20,0x20,0x20,0x20,0x20}
	разделили на три части и разложили в нужные места.
    В итоге exByte должен стать таким:
    {0xA1, 0x00, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x20},
    {0xA2, 0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65},
    {0xA3, 0x20, 0x20, 0x20, 0x73, 0x6F, 0x6D, 0x65},
    {0xA4, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x20},
    {0xA5, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20}
  */
}

void loop()
{
  /////////////////////////////////////////////////////////////////
  //получаем из компорта данные
  while (Serial.available() > 0)
  {
    char c = Serial.read();
    byte b = c;
    if (c == '\n')
    {
      // парсим
      myParcer(input_string);
      input_string = "";
    }
    else
    {
      if (b != 0)
        input_string += c;
    }
  }
  //////////////////////////////////////////////////////////////////
}

// парсер и вывод в сериал /////////////////
void myParcer(String input_str)
{
  byte buf[22];
  int pos;
  String newStr;
  Serial.print("input string = ");
  Serial.println(input_str);

  if (input_str.substring(0, 3) == "TT+")
  {
    pos = input_string.lastIndexOf('\r');
    newStr = input_str.substring(3, pos);

    //три пробела с начала
    newStr = "   " + newStr;

    //наверняка в конце
    for (int i = 0; i < 21; i++ )
    {
      newStr = newStr + " ";
    }
    // в массив байт
    newStr.getBytes(buf, sizeof(buf));

	//////////////////////////////////////////////////////////
	// это не нравится
    for (int i = 0; i < 7; i++)
    { //первые 7 в массив
      exByte[2][i + 1] = buf[i];
      Serial.print(exByte[2][i + 1], HEX); Serial.print(" ");
    }
    Serial.println("");

    for (int i = 0; i < 7; i++)
    { //вторые 7 в массив
      exByte[3][i + 1] = buf[i + 7];
      Serial.print(exByte[3][i + 1], HEX); Serial.print(" ");
    }
    Serial.println("");

    for (int i = 0; i < 7; i++)
    { // третьи 7 в массив
      exByte[4][i + 1] = buf[i + 14];
      Serial.print(exByte[4][i + 1], HEX); Serial.print(" ");

    }
    Serial.println("");
	/////////////////////////////////////////////////////////////
	
    //полученный массив в сериал
    for (int b = 0; b < 5; b++)
    {
      for (int i = 0; i < 8; i++)
      {
        Serial.print(exByte[b][i], HEX); Serial.print(" ");
      }
      Serial.println("");
    }
  }
}

Как сделать кусок

    for (int i = 0; i < 7; i++)
    { //первые 7 в массив
      exByte[2][i + 1] = buf[i];
      Serial.print(exByte[2][i + 1], HEX); Serial.print(" ");
    }
    Serial.println("");

    for (int i = 0; i < 7; i++)
    { //вторые 7 в массив
      exByte[3][i + 1] = buf[i + 7];
      Serial.print(exByte[3][i + 1], HEX); Serial.print(" ");
    }
    Serial.println("");

    for (int i = 0; i < 7; i++)
    { // третьи 7 в массив
      exByte[4][i + 1] = buf[i + 14];
      Serial.print(exByte[4][i + 1], HEX); Serial.print(" ");

    }
    Serial.println("");

универсальным? Спасибо.

sadman41
Offline
Зарегистрирован: 19.10.2016

Положить цикл копирования внутрь другого цикла, где переменная k будет инкрементироваться на N. Тогда точно универсальным станет.