2016-08-20 14 views
0

私は、AT32 UC3マイクロコントローラADCからUSB経由で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のバルク転送は同期を失い、ドライバ層の転送で一時停止を起こす傾向があります。あなたの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

関連する問題