C#编写的winform上位机采集FPGA上发的1000Hz数据丢数问题解决记录

本文记录了使用C#编写WinForm上位机在1000Hz速率下采集FPGA数据时遇到的丢数问题及其解决方案。通过分析波特率、数据处理速度与缓存策略,发现数据处理速度慢导致缓存溢出,从而丢失数据。通过扩大缓存数组长度至65536,目前正进行长时间验证以确保2小时以上不丢数。
摘要由CSDN通过智能技术生成

一、问题概况

上位机用于采集FPGA上发的1000Hz数据,每帧数据为49字节,波特率为641100,丢数现象比较频繁,大约20分钟内会出现3、4次。

二、上位机数据采集策略

定义了一个数组(byte[] order = new byte[4096])用于缓存收到的数据,串口收到的数据会缓存在长度为65535的缓存区中,使用serialport自带的数据读取函数,将缓存区中的数据赋值给order数据,同时处理完的数据不断移位。

三、分析

由于最早数据采集是以400Hz,出现问题的频率要比现在低很多,所以在频率提高后最先怀疑的是波特率不够,1000Hz,49字节一帧的数据已经占据了近80%,所以最初提高了波特率至921600,重新试验发现,似乎不丢数了,但在后续试验过程中还是出现了丢数的现象,而且基本上都丢失85帧。

85帧刚好是一个order的大小,所以扩充了order的长度至8192,测试发现丢数帧数变成了170帧。

四、结局

在对order数组缓存的数据一遍遍的分析,各种打断点和写陷阱调试,最终终于分析出了原因,并加以验证。

原来在算法计算和移位过程中,很多循环需要使用循环数组,就使得用了很多取余操作,由于取余操作运算速度较慢,数据存入和数据处理速度存在时间差,存入速度较快,串口缓存区中会不断积攒数据,然后在order数据处理完时再一次性赋给order,当数据量超出order长度时,后半部分数据会覆盖掉前半部分数据,导致帧头处原本是正确的BB变成一帧中间的一个数,最终没有进入解析。

经试验发现&#

C# Winform上位机是一种基于Windows桌面应用程序的上位机开发方式,可以通过串口通信等方式与下位机进行数据交互。以下是一个简单的C# Winform上位机的例子: 1.在Visual Studio中创建一个Windows Forms应用程序项目。 2.在窗体上添加一个ComboBox控件和一个Button控件。 3.在代码中引用System.IO.Ports命名空间,使用SerialPort类实现串口通信。 4.在Button的Click事件中编写代码,获取可用串口列表并在ComboBox中显示。 5.在ComboBox的SelectedIndexChanged事件中编写代码,获取选中的串口名称并打开串口。 6.在串口接收事件中编写代码,处理下位机发送的数据。 以下是一个简单的C# Winform上位机的代码示例: ```csharp using System; using System.IO.Ports; using System.Windows.Forms; namespace WinformSerialPort { public partial class Form1 : Form { private SerialPort serialPort; public Form1() { InitializeComponent(); serialPort = new SerialPort(); serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived); } private void Form1_Load(object sender, EventArgs e) { string[] ports = SerialPort.GetPortNames(); if (ports.Length != 0) { comboBox1.Items.AddRange(ports); comboBox1.SelectedIndex = 0; } else { MessageBox.Show("请插入串口设备!!"); } } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { if (serialPort.IsOpen) { serialPort.Close(); } serialPort.PortName = comboBox1.SelectedItem.ToString(); serialPort.BaudRate = Convert.ToInt32(comboBox2.SelectedItem.ToString()); serialPort.Open(); } private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { string data = serialPort.ReadExisting(); // 处理接收到的数据 } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值