UDP传输数据丢包原因分析

使用优数科技的PCIe-404信号处理卡,上位机接收数据时,遇到UDP数据丢包问题。

1.1 丢包原因分析

1.网络层原因:

网络拥堵:路由器或交换机缓冲区满,导致数据包被丢弃。

链路质量差:无线网络不稳定或物理链路问题。

带宽不足:发送速率超过链路承载能力。

2.系统层原因:

操作系统缓冲区满:接收端处理速度慢,导致内核缓冲区溢出。

防火墙或安全软件拦截:某些安全规则可能丢弃UDP包。

资源限制:系统资源(如内存、CPU)不足,影响网络栈处理能力。

3.应用层原因(QT相关):

接收端处理延迟:QUdpSocket的readyRead信号处理太慢,未及时读取数据。

单线程处理瓶颈:在主线程中处理大量UDP数据,导致界面卡顿和丢包。

缓冲区设置不合理:未使用setSocketOption调整接收/发送缓冲区大小。

数据包大小超过MTU:导致IP分片,增加丢失概率。

4.多线程竞争:多个线程同时操作同一个QUdpSocket实例,导致问题。

协议本身限制:

UDP无重传机制:不保证可靠交付。

缺乏流量控制:发送方可能发送过快。

1.2 问题点&解决办法

排查思路排查FPGA回传到上位机的数据是否由丢包,可通过wireshark抓包工具查看。数据回传的数据格式为4字节协议头,4字节数据地址位,64字节有效数据。每发一包数据地址位加64,通过检测地址位是否连续,判断数据是否丢包。

经排查FPGA不一定将数据全部发送过来,那么丢包原因就有QT上位机接收丢包和FPGA发送丢包两种可能。

1.2.1 上位机接收丢包解决方法

1.将数据接收和数据处理放入线程中单独处理。

问题点:QT的UDP默认接收缓冲区大小为64KB,接收缓冲区太小可能造成数据溢出。

解决办法:增大缓冲区,将缓冲区设置为500MB

2.关闭主机防火墙

1.2.2 FPGA发送丢包解决方法

FPGA发送数据丢包这个问题需要上位机来做丢包检测,因为FPGA做丢包检测太繁琐,

解决办法:增加数据重传机制,判断接收数据地址是否连续,若连续则进行数据处理,反之发送丢失数据的地址给FPGA,进行重传。

关键处理步骤:

当检测到地址不连续时将丢包的地址和剩下接收的数据长度发送给FPGA,FPGA接收到重传标志后,将从丢包的地址开始发送数据。

当重传机制触发后清除接收缓冲区的内容,减少无效地址的判断减小资源开销。

1.3 软件运行

经过以上处理后,FPGA发送的数据能够全部被上位机接收。若中间有丢包也可通过重传机制重新获取丢失的数据。缓冲区增加到足够大数据不会溢出。

相关推荐
zlinear数据采集卡11 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
zlinear数据采集卡15 小时前
ZLinear产品线全景对比:D223 vs DABL7606 vs DABL-G511选型指南
arm开发·嵌入式硬件·算法·fpga开发·开源
何事误红尘19 小时前
ZYNQ学习FPGA笔记(一):vivado安装、XC7Z045
fpga开发
zlinear数据采集卡2 天前
D223的SRAM硬件记录仪:外部触发与瞬态波形捕获方案
arm开发·嵌入式硬件·fpga开发·开源
szxinmai主板定制专家2 天前
基于 RK3588 + Xilinx Kintex-7 FPGA 异构工业主控板设计方案
arm开发·人工智能·嵌入式硬件·fpga开发·zynq
Rambo.xia2 天前
RFSoC高速采集卡设计项目:一块板卡串联综合优化5大核心技术
单片机·嵌入式硬件·fpga开发
XMAIPC_Robot2 天前
RK3588+STM32:高性能机器人运动控制解决方案,兼顾实时性与AI算力
人工智能·stm32·嵌入式硬件·算法·fpga开发·机器人·arm+fpga
zlinear数据采集卡2 天前
D223的DDS信号发生器:10000点查找表与4通道16位DAC波形输出
arm开发·嵌入式硬件·fpga开发·开源
物质波波波2 天前
WS-RPE:面向边缘物理AI实时特征值计算的硬件工作窃取调度器与冗余PE激活架构
人工智能·fpga开发·架构·系统架构·硬件架构
我爱C编程3 天前
基于FPGA的DSB调制解调系统verilog开发
fpga开发·verilog·fpga·dsb