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

Мне нужно перенести данные с АЦП микроконтроллера 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 и т. д.

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

1 ответ

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
    }
}
Другие вопросы по тегам