私は、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 など
問題を解決してください。
どのフレームワークバージョン、どのコンパイラ、どのドライバを使用していますか?また、あなたが持っているPC上のどのOS。また、USBポートを確認してください(確かに2.0ではなく3.0にする必要があります)。 OSが忙しすぎると(例えばgfxの場合)、USB CDCのバルク転送は同期を失い、ドライバ層の転送で一時停止を起こす傾向があります。あなたのMCU側がそれを処理するように設計されていない場合は、何も起こりません(しかし前にデータが失われることはありませんでした)。 – Spektre