AVR32 UC3 USB потеря данных в режиме устройства cdc
Мне нужно перенести данные с АЦП микроконтроллера AT32 UC3 на ПК через USB. Я проверяю работу ADC и PDCA в MCU по заполнению буфера, и все работает отлично без потери данных. Но когда я отправляю данные с USB, некоторые байты теряются. Я не знаю, почему это происходит. Я пишу простые программы для отправки некоторых данных из MCU на ПК и проверки этих данных. В MCU я постоянно заполняю буфер номерами от 0,1,2.. до 255, затем отправляю буфер через USB на ПК и проверяю содержимое этого буфера. Итак, некоторые цифры отличаются от исходных данных. Некоторые байты потеряны. Я использую EVK1100 в режиме устройства CDC.
Код 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 я =31
Потерянные данные n =385 я =31
Потерянные данные n =641 я =31
Потерянные данные n =257, i=31 и т. д.
Пожалуйста, помогите мне решить проблему.
1 ответ
SerialPort.Read
читает максимум N
(32) байта, это зависит от того, сколько байтов находится во входном буфере ( документы). 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
}
}