如何解决.NET SerialPort控件效率低下的问题?

AlexYzhov AlexYzhov 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
以同样的频率从下位机接收数据,利用QT和.NET写的程序性能竟然差了10多倍。。





.NET程序是自己用C#写的,QT的程序是网上下载的串口助手。。具体事件如下
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)  //接收中断事件
{
System.Threading.Thread.Sleep(100); //延时100ms,等待缓冲区被写入数据
//this.Invoke是跨线程访问UI的方法
this.Invoke((EventHandler)(delegate
{
//检验数据格式
if (radioButton_disHEX.Checked)
{
isDisHEX = true;
isDisASCII = false;
}
else if (radioButton_disASCII.Checked)
{
isDisHEX = false;
isDisASCII = true;
}

if (isDisHEX == false || isDisASCII == true) //以ASCII方式处理数据
{
richTextBox_Receive.SelectionColor = Color.Red;
richTextBox_Receive.AppendText( "<Recv>: " + serialPort.ReadLine() + "\r\n");//以ASCII方式显示数据
}
else //以HEX方式处理数据
{
Byte[] recvStr = new Byte[serialPort.BytesToRead]; //recvStr用于接收字节数据
float[] recvF = new float[serialPort.BytesToRead];
serialPort.Read(recvStr, 0, recvStr.Length);
string recvStrText = null; //声明数组存储接收数据
for (int i = 0; i < recvStr.Length - 1; i++)
{
recvF[i] = Convert.ToSingle(recvStr[i]);
//recvStrText += ("0x" + recvStr[i].ToString("X2") + " ");
}
for (int i = 0; i < recvStr.Length - 1; i++)
{
recvStrText += (recvF[i].ToString() + " ");
}
richTextBox_Receive.SelectionColor = Color.Red;
richTextBox_Receive.AppendText( "<Recv>: " + recvStrText + "\r\n" );
}
serialPort.DiscardInBuffer();//清空缓冲区
}
));
}


网上搜罗到了若干关于.NET串口性能低下的讨论:
http://bbs.csdn.net/topics/370185093
http://www.amobbs.com/thread-5481189-2-1.html
大致的结论是.NET自带的这个控件本身有问题。。

我的目的是想用C#写一个上位机调试参数,对数据的实时性有一定的要求。
现在发现数据收发频率稍微高一点,CPU占用率就异常的高。想改善这一现状,有什么好的方法吗?
用封装好WinAPI的类库(比如JustinIO,但似乎功能有问题?)?还是用第三方串口控件(QT?)?多语言混合编程(py)?还是继续改进SP类的参数(似乎没啥用)?
而且有没有方法用C#调用QT的qtserialport.dll完成串口部分的收发?
...全文

相关推荐

VB .net SerialPort控件使用详解

VB2008中使用SerialPort控件详解,从接收到发送。估计你看了就会用这个了,其实VB2008很简单哦~

caubird

C#与Arduino串口通信实战:从协议设计到上位机开发

串口通信作为嵌入式系统与上位机软件交互的经典方式,其核心原理是通过串行数据流在设备间传输信息。为实现稳定可靠的数据交换,关键在于设计一套明确的数据帧协议,例如使用起始符和结束符界定数据边界,从而避免流式传输中的解析混乱。这项技术在实际工程中价值显著,能够将硬件层的实时数据采集能力与软件层强大的数据处理、可视化功能相结合。在物联网、工业自动化、智能家居等应用场景中,上位机软件常需与微控制器进行高效通信。本文聚焦于C#与Arduino的组合,详细阐述了如何利用C#的System.IO.Ports类库构建串口通信

chenju1968

C# WinForm实战:200例源码解析与全栈开发进阶指南

在软件开发领域,桌面应用程序开发是连接用户与系统功能的重要桥梁,其核心在于构建稳定、高效且交互友好的图形界面。C#作为.NET平台的主流语言,结合WinForm框架,为开发者提供了强大的桌面开发能力,其原理基于事件驱动与控件模型,通过可视化设计简化了界面构建过程。这项技术的价值在于能够快速开发企业级工具、工控上位机及内部管理系统,尤其在需要与硬件交互、处理复杂业务逻辑的场景中展现出独特优势。应用场景广泛覆盖数据采集、串口通信、图像处理和数据库管理等。本文以一份涵盖六大核心模块的C#实战源码资源为切入点,深入

CHM单

C#.NET SerialPort控件实现

C#.NET SerialPort控件实现

thanksforyour

VB.Net(SerialPort 控件)

serialport讲述属性和事件,以及接收和发送方法

beijita000
评论 19
收藏 已收藏
分享
返回顶部
AlexYzhov
C# 111,129 成员 642,539 内容