Hallo,
okay, habe mir jetzt einen Ringpuffer gebaut, der so aussieht:
1 | #define ENOERR 0 /* No error */
|
2 | #define ENOSPC 28 /* No space left on device */
|
3 | #define ESPIPE 29 /* Illegal seek */
|
4 |
|
5 | #define BUFFER_SIZE 512 ///< Size of buffer
|
6 | #define BUFFER_MASK (BUFFER_SIZE-1)
|
7 |
|
8 | int head;
|
9 | int tail;
|
10 | int full;
|
11 | int next;
|
12 | uint16_t data[BUFFER_SIZE];
|
13 |
|
14 |
|
15 | void init_ring()
|
16 | {
|
17 | head=0;
|
18 | tail=0;
|
19 | full=0;
|
20 | next=0;
|
21 | }
|
22 |
|
23 |
|
24 | int ring_in (uint16_t byte)
|
25 | {
|
26 | next = ((head+1) & BUFFER_MASK); // Maske um den Puffer vor Überlauf zu schützen, Modulo 2
|
27 | data[head] = byte; // Buffer wird byte zugewiesen
|
28 | head = next;
|
29 | USART3->CR1 |= USART_FLAG_TXE;
|
30 | /if (ring_full())
|
31 | return -ENOSPC; // Index wird neu übernommen
|
32 | return ENOERR;
|
33 | }
|
Diesen Puffer lasse ich jetzt also in der Routine beschreiben. Bei mir
wird ein Paket maximal 265 Bytes lang. Die Länge des Frames steht immer
an derselben Stelle:
1 | //******************************************************************************
|
2 | // USART3 IRQ Handler
|
3 | //******************************************************************************
|
4 |
|
5 | void USART3_IRQHandler(void)
|
6 | {
|
7 | uint16_t sr = USART3->SR;
|
8 | portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
9 | portBASE_TYPE xTaskWokenByReceive = pdFALSE;
|
10 | // Check for received Data
|
11 | if (sr & USART_SR_RXNE)
|
12 | {
|
13 | ch = (uint16_t) USART3->DR;
|
14 | ring_in(ch);
|
15 | // xQueueSendFromISR (hSerialRx, &ch, &xHigherPriorityTaskWoken);
|
16 | }
|
17 |
|
18 | // Check if transmit buffer is empty
|
19 | if (sr & USART_SR_TXE)
|
20 | {
|
21 | if(txReadPtr < txWritePtr)
|
22 | {
|
23 | uint16_t byte = txReadPtr==0 ? 0x100 : 0;
|
24 | byte |= txBuffer[txReadPtr++];
|
25 | USART3->DR = byte;
|
26 | }
|
27 | else
|
28 | // disable TXE interrupt
|
29 | USART3->CR1 &= ~USART_CR1_TXEIE;
|
30 | }
|
31 | }
|
So fülle ich also dann meinen Ringpuffer mit Zeichen. Jetzt weiss ich
aber nicht, wie ich die Abbruchbedingung gestalten soll,so das der Frane
übergeben werden kann.
Wüsste ich dieses würde ich dann in eine Queue die Adresse wo zu lesen
ist und wieviel zu lesen ist hinschreiben, dann kann die Auswertung
erfolgen und dementsprechend weitergesendet werden, das habe ich
verstanden.
Gruß
paule