【发布时间】:2014-08-14 00:26:47
【问题描述】:
我的 FPGA 正在使用 100 mbps 以太网在网络上发送 UDP 数据包,并且我编写了一个 MATLAB 代码来捕获数据。问题是我在接收期间在 MATLAB 中的速度非常低,大约为 50 kbps。 FPGA 套件连接到 gbps 交换机,然后连接到 PC。交换机中没有网线。 我正在粘贴下面的matlab代码。如果我尝试通过增加缓冲区大小来提高速度,则会丢弃数据包。当前设置是通过点击和试用,我成功接收到所有数据。有什么办法可以提高MATLAB中的数据接收速度?
代码:: (从 FPGA 到 Matlab 的 UDP) clc 清除所有 全部关闭
u=udp('192.168.0.100','RemotePort',4660,'Localport',4661);
set(u,'DatagramTerminateMode','off');
set(u, 'InputBufferSize', 18);
set(u,'Timeout',0.1);
fopen(u);
x=tic;
for i =1:1000
a(:,i) = fread(u,18);
end
fclose(u);
delete(u);
t=toc(x);
bw = (1000*18*8)/t;
/////////////////////////////////////// //////////
上述代码的修改版本(易于理解)+显示问题的图像
也:显示数据变量的图像,缓冲区大小为 20 个数据包(18 个字节/数据包)。如图所示,数据不得全为零。它代表丢失的数据包。 ///////////////////////////////////////// ///////
clc
clear all
close all
packet_size = 18; % Size of 1 Packet
buffer_size = 1*packet_size; % Buffer to store 1024 packets each of Packet_Size
buffer_read_count = 10; % How many times the buffer must be read
u=udp('192.168.0.100','RemotePort',4660,'Localport',4661);
set(u,'DatagramTerminateMode','off');
set(u, 'InputBufferSize', buffer_size);
set(u,'Timeout',0.5);
fopen(u);
x=tic;
for i =1:buffer_read_count
[a, count] = fread(u,buffer_size); % Read the complete buffer in one Fread()
if (count == buffer_size)
data(:, i) = a; %If Read_BYtes(Count) == BufferSize Store in Data
end
end
fclose(u);
delete(u);
t=toc(x);
bw = (buffer_read_count*buffer_size*8)/t; %Speed / BW of UDP Reception
【问题讨论】:
-
您的代码可能太慢而无法捕获所有数据包。存在诸如未初始化
data等问题,从而导致循环聚合延迟。您可以将t(:,ii) = toc放入循环中,以便稍后您可以知道每次迭代的实际执行时间。您的代码的另一个问题是,当缓冲区已满时,您 仅 才读取该缓冲区 - 这很可能是原因 - 当您读取缓冲区时,它实际上无法再接收。 -
....或者,如果我说得对,
if (count == buffer_size)说您仅在缓冲区已满时存储数据。当数据短于缓冲区长度时,这可能是一个问题?? -
您能否在
if (count == buffer_size)中添加一个else条件,其中您只是disp('hi! missed packet')?事情似乎在data(:,2) = something之后跳转到data(:,6) = something other。 -
我其实有两点。无论如何,Matlab不可能因为“慢”而跳过3列,并在第6列继续。如果它很慢,那么这 3 个零列不应该出现;相反,第 4 列将是“3;3;3;3;3....”。所以更有可能是缓冲区读取代码。
-
感谢您的关注。问题似乎正如您所指出的那样。 FPGA 以 50-60 Mbps 左右的非常快的速率发送数据,但 Matlab 以较低的速率接收数据。但我不明白为什么数据被丢弃。如果接收速度慢是问题,那么初始数据包也应该受到影响,但事实并非如此,增加缓冲区大小应该可以解决这个问题。如果发件人速度很快,为什么我会超时,更改超时也无济于事。这几乎总是在循环中调用 fread() 时发生,而不是在数据包之间。