cdc设备模式下AVR32 UC3 USB数据丢失

本文关键字:USB 数据 UC3 AVR32 模式 cdc | 更新日期: 2023-09-27 18:03:24

我需要通过USB将数据从AT32 UC3微控制器ADC传输到PC。我检查了ADC和PDCA在填充缓冲区的单片机中的工作情况,没有数据丢失。但是当我从USB发送数据时,一些字节丢失了。我不知道为什么会这样。我编写了简单的程序,将一些数据从单片机发送到PC,并检查这些数据。在MCU中,我用数字0,1,2填充缓冲区。连续到255,然后通过USB将缓冲区发送到PC,并检查该缓冲区的内容。因此,有些数字与原始数据不同。丢失了一些字节。我在CDC设备模式下使用EVK1100。

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 =385 i=31

数据丢失。N =641 i=31

数据丢失。N =257 i=31等。

请帮我解决这个问题。

cdc设备模式下AVR32 UC3 USB数据丢失

SerialPort.Read最多读取 N(32)个字节,这取决于输入缓冲区(docs)中有多少字节。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
    }
}