Forum: Compiler & IDEs Lufa CDC Echo


von Bülent C. (mirki)


Lesenswert?

Hallo zusammen,

anbei habe ich folgenden Code,mit dem ich über eine Terminalsoftware was 
an den AT90USB162 (Lufa Implementierung für USB CDC) sende und er mir 
das gleiche wieder zurücksenden soll.

Es klappt auch, nur halt sehr langsam, also ich kann nicht frei drauf 
lostippen und muss zwischen den einzelnen Eingaben warten bis diese 
akzeptiert werden.
Mache ich hier was grundlegendes falsch? Und vorallem, müsste ich bei 
einem empfangen Byte nicht in eine Interrupt Routine abspringen können?
1
int main(void)
2
{
3
  
4
  SetupHardware();
5
  CDC_Device_CreateStream(&VirtualSerial_CDC_Interface, &USBSerialStream);
6
  sei();
7
8
  for (;;)
9
  {
10
    CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
11
    
12
    int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
13
       if (!(ReceivedByte < 0))
14
         CDC_Device_SendByte(&VirtualSerial_CDC_Interface, (uint8_t)ReceivedByte);
15
16
17
     CDC_Device_USBTask(&VirtualSerial_CDC_Interface);
18
     
19
     USB_USBTask();
20
    
21
  }
22
}

von Stephan B. (matrixstorm)


Lesenswert?

Hi

Fuer soetwas kennt LUFA meines Wissens nach Ringpuffer.
Ueber deren Benutzung solltest du ggf. einmal nachdenken.

(Dadurch wuerden sich dann deine verschiedenen Peripherien nicht 
gegenseitig ausbremsen.)

Nachtrag:
In meinen Beispielen ( http://matrixstorm.com/avr/avrstick/#bideavr ) 
wird intern auch LUFA (mit Puffern) verwendet - laeuft ohne Probleme.

MfG

: Bearbeitet durch User
von Bülent C. (mirki)


Lesenswert?

Hi,

Wo ist jetzt der große Unterschied zu meinem code?
1
int main(void) {
2
    /* Init the USB (and clock + interrupts) */
3
    USBInit();
4
5
    for (;;) {
6
        /* Must throw away unused bytes from the host, or it will lock up while waiting for the device */
7
        int c = fgetc(USBtty0);
8
9
        /* simple demo: implement an uppercase echo */
10
        if (!(c<0)) {
11
            fputc(toupper(c), USBtty0);
12
        }
13
14
        USBPoll();
15
    }
16
}

von Stephan B. (matrixstorm)


Lesenswert?

Ja hast recht, ich habe nochmal genauer in die lib gesehen - am Puffer 
duerfte es nicht liegen.

Wohl aber an:
1
    CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
2
    
3
    int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
4
5
[...]

Was zu lockups/loss fuehren koennte, wenn du tatsaechlich mal was 
empfangen willst?

Nachtrag: Loech einfach mal bitte das erste "CDC_Device_ReceiveByte" 
raus.

: Bearbeitet durch User
von Bülent C. (mirki)


Lesenswert?

Ja, daran lag es und es funktioniert jetzt gut..Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.