Hi, vielleicht hat sich jemand schon mal mit folgendem Problem beschäftigt und 'ne Lösung parat: Habe hier einen AT32UC3C0512C (auf dem evaluation board) (framework 2.6.1 für udi_cdc*) und will Daten von der CDC-Line in den Memory-Buffer schreiben. Diese Funktion will ich in der Callback Methode implementieren. Also: Daten liegen an -> Callback wird aufgerufen -> Daten werden in den Buffer geschrieben und verarbeitet -> ... Leider blockiert die von Atmel bereitgestellte Methode (udi_cdc_read_buf()) den Mikrocontroller so lange, bis der Buffer vollgeschrieben ist. Für mich ist das irgendwie unsinnig denn man weiss ja nicht wieviel Daten kommen. Außerdem ist der Rückgabewert immer 0, weil der Buffer immer vollgeschrieben wird bevor es weiter geht. Hier nochmal die Methode, die mir diese Probleme bereitet. /** * \brief Reads a RAM buffer on CDC line * * \param buf Values readed * \param size Number of value readed * * \return the number of data remaining */ iram_size_t udi_cdc_read_buf(int* buf, iram_size_t size) { uint8_t *ptr_buf = (uint8_t *)buf; iram_size_t copy_nb; uint16_t pos; uint8_t buf_sel; udi_cdc_read_buf_loop_wait: // Check avaliable data pos = udi_cdc_rx_pos; buf_sel = udi_cdc_rx_buf_sel; while (pos >= udi_cdc_rx_buf_nb[buf_sel]) { if (!udi_cdc_running) { return size; } goto udi_cdc_read_buf_loop_wait; } // Read data copy_nb = udi_cdc_rx_buf_nb[buf_sel] - pos; if (copy_nb>size) { copy_nb = size; } memcpy(ptr_buf, &udi_cdc_rx_buf[buf_sel][pos], copy_nb); udi_cdc_rx_pos += copy_nb; ptr_buf += copy_nb; size -= copy_nb; udi_cdc_rx_start(); if (size) { goto udi_cdc_read_buf_loop_wait; } return 0; } Viele Grüße Adrian
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.