Побеждаем кольцевой буфер

Следующим этапом в моём обучении будет кольцевой буфер.
Как сказали в соседней ветке, алгоритм поиска перевода строки не является хорошим вариантом работы с буфером (а он для меня такой простой…)
if (temp == ‘\n’ && pos_buf > 1 && buffers[pos_buf - 2] == ‘\r’) {

Спойлер
#include <SoftwareSerial.h>
SoftwareSerial SIM800(9, 2);

#define MAX_BUF 50
char buffers[MAX_BUF];

void setup() {
  Serial.begin(9600);
  SIM800.begin(9600);
  Serial.println(F("Start!"));
  SIM800.println(F("AT"));
}

//Запись в буфер
void write_buffer(uint8_t temp) {

}

//Чтение из буфера
void reading_buffer() {

}


//Очистка буфера
void clearing_buffer() {

}



void loop() {
  if (SIM800.available()) write_buffer(SIM800.read());

}

Кольцевой буфер.
image
1 этап(функция). При записи нужно удалять старые данные и записывать на их место новые?

1 лайк

Почитай:

Смотри там саму идею и реализацию (хотя, наверное, лучше бы все классом оформить), «пример» использования там с ошибкой грубой.

Очень сложная для начинающих статья.

Если делать полноценный кольцевой буфер, то тупо надо хранить две переменных, абсолютная позиция и количество непрочитанных байт (+размер буфера).
В случае с sim800 нафиг не нужен размер оставшихся байт. Просто искать вхождение искомой строки с последнего пришедшего байта.

Вообще-то голову и хвост. Не?

2 лайка

@andycat как с одним «адресом» по кольцу «гулять»?

Работа с кольцевым буфером | avr | programming первая часть статьи - попроще.

А по нему (буферу) и не надо гулять, основная задача найти ответ от медема.

Ну ведь в инете куча примеров, вот из древнего
https://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-nim-svyazano?page=2#comment-494752

bool s800lib::findResp(char * inStr, byte inByte) { // поиск строки в циклическом буфере
  byte slen = strlen(inStr); // длина искомой строки
  if (inByte == inStr[slen - 1]) { // если последний символ совпадает - продолжаем искать всю строку
    byte cfound = 1; // число совпавших символов
    byte abpos = pos_buf; // абсолютная позиция в буфере поиска-1  = последнему символу искомой строки
    if (!abpos) abpos = max_size_response_buf - 1; else --abpos; // ищем с предпоследнего символа
    for ( byte i = 0; i < (slen - 1); ++i) {
      if (inStr[slen - 1 - i] != resp_buf[abpos]) return false;
      if (!abpos) abpos = max_size_response_buf - 1; else --abpos;
    }
  } else {
    return false;
  }
  return true;
}

Озадачили)
Не помню, ща найду код.

Нашёл, абсолютная позиция хранится и число непрочитанных байт из буфера
Uart буфер -
https://arduino.ru/forum/otvlechennye-temy/programmirovanie-32-kh-razryadnykh-mk?page=21#comment-575919

Может я чего то не понимаю, но тема называется «побеждаем кольцевой буфер». Хотя…

Да, именно uart очень подходит под кольцевой буфер.

Так абсолютная позиция чего? Головы или хвоста?
(о том, что ссылка, мягко говоря, странная, я даже не говорю)

Головы

А что не так с ссылкой?

Я ожидал увидеть ссылку на документацию, а не на форум.
Какое форум вообще имеет отношение к кольцевому буферу?

на что? на алгоритм/реализацию кольцевого буфера?
Вы нормальный? их вагон…
P.S. Правильно кто то из модераторов форума недавно написал: сюда в основном ходят читать, а не постить. Т к придет вот такой занудный заумный дядька, все желание отобьет.

Думаю, это не дядьке нужно, а ТС.