Arduino Due + SerialUSB (native) + Delphi. Сильно ограничена скорость передачи

max_sl
Offline
Зарегистрирован: 15.08.2016

Добрый день, есть необходимость отправлять данные измерений с ардуино due на ПК, прием данных осуществляется через программу написанную на Делфи. 

Данные посылаются через Serial write или через SerialUSB.write.

Проблема в том, что через Programming port максмальная скорость передачи без ошибок составляет 250000 bod. Но, этого недостаточно. При использовании Native USB и отправке соответственно через SerialUSB.write скорость даже относительно уровня Programming Port падает (в районе 38400 бод) Хотя, в принципе, должна увеличиваться.

В чем может быть проблема? 

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

Кстати при ComPort.CustomBaudRate:=460800; нормально передает данные через Serial и тула и обратно.
А на 921600 нормально передает от ПК в ардуину, а с ардуино идут битые данные.

 
diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016
#undef HID_ENABLED

// Arduino Due ADC->DMA->USB 1MSPS
// by stimmer
// from http://forum.arduino.cc/index.php?topic=137635.msg1136315#msg1136315
// Input: Analog in A0
// Output: Raw stream of uint16_t in range 0-4095 on Native USB Serial/ACM

// on linux, to stop the OS cooking your data: 
// stty -F /dev/ttyACM0 raw -iexten -echo -echoe -echok -echoctl -echoke -onlcr

volatile int bufn,obufn;
uint16_t buf[4][256];   // 4 buffers of 256 readings

void ADC_Handler(){     // move DMA pointers to next buffer
  int f=ADC->ADC_ISR;
  if (f&(1<<27)){
   bufn=(bufn+1)&3;
   ADC->ADC_RNPR=(uint32_t)buf[bufn];
   ADC->ADC_RNCR=256;
  } 
}

void setup(){
  SerialUSB.begin(0);
  while(!SerialUSB);
  pmc_enable_periph_clk(ID_ADC);
  adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX, ADC_STARTUP_FAST);
  ADC->ADC_MR |=0x80; // free running

  ADC->ADC_CHER=0x80; 

  NVIC_EnableIRQ(ADC_IRQn);
  ADC->ADC_IDR=~(1<<27);
  ADC->ADC_IER=1<<27;
  ADC->ADC_RPR=(uint32_t)buf[0];   // DMA buffer
  ADC->ADC_RCR=256;
  ADC->ADC_RNPR=(uint32_t)buf[1]; // next DMA buffer
  ADC->ADC_RNCR=256;
  bufn=obufn=1;
  ADC->ADC_PTCR=1;
  ADC->ADC_CR=2;
}

void loop(){
  while(obufn==bufn); // wait for buffer to be full
  SerialUSB.write((uint8_t *)buf[obufn],512); // send it - 512 bytes = 256 uint16_t
  obufn=(obufn+1)&3;    
}

Взято с https://gist.github.com/pklaus/5921022

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016
diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016