Forum: Mikrocontroller und Digitale Elektronik UC3C USB-CDC / Blockiert bis der Buffer voll geschrieben ist


von Adrian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.