Разделение сообщения

У меня есть строка, которую нужно разделить на определенные фрагменты.

Например, new_str="abcdefghjklmnopqrstuvwxyz, и моя цель — разделить его на куски split_size=5, поэтому результат должен быть: abcde,fghij и так далее.

new_str получает каждый раз новую строку.

split_size может быть любого размера.

У меня 2 вопроса:

1) Прикрепленный код выполняет свою работу, но выглядит НЕМНОГО не элегантно для такого новичка, как я. есть ли другой способ сделать это?

2) В прикрепленном коде выходные данные имеют вид Serial.println(tmp) и должны быть заменены функцией вывода для отправки каждого фрагмента в виде сообщения MQTT. Я предпочитаю, чтобы каждый фрагмент сохранялся в глобальном массиве для последующей отправки в коде на стороне msgSplitter.

Итак, я написал следующий код:

int split_size=5;
char new_str[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void setup() {

        Serial.begin(9600);
        Serial.print("String length: ");
        Serial.println(strlen(new_str));
        Serial.print("Split Size: ");
        Serial.println(strlen(split_size));

        msgSplitter(new_str, split_size, "Split #");

}
void msgSplitter( const char* msg_in, int chop_size, char *prefix){
        num=ceil((float)strlen(msg_in)/chop_size);
        char tmp[50];
        int pre_len;

        if (num > 1) {
                for (int k=0; k<num; k++) {
                  pre_len=0;
                        sprintf(tmp,"%s %d: ",prefix,k);
                        pre_len = strlen(tmp);
                        for (int i=0; i<chop_size; i++) {
                                tmp[i+pre_len]=(char)msg_in[i+k*chop_size];
                                tmp[i+1+pre_len]='\0';
                        }
                        Serial.println(tmp);
                }
        }
        else {
                Serial.println(msg_in);
        }
}

, 👍1


1 ответ


Лучший ответ:

1
// объединенная версия
void msgSplitter(const char* msg_in, int chop_size, char *prefix) {
  char tmp[50];
  int size = strlen(msg_in);
  for (int pos = 0, k = 0; pos < size; pos += chop_size) {
    int l = sprintf(tmp, "%s %d: ", prefix, k++);
    strncat(tmp + l, msg_in + pos, chop_size);
    Serial.println(tmp);
  }
}

// только версия значения
void msgSplitter(const char* msg_in, int chop_size, char *prefix) {
  char tmp[chop_size + 1];
  tmp[chop_size] = 0;
  int size = strlen(msg_in);
  for (int pos = 0; pos < size; pos += chop_size) {
    strncpy(tmp, msg_in + pos, chop_size);
    Serial.println(tmp);
  }
}
,

Можете ли вы ответить на мой второй вопрос?, @Guy . D

вторая версия функции в моем ответе — это она. замените println функцией публикации, @Juraj

Ты рок-Юрай!, @Guy . D

U2 :) ( кашель кашель ), @Guy . D