我需要通过USB将数据从AT32 UC3微控制器ADC传输到PC。我在填充缓冲区的MCU中检查ADC和PDCA的工作,它的工作是完美的,没有数据丢失。但是当我从USB发送数据时,一些字节丢失了。我不知道,为什么会这样。 我编写简单的程序,将一些数据从MCU发送到PC并检查这些数据。在MCU中,我用连续的0,1,2 ..到255填充缓冲区,然后通过USB将缓冲区发送到PC,并检查该缓冲区的内容。因此,有些数字与原始数据不同。有些字节丢失了。我在CDC设备模式下使用EVK1100。
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 i = 31
数据丢失。 n = 385 i = 31
数据丢失。 n = 641 i = 31
数据丢失。 n = 257 i = 31 等等。
请帮我解决问题。
答案 0 :(得分: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
}
}