首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >cdc设备模式下的AVR32 UC3 USB数据丢失

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

Stack Overflow用户
提问于 2016-08-20 12:20:54
回答 1查看 321关注 0票数 0

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

AVR代码:

代码语言:javascript
运行
复制
#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#代码:

代码语言:javascript
运行
复制
   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等。

请帮我解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2016-08-20 12:29:14

SerialPort.Read最多读取 N (32)字节,这取决于输入缓冲区(文档 )中有多少字节。Read返回读取的字节数。

要读取长度为N的数据块,您应该自己缓冲数据,并且只在达到N字节时检查内容。例如:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39054077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档