Ich habe da ein "kleines" Problem, ich habe hier einen Mega32u4, welchen
über LUFA CDC anspreche.
Nun bietet diese ganze Geschichte ja Interrupt, wenn ein neues
Datenpaket ankommt. Ich würde aber schon gerne wissen wann ein Paket
eintrifft.
Momentan mache ich es (vereinfacht) so:
1 | void checkUartAvailable()
|
2 | {
|
3 | unsigned char nextChar;
|
4 |
|
5 | if( uart_str_complete == 0 )
|
6 | {
|
7 | nextChar = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
|
8 | if( nextChar != '\n' && nextChar != '\r' && uart_str_count < UART_MAXSTRLEN )
|
9 | {
|
10 | uart_string[uart_str_count] = nextChar;
|
11 | uart_str_count++;
|
12 | }
|
13 | else
|
14 | {
|
15 | uart_string[uart_str_count] = '\0';
|
16 | uart_str_count = 0;
|
17 | uart_str_complete = 1;
|
18 | }
|
19 | }
|
20 | }
|
21 |
|
22 | void main(void)
|
23 | {
|
24 | while(1)
|
25 | {
|
26 | checkUartAvailable();
|
27 |
|
28 | if(uart_str_complete == 1)
|
29 | {
|
30 | switch (uart_string[0])
|
31 | {
|
32 | case 0x20:
|
33 | //Verarbeitung
|
34 | break;
|
35 | case 0x21:
|
36 |
|
37 | //....
|
38 |
|
39 | default:
|
40 | break;
|
41 | }
|
42 | uart_str_complete = 0;
|
43 | }
|
44 | }
|
45 | }
|
Sooo... das Problem hierbei ist ja (ich habe diese Kombination immer so
dem Interrupt Vektor des TX UART genutzt) das ich ja immer wieder in die
UART rein muss um zu schauen ob Zeichen da sind. Nun setzt sich ja IMMER
die Variable uart_str_complete auf 1 - da er ja immer in der IF Schleife
auf die Abfrage kommt. Und genau hierbei liegt mein Problem.
LUFA bietet ja noch folgendes:
1 | void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t *const CDCInterfaceInfo)
|
2 | {
|
3 | //bool HostReady = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR) != 0;
|
4 | }
|
Was hat es damit auf sich, ich habe da keine Infos zu gefunden.