C#上位机编程完成串口通讯,然后实时数据处理
因为C#学了不多,很多知识不清楚,所以还望各位高手能够耐心指点
界面如下,点击调试数据之后就可以把接收的数据显示出来,但是用了一会儿就会很卡


下面是代码
public partial class MainInterface : Form
{
bool maglevStatus = false;//悬浮状态
bool flagRPM0 = false;//转速为0标志位
string rec;
Form2 fr2 = new Form2();//实例化绘图窗口
Form3 fr3 = new Form3();//实例化测试窗体的对象,来访问其中的textbox
public MainInterface()
{
InitializeComponent();
}
private void MainInterface_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
//开启委托
sp1.DataReceived += new SerialDataReceivedEventHandler(DataReceive);
Init init = new Init(this);//创建一个Init对象
init.FormInit();//窗体初始化
#region 自动搜索串口
try
{
PublicVar.portName = SerialPort.GetPortNames();
cmbPort.Items.AddRange(PublicVar.portName);
cmbPort.SelectedItem = cmbPort.Items[0];
}
catch
{
MessageBox.Show("未搜索到串口");
}
if (cmbPort.Items.Count == 0)
{
btnOpenOrClose.Enabled = false;
}
else
{
btnOpenOrClose.Enabled = true;
}
#endregion
}
/// <summary>
/// 接收数据
/// 参数设置存在paraRec中,调试数据存在debugRec中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void DataReceive(object sender, SerialDataReceivedEventArgs e)
{
try
{
//sp1.ReadLine();
//sp1.ReadExisting
int count = sp1.BytesToRead;//实际接收到的字节数
byte[] buffer = new byte[count];
sp1.Read(buffer, 0, count);//把读取的数据存到缓冲字节数组中
if (buffer[0] == 0x5B && buffer[buffer.Length - 3] == 0x5D) //转义字符\r\n只算r和n的字节数
{
rec = Encoding.Default.GetString(buffer);
PublicVar.paraRec.Add(rec);//把接收到的参数设置的数据存到paraRec中
HandData(rec);//即时处理数据
sp1.DiscardInBuffer();
}
else
{
sp1.DiscardInBuffer();
}
}
catch { }
}
/// <summary>
/// 处理数据
/// </summary>
/// <param name="data">接收到的数据转换成的字符串</param>
void HandData(string data)
{
//handData处理之后的字符串数组
string[] handData = data.Split(new string[] { "[", " ", "]", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
if (handData[0] == "rpm")
{
rpmtxt.Text = handData[1];
}
else if (handData[0] == "maglev")
{
if (handData[1] == "1")
{
maglevStatus = true;//悬浮状态
magStaPic.Image = Properties.Resources.起浮;
}
else if (handData[1] == "0")
{
maglevStatus = false;//落下状态
magStaPic.Image = Properties.Resources.落下;
}
}
else if (handData[0] == "err")
{
errtxt.Text = handData[1];
}
else if (handData[0] == "x_shift")//将获取到的x y坐标存储到list中,超过500则覆盖
{
fr3.x_shift.Text = handData[1];//把值传入到调试界面
if (PublicVar.x_shift.Count > 500)
{
PublicVar.x_shift.RemoveAt(0);
PublicVar.x_shift.Add(handData[1]);
}
else
{
PublicVar.x_shift.Add(handData[1]);
}
}
else if (handData[0] == "y_shift")
{
fr3.y_shift.Text = handData[1];//把值传入到调试界面
if (PublicVar.y_shift.Count > 500)
{
PublicVar.y_shift.RemoveAt(0);
PublicVar.y_shift.Add(handData[1]);
}
else
{
PublicVar.y_shift.Add(handData[1]);
}
}
else if (handData[0] == "speed_input")
{
fr3.speed_input.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "speed_set")
{
fr3.speed_set.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "speed")
{
fr3.speed.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "speed_output")
{
fr3.speed_output.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "phase")
{
fr3.phase.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "iic")
{
fr3.iic.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "x_offset")
{
fr3.x_offset.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "y_offset")
{
fr3.phase.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "x_offset_feedback")
{
fr3.x_offset_feedback.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "y_offset_feedback")
{
fr3.y_offset_feedback.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "x_shift_average")
{
fr3.x_shift_average.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "y_shift_average")
{
fr3.y_shift_average.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "maglev_flag")
{
fr3.maglev_flag.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "maglev_protect")
{
fr3.maglev_protect.Text = handData[1];//把值传入到调试界面
}
else if (handData[0] == "pwm_protect_tick")
{
fr3.pwm_protect_tick.Text = handData[1];//把值传入到调试界面
}
} 相关推荐
上位机与下位机通讯项目
同时,对于C#编程、单片机控制以及实时通讯的理解也会得到显著提升。
C#上位机开发实战:嵌入式设备串口与网口通讯全解析
本文介绍了使用C#开发嵌入式设备上位机软件的方法,重点实现串口和网口通讯功能。系统分为串口通讯、网口通讯、数据处理展示和日志管理四大模块,通过System.IO.Ports.SerialPort类和System.Net.Sockets.TcpClient类分别实现两种通讯方式。文章详细讲解了串口数据收发、TCP/IP连接建立等核心功能代码,并提供了实时数据显示、数据导出等实用功能实现方案。该方案可帮助开发者快速搭建稳定可靠的工业级上位机平台,满足设备监控、数据采集和控制管理等需求。
深入探索 C# 上位机开发:跨协议通讯与实时数据可视化的最佳实践
C# 提供了一整套强大且灵活的工具来开发跨协议通讯和实时数据可视化的上位机系统。从不同协议的通信实现,到实时数据采集与处理,再到高效的可视化展示,C# 能够帮助开发者构建高效、稳定且具有智能化分析功能的上位机应用。通过本文的探讨,开发者可以了解到如何利用 C# 在上位机开发中实现跨协议通讯和实时数据可视化的最佳实践,为工业自动化和智能制造提供高效的技术支持。
C#上位机开发与工业通讯实战:从零基础到项目实战的全流程解析
摘要:本文介绍了C#在工业自动化上位机开发中的应用。C#凭借简洁语法、丰富类库和强大UI支持,成为开发数据采集、设备控制和人机界面的理想选择。文章详细讲解了Modbus TCP/RTU协议的实现方法,并演示了Windows Forms构建监控界面的示例。同时介绍了C#如何通过图表控件实现工业数据的可视化展示,为工业自动化项目提供高效稳定的解决方案。
基于C# Winform完成串口通讯上位机
本文将详细讲解如何使用C#编程语言和Windows Forms(Winform)开发一个串口通讯的上位机程序,这对于初学者来说是一个很好的实践项目。首先,让我们了解什么是串口通讯。


