Как сохранить результат Serial.readBytesUntil(character, buffer, length)
в буфере, пока я не знаю длину входящего сообщения?Arduino серийное сообщение с неизвестной длиной
ответ
Вот небольшой код, который использует realloc()
продолжать расти ваш буфер. Вам нужно будет free()
, когда вы закончите с buf
.
int length = 8;
char * buf = malloc(length);
int total_read = 0;
total_read = Serial.readBytesUntil(character, buf, length);
while(length == total_read) {
length *= 2;
buf = realloc(buf, length);
// Bug in this line:
// total_read += Serial.readBytesUntil(character, buf+total_read, length);
// Should be
total_read += Serial.readBytesUntil(character, buf+total_read, length-total_read);
}
* Edit: исправлена ошибка, при которой readBytesUntil
бы читать с конца buf
чтением length
байт вместо length-total_read
байт.
@guiomie Ошибка здесь, следует читать только байты length-total_read', а не 'length'. – Macattack
сделать буфер достаточно большим для сообщения. Не знаете максимальную длину сообщения? Используйте длину для управления прочитанными символами, затем продолжайте чтение до появления символа.
int bytesRead = Serial.readBytesUntil(character, buffer, length);
Вы можете создать буфер, который меньше, чем оставшаяся RAM, и использовать его. Вызов найти оставшиеся барана (как я писал в другом месте) является:
int freeRam() {
extern int __heap_start, *__brkval;
int v;
int fr = (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
Serial.print("Free ram: ");
Serial.println(fr);
}
Несмотря на это, вы должны убедиться, что вы читали только в столько оперативной памяти, как вы на самом деле есть.
Один ответ заключается в том, что когда программа считывает последовательные байты, она, как правило, НЕ хранит их дословно. Скорее, программа проверяет каждый байт и определяет, какие действия следует предпринять дальше. Эта логика обычно реализуется как машина конечного состояния.
Итак, что представляет собой ваш конкретный последовательный поток? Может ли он быть проанализирован в последовательных кусках? Например: «0008ABCDEFGH» говорит, что 8 символов соответствуют полю длины 4 символа. В этом глупом примере ваш код будет читать 4 символа, а затем узнать, сколько места выделяется для остальной части последовательного потока!
- 1. Arduino серийное чтение
- 2. Arduino серийное событие не возвращается
- 3. mqtt серийное сообщение без ethernet
- 4. Strange C++ Arduino серийное поведение
- 5. Пользовательские метаданные с неизвестной длиной параметра?
- 6. Загрузить файл в кусках с неизвестной длиной
- 7. Bubble Sort Array с неизвестной длиной (Java)?
- 8. Создание всех комбинаций с неизвестной длиной
- 9. Как получить подстроку с неизвестной длиной
- 10. читать строку типа с неизвестной длиной
- 11. Извлечение рисунка из строки с неизвестной длиной
- 12. Вызов неизвестного конструктора с неизвестной длиной аргумента
- 13. Как инициализировать массив с неизвестной длиной?
- 14. Сокетная связь с неизвестной длиной ввода
- 15. Как отделить строку с неизвестной длиной?
- 16. экстракт струна из строки с неизвестной длиной
- 17. Чтение CString из буфера с неизвестной длиной?
- 18. C - Как читать строку с неизвестной длиной
- 19. Почему мое серийное сообщение не работает?
- 20. Получить длину строки массива неизвестной длиной
- 21. Как загрузить файл изображения с неизвестной длиной на андроид
- 22. Arduino - HTTP-сообщение не работает
- 23. Получение int с неизвестной длиной с использованием getchar()
- 24. PyUSB читает несколько кадров из массового переноса с неизвестной длиной
- 25. Arduino UNO петли Серийное неожиданно, при выполнении более сложных программ
- 26. Как отделить строку от 3 отдельных строк с неизвестной длиной
- 27. Как декодировать буфер в Netty с неизвестной длиной?
- 28. javascript: массив с неизвестной длиной и неизвестными именами индексов
- 29. Как добавить два массива в петлю с неизвестной длиной
- 30. Powershell извлекает текст из строки с неизвестной длиной
Выделите огромный буфер, измените его размер после этого (если вам нужно). –