AVR32 UC3 USB потеря данных в режиме устройства cdc

c# c avr avr32 atmel-uc3

220 просмотра

1 ответ

Мне нужно перенести данные с микроконтроллера AT32 UC3 АЦП на ПК через USB. Я проверяю работу ADC и PDCA в MCU по заполнению буфера, и все работает отлично без потери данных. Но когда я отправляю данные с USB, некоторые байты теряются. Я не знаю, почему это происходит. Я пишу простые программы для отправки некоторых данных из MCU на ПК и проверки этих данных. В MCU я постоянно заполняю буфер числами от 0,1,2 .. до 255, затем отправляю буфер через USB на ПК и проверяю содержимое этого буфера. Итак, некоторые цифры отличаются от исходных данных. Некоторые байты потеряны. Я использую EVK1100 в режиме устройства CDC.

Код AVR:

#include <asf.h>
#include "conf_usb.h"

#define BUF_SIZE 32

int main(void){

   irq_initialize_vectors();
   cpu_irq_enable();

   sysclk_init();

   udc_start();
   udc_attach();

   char pbuf[BUF_SIZE];
   for(int i=0; i<BUF_SIZE; i++){
       pbuf[i] = (char)i;
   }

   while (true) {
       udi_cdc_write_buf(pbuf, BUF_SIZE);
   }
}

Код C #:

   using System;
   using System.Collections.Generic;
   using System.Linq;
   using System.Text;
   using System.IO.Ports;

  namespace acc_tester
  {
    class Program
    {
        static void Main(string[] args) {
            Console.WriteLine("Start");
            int N = 32;

            SerialPort serialPort = new SerialPort();

            serialPort.PortName = "COM6";

            serialPort.Open();

            byte[] buf = new byte [N];

            for (int n = 0; n < 10000; n++) {
                serialPort.Read(buf, 0, N);

                for (int i = 0; i < N; i++) {
                    if (buf[i] != (byte)(buf[0] + i)) {
                        Console.WriteLine("Data Lost. n =" + n.ToString() + " i=" + i.ToString());
                        return;
                    }
                }
            }

            serialPort.Close();
            Console.WriteLine("Stop");
            return;
        }
    }
}

Результат моей программы на C #:

Потерянные данные n = 257 я = 31

Потерянные данные n = 385 я = 31

Потерянные данные n = 641, я = 31

Потерянные данные n = 257, i = 31 и т. д.

Пожалуйста, помогите мне решить проблему.

Автор: Leonid Источник Размещён: 08.11.2019 11:18

Ответы (1)


0 плюса

SerialPort.Readчитает не более N (32) байтов, это зависит от того, сколько байтов находится во входном буфере ( документы ). Readвозвращает количество прочитанных байтов.

Чтобы прочитать порцию данных длины, Nвы должны буферизовать сами данные и проверять содержимое только при достижении Nбайтов. Например.

while (true) {
    var bytesInBuffer = 0;
    bytesInBuffer += serialPort.Read(buf, bytesInBuffer, N - bytesInBuffer);
    if (bytesInBuffer == N) {
        // Here the buffer is ready
        bytesInBuffer = 0; // reset the counter
    }
}
Автор: aghidini Размещён: 20.08.2016 12:29
Вопросы из категории :
32x32