Andi schrieb:
> Ich glaub ich steh grad etwas auf dem Schlauch.... also in UDR wird
> immer nur EIN Byte von meiner 8Byte großen Nachricht gespeichert.
> Das muss ich jetzt Zwischenspeichern und sobald das nächste Byte kommt,
> wird die ISR erneut aufgerufen in der ich das Byte zwischenspeichern
> muss...u.s.w.
Ganz genau
1 | volatile uint8_t bytesReceived;
|
2 | volatile uint8_t diag_data[7];
|
3 |
|
4 | ISR(USART1_RX_vect)
|
5 | {
|
6 | uint8_t nextByte = UDR1;
|
7 |
|
8 | if( bytesReceived == 0 ) { // warten wir auf das Startbyte?
|
9 | if( nextByte == 0x5D )
|
10 | bytesReceived = 1; // die restlichen Bytes sind Daten
|
11 | }
|
12 |
|
13 | else {
|
14 | if( bytesReceived <= 7 ) {
|
15 | diag_data[ bytesReceived - 1 ] = nextByte;
|
16 | bytesReceived++;
|
17 | }
|
18 | }
|
19 | }
|
Wenn bytesReceived den Wert 8 erreicht hat, sind alle Bytes da. In der
Hauptschleife die Daten auswerten und bytesReceived zum Schluss wieder
auf 0 setzen.
1 | ....
|
2 |
|
3 |
|
4 | int main()
|
5 | {
|
6 | ....
|
7 |
|
8 | while( 1 ) {
|
9 |
|
10 | ...
|
11 | if( bytesReceived == 8 ) {
|
12 | // mach was mit diag_data
|
13 | bytesReceived = 0;
|
14 | }
|
15 |
|
16 | ...
|
17 | }
|
18 | }
|