Как правильно сделать сканер массива символов?

Я начинаю с этого:

char delay_chars[10];

затем у меня есть поток входящих символов, которые мне нужно назначить следующим образом:

['I', ' ', 'l', 'o', 'v', 'e', ' ', 'p', 'i', 'e']

Я могу это сделать, но тогда появляется больше символов, поэтому мне нужно вот так:

[' ', 'l', 'o', 'v', 'e', ' ', 'p', 'i', 'e', ' ']
['l', 'o', 'v', 'e', ' ', 'p', 'i', 'e', ' ', 'a']
['o', 'v', 'e', ' ', 'p', 'i', 'e', ' ', 'a', 'n']
['v', 'e', ' ', 'p', 'i', 'e', ' ', 'a', 'n', 'd']
['e', ' ', 'p', 'i', 'e', ' ', 'a', 'n', 'd', ' ']
[' ', 'p', 'i', 'e', ' ', 'a', 'n', 'd', ' ', 'c']
['p', 'i', 'e', ' ', 'a', 'n', 'd', ' ', 'c', 'a']
['i', 'e', ' ', 'a', 'n', 'd', ' ', 'c', 'a', 'k']
['e', ' ', 'a', 'n', 'd', ' ', 'c', 'a', 'k', 'e']

Вы поняли. Я не знаю, как удалить первый символ массива символов (как я делаю со строкой, remove(0, 1)), и я не знаю, как добавить новый элемент в конце.

Если бы мне пришлось угадывать, я бы сделал цикл, который будет переназначать индекс каждого символа на один шаг назад или что-то в этом роде, но я не уверен, что мне следует это делать.

, 👍0

Обсуждение

Вы можете сделать это таким образом, но есть лучший способ, который быстрее и требует гораздо меньше работы. Вам нужно нечто, называемое круговым буфером. Посмотрите это и посмотрите, не делает ли оно то, что вы хотите, по-другому, но лучше., @Delta_G


2 ответа


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

1

Если бы мне пришлось угадывать, я бы сделал цикл, который будет переназначать индекс каждого символа на один шаг назад или что-то в этом роде, но я не уверен, что мне следует это делать.

Да, почти все...

Вот как я это делаю:

char data[10];

if (Serial.available()) {
    char inch = Serial.read();
    for (int i = 0; i < 9; i++) {
        data[i] = data[i+1];
    }
    data[9] = inch;
}

Каждый входящий символ добавляется в конец массива после того, как все остальные будут перетасованы на одну позицию вниз.

,

Довольно неприятно, что в C вы должны делать все сами с массивами., @JingleBells

Есть функции, которые могут сделать это за вас, но использовать их для такой простой операции не стоит. Цикл for может быть выполнен с помощью memmove(data, data+1, 9);, @Majenko

@NovaliumCompany Кстати, я только что исправил опечатку., @Majenko

Хорошо. Теперь у меня есть еще одна неприятная проблема... мой Arduino Uno, кажется, начинает плеваться тарабарщиной, когда я что-то делаю... Не могли бы вы мне помочь? (в чате), @JingleBells

@NovaliumCompany Jibberish обычно означает, что вы переполняете буфер. Может быть, вы печатаете массив без завершающего символа NULL?, @Majenko

Вот что я делаю https://textuploader.com/168i3 Serial.write запускается нормально, а затем превращается в тарабарщину. Вот дополнительная информация о проблеме: https://justpaste.it/3wobv, @JingleBells


0

Вы можете использовать SerialTransfer.h для автоматического пакетирования и анализа ваших данных для обмена данными между Arduino без дополнительных усилий. Библиотека устанавливается через Arduino IDE и включает множество примеров.

Вот функции библиотеки:

Эта библиотека:

  • можно загрузить с помощью диспетчера библиотек Arduino IDE (поиск «SerialTransfer.h»)
  • работает с программными серийными библиотеками
  • не блокирует
  • использует разделители пакетов
  • использует последовательное заполнение служебных байтов
  • использует CRC-8 (многочлен 0x9B с таблицей поиска)
  • позволяет использовать пакеты с динамическим размером (пакеты могут иметь длину полезной нагрузки от 1 до 255 байт)
  • может передавать байты, целые числа, числа с плавающей запятой и даже структуры!!

Пример скетча TX Arduino:

#include "SerialTransfer.h"

SerialTransfer myTransfer;

void setup()
{
  Serial.begin(115200);
  Serial1.begin(115200);
  myTransfer.begin(Serial1);
}

void loop()
{
  myTransfer.txBuff[0] = 'h';
  myTransfer.txBuff[1] = 'i';
  myTransfer.txBuff[2] = '\n';

  myTransfer.sendData(3);
  delay(100);
}

Пример скетча RX Arduino:

#include "SerialTransfer.h"

SerialTransfer myTransfer;

void setup()
{
  Serial.begin(115200);
  Serial1.begin(115200);
  myTransfer.begin(Serial1);
}

void loop()
{
  if(myTransfer.available())
  {
    Serial.println("New Data");
    for(byte i = 0; i < myTransfer.bytesRead; i++)
      Serial.write(myTransfer.rxBuff[i]);
    Serial.println();
  }
  else if(myTransfer.status < 0)
  {
    Serial.print("ERROR: ");
    Serial.println(myTransfer.status);
  }
}

Вы можете легко отредактировать приведенный выше пример кода, чтобы передать ['I', ' ', 'l', 'o', 'v', 'e', ' ', 'p', 'i' , 'e'] вместо ['h', 'i', '\n'].

,