2016-08-20 12 views
0

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

데이터 손실. n = 385i = 31

데이터 손실. n = 641i = 31

데이터 손실. n = 257 i = 31

문제를 해결할 수 있도록 도와주세요.

+0

어떤 프레임 워크 버전, 어떤 컴파일러 및 어떤 드라이버를 사용하고 있습니까? 또한 PC에 설치된 OS는 무엇입니까? 또한 USB 포트를 확인하십시오 (2.0이 아니어야 3.0을 확인할 수 있습니다). OS가 너무 바빠서 (예 : gfx) USB CDC 대량 전송이 동기화를 잃고 드라이버 계층에서 전송이 일시 중지되는 경향이있는 경우 (예 : 노트북과 같은) 느린 컴퓨터의 Windows의 경우 MCU 측에서 처리하도록 설계되지 않은 경우 아무 것도 발생할 수 없지만 (전에는 데이터 손실이 없었습니다) – Spektre

답변

0

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

표 4-2의 Atmel AVR4901에서 제어, 인터럽트, 벌크 및 등시성과 같은 끝점 유형이 나타났습니다. 그러나 벌크 모드 만이 데이터 전송을 과시했습니다. CDC 장치 모드를 작동시키는 모드와 ASF의 벌크 모드 CDC 장치로 전환하는 방법을 알아야합니다. – Leonid

+0

내 코드에서 작동합니까? – aghidini