Hi
Das Zauberwort heißt Ringpuffer
Du empfängst ein Byte per Interrupt. In der ISR nimmst du das Byte und
schreibst es an eine indizierte Adresse, setzt den Index hoch, fragst
die Grenze ab und wenn diese erreicht ist setzt du den Index wieder auf
0. Da ich in Assembler programmiere hier mal kurz ein Beispiel mit zwei
Variablen
Read_Pos: Indexzeiger zum Lesen
Write_Pos: Indexzeiger zum schreiben
Com:Buff: 20 Byte Ringpuffer
1 | ;------------------ Empfangsroutine im Controler -----------------------
|
2 |
|
3 | int_rxc:
|
4 | PUSH R16 ; temp auf dem Stack sichern
|
5 | IN R16, sreg ; SREG sichern
|
6 | PUSH R16
|
7 | PUSH R17
|
8 | PUSH XL
|
9 | PUSH XH
|
10 | PUSH R1
|
11 | CLR R1
|
12 | LDS R16, Write_Pos
|
13 | IN R17, UDR
|
14 | LDI XL,LOW(Com_Buff) ; x-Pointer auf Empfangspuffer
|
15 | LDI XH,HIGH(Com_Buff)
|
16 | ADD XL, R16
|
17 | ADC XH, R1
|
18 | ST X, R17
|
19 | INC R16
|
20 | CPI R16, 20
|
21 | BRLO End_rxc
|
22 | CLR R16
|
23 | End_rxc:
|
24 | STS Write_Pos, R16
|
25 | POP R1
|
26 | POP XH
|
27 | POP XL
|
28 | POP R17
|
29 | POP R16
|
30 | OUT sreg, R16 ; SREG wiederherstellen
|
31 | POP R16 ; temp wiederherstellen
|
32 | RETI
|
Read_Pos und Write_Pos sind am Anfang gleich. Bei einem Unterschied bist
du sicher, das ein Zeichen eingetroffen ist. Nun kannst du in deiner
Programmschleife darauf reagierren. Zeichen aus Ringpuffer lesen,
Lesezeiger erhhen und bei Grenzüberschreitung auf 0 setzen. Dann kannst
du die Daten in aller Ruhe verarbeiten.
Gruß oldmax