Johannes G. schrieb:
> Hallo,
>
> ich habe folgendes Problem:
> Ich habe einen ATmega, der per UART mit einem Gerät kommuniziert.
> Alles was er empfängt schreibt er in einen Buffer (also in ein Array)
> Wenn er nun ein \n empfängt
Ich schliesse daraus, dass wir nur über Texte reden, oder?
> soll er das Array in ein anderes kopieren
> und den Buffer löschen. Wie mache ich das am effektivsten?
> Einfach so?
1 | strcpy( buffer2, buffer1 );
|
2 | buffer1[0] = '\0';
|
Die effektivste Möglichkeit ist allerdings gar nichts umzukopieren,
sondern einfach die Bedeutung der Buffer zu tauschen.
Während in buffer1 empfangen wird, wird buffer2 ausgewertet (sofern
etwas auswertbares drinnen ist)
Kommt das \n wird umgeschaltet. buffer1 wird zum Auswertebuffer erklärt,
während buffer2 die Rolle des 'Datensammlers' übernimmt. Beim nächsten
\n wird dann wieder getauscht.
1 | int8_t buffer1[100] = {0};
|
2 | int8_t buffer2[100] = {0};
|
3 |
|
4 | int8_t nextBufferPosToStore = 0;
|
5 |
|
6 | int8_t* collectBuffer = buffer1;
|
7 | int8_t* evaluateBuffer = buffer2;
|
8 |
|
9 | [c]
|
10 | ...
|
11 |
|
12 | if( nextCharacter == '\n' ) {
|
13 | int8_t* tmpSwap;
|
14 |
|
15 | collectBuffer[ nextBufferPosToStore] = '\0'; // String abschliessen
|
16 | tmpSwap = collectBuffer; // und die BufferPointer tauschen
|
17 | collectBuffer = evaluateBuffer;
|
18 | evaluateBuffer = tmpSwap;
|
19 | nextBufferPosToStore = 0; // und es geht wieder von vorne los
|
20 | }
|
21 |
|
22 | else
|
23 | // kein Zeilenende. Zeichen einfach hamstern
|
24 | collectBuffer[nextBufferPosToStore++] = nextChar;
|