Как правильно сделать сканер массива символов?
Я начинаю с этого:
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)
), и я не знаю, как добавить новый элемент в конце.
Если бы мне пришлось угадывать, я бы сделал цикл, который будет переназначать индекс каждого символа на один шаг назад или что-то в этом роде, но я не уверен, что мне следует это делать.
@JingleBells, 👍0
Обсуждение2 ответа
Лучший ответ:
Если бы мне пришлось угадывать, я бы сделал цикл, который будет переназначать индекс каждого символа на один шаг назад или что-то в этом роде, но я не уверен, что мне следует это делать.
Да, почти все...
Вот как я это делаю:
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
Вы можете использовать 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']
.
- Как определить, когда выходной сигнал датчика значительно меняется?
- Возможно ли иметь массив массивов int?
- Существуют ли библиотеки сглаживания сигналов для Arduino?
- Замена нескольких выводов pinMode() и digitalWrite() на массив
- Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
- Инициализация массива структур
- Невозможно создать массив типа const char*
- Работает ли конструкция int array[100] = {0} на Arduino?
Вы можете сделать это таким образом, но есть лучший способ, который быстрее и требует гораздо меньше работы. Вам нужно нечто, называемое круговым буфером. Посмотрите это и посмотрите, не делает ли оно то, что вы хотите, по-другому, но лучше., @Delta_G