2013-07-26 2 views

ответ

1

Вот небольшой код, который использует 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 байт.

+1

@guiomie Ошибка здесь, следует читать только байты length-total_read', а не 'length'. – Macattack

1

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

int bytesRead = Serial.readBytesUntil(character, buffer, length); 
1

Вы можете создать буфер, который меньше, чем оставшаяся 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); 
} 

Несмотря на это, вы должны убедиться, что вы читали только в столько оперативной памяти, как вы на самом деле есть.

1

Один ответ заключается в том, что когда программа считывает последовательные байты, она, как правило, НЕ хранит их дословно. Скорее, программа проверяет каждый байт и определяет, какие действия следует предпринять дальше. Эта логика обычно реализуется как машина конечного состояния.

Итак, что представляет собой ваш конкретный последовательный поток? Может ли он быть проанализирован в последовательных кусках? Например: «0008ABCDEFGH» говорит, что 8 символов соответствуют полю длины 4 символа. В этом глупом примере ваш код будет читать 4 символа, а затем узнать, сколько места выделяется для остальной части последовательного потока!

Смежные вопросы