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

а почему типы головы и хвоста unsigned char ? не критично конечно но все же.

Конструкция используется давно, с контроллеров где памяти было мало.
При максимальной величине буфера (как указано в примере в 256 байт), для головы и хвоста как раз хватает байта (0-255) (unsigned char)

да это мне все понятно что хватит одного байта, почему он char, а не uint8_t например или byte?
просто char в качестве “указателя”, ну ладно может я придираюсь просто.

Я еще с UNIX привык к unsigned char 8-bit, да и ее воспринимали многие компиляторы потом, а uint8_t появился сравнительно недавно:
а unsigned char уже много лет:

тип я всегда задаю явно, неизвесно, что завтра в стандарте будет означать char. А написал uint8_t и башка не болит за переносимость. :slight_smile:

Я бы рад, Ну нет в ICC AVR, например, unit8_t :frowning:
Нужно переопределение типов делать тогда

using uint8_t = unsigned char;
долго писать?

Так на ICC AVR не прокатывает, ошибку дает.
попробовал так - норм:


#define uint8_t    unsigned char
#define uint16_t   unsigned int
#define int16_t    int

форум постепенно превращается в вертеп сектантов. Кошмар, блин!

Отвечу как в анекдоте про фотографию Ломоносова.
“А мне нравится”

На Ардуино я перешел в 2015 с появлением ESP8266.
А под AVR пишу годов 2005, до этого 8051, вот и использовал ICC . Написано то много.
Сейчас стоит последняя 7.23 Professional
8-ка не зашла она на MS VC уже базировалась. Мне ее под WinNT хватило.
А ICC 7.ХХ легкий и быстрый, и код очень неплохой получается.
Под Win10 нормально работает.

А связь? Ардуино плагин содержит не весь SDK. Часть доступна только в чистом программировании есп-шки.

А про AVR так - родной SDK от Атмела использует GCC. Следовательно все остальное - сектантство.
GCC уже давно стандарт компилятора. ;)))

Да мне пока всего хватало, неразрешенных задач не было.

Наверное, но в ICC были и есть Wizzard и оболочка, сильно сокращающие время на ползанье по даташитам и отладку кода для любителей.

8266 может и так. Это переходный недоделок. А в 32ом много всякого интересного, что недоступно из Ардуино. В Ардуино все максимально безглючное включено. Штоп себе в ногу не стреляли! ;))

Добавлю: зато все Адафрут библиотеки доступны без камлания. Так что я и сам часто выбираю -куда подаццо.

Спасибо! Буду иметь в виду.

typedef unsigned char           uint8_t;
typedef   signed char           int8_t;
typedef unsigned int            uint16_t;
typedef   signed int            int16_t;

Получившаяся функция поиска ответа от модема без кольцевого буфера:

unsigned char findOKRNfromModem(const unsigned char inByte /*входной байт из модема*/) { // Поиск во входящих из модема данных OK
	const unsigned char strOK[] = "OK\r\n"; // строка поиска
	static constexpr unsigned char lenOK = 4; // длина строки поиска // можно strlen использовать, но константой быстрее
	static unsigned char foundPosOK = 0; // число найденных символов в строке OK\r\n
	if (strOK[foundPosOK] == inByte) { // нашелся символ
		if ((++foundPosOK) == lenOK) { // увеличиваем счетчик найденых символов и заодно сдвигаем позицию поиска // нашлась вся строка
			foundPosOK = 0; // обнуляем поиск
			return 1; // успешно выходим
		}
	} else { // не совпадает
		foundPosOK = 0; // обнуляем поиск
	}
	return 0;
}
Reset!
ATZ
OK
ATE0ATE0
OK
ATV1
OK
AT+CMEE=2
OK
AT+CLIP=1
OK
AT+DDET=1
+CME ERROR: operation not allowed