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

问题描述:

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

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

数据丢失。 n = 385 i = 31

数据丢失。 n = 641 i = 31

数据丢失。 n = 257 i = 31

请帮我解决问题。

+0

什么框架的版本,什么编译器和你使用的驱动程序?还有你在PC上的操作系统。另外检查USB端口(应该是2.0而不是3.0)。如果操作系统太忙(比如使用gfx),那么在较慢的机器(如笔记本电脑)上使用Windows时,USB CDC批量传输往往会失去同步并在驱动器层传输中产生暂停。如果您的MCU端不是为了处理任何事情而发生的(但我从未看到过丢失数据) – Spektre

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 
    } 
} 
+0

Atmel AVR4901的表4-2显示了以下端点类型:控制,中断,批量和等时。但只有批量模式才能保证数据的传输。我需要知道,在哪种模式下工作CDC设备模式以及如何将其切换到ASF中的批量模式CDC设备。 – Leonid

+0

它是否适用于我的代码? – aghidini