WinForm 串口通信实战:电子秤数据采集与处理

135 阅读3分钟

前言

在工业自动化和零售领域,电子秤作为重要的数据采集设备,其数据与计算机系统的实时交互至关重要。本文将通过 WinForm开发框架,结合串口通信技术,实现电子秤数据的读取与解析,为相关领域开发提供可复用的技术方案。

一、效果展示

为了更直观地了解项目的效果,以下是几个截图:

  • 对接效果

  • 测试工具

  • 电子秤对接文档

截图展示项目的主要界面及其实现的功能。

二、创建程序

在Visual Studio 2022中进行界面设计时,我们首先需要创建一个新的WinForm应用程序。

接下来,添加必要的控件如ComboBox用于选择波特率、数据位等串口参数,Button用于打开或关闭串口,TextBox用于显示接收的数据等。

安装System.IO.Ports

为了能够操作串行端口,我们需要安装System.IO.Ports包。可以通过NuGet包管理器搜索并安装该库。

解析数据

解析从电子秤接收到的数据是整个项目的核心部分。根据电子秤提供的数据格式,我们需要提取出有用的信息并进行相应的处理。

using System.IO.Ports;

namespace WinFormsApp2
{
    public partial class FormMeter : Form
    {
        private SerialPort serialPort = new SerialPort();

        public FormMeter()
        {
            InitializeComponent();
            InitializeSettings();
            this.FormClosing += MainForm_FormClosing;
        }

        // 初始化设置
        private void InitializeSettings()
        {
            cmbBaudRate.SelectedIndex = 0;
            cmbDataBits.SelectedIndex = 3;
            cmbStopBits.SelectedIndex = 0;
            cmbParity.SelectedIndex = 0;
            RefreshPortList();
        }

        // 刷新串口列表
        private void RefreshPortList()
        {
            cmbPort.Items.Clear();
            string[] ports = SerialPort.GetPortNames();
            cmbPort.Items.AddRange(ports);
            if (ports.Length > 0) cmbPort.SelectedIndex = 0;
        }

        // 打开或关闭串口
        private void btnOpen_Click(object sender, EventArgs e)
        {
            if (!serialPort.IsOpen)
            {
                try
                {
                    serialPort.PortName = cmbPort.Text;
                    serialPort.BaudRate = int.Parse(cmbBaudRate.Text);
                    serialPort.DataBits = int.Parse(cmbDataBits.Text);
                    serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text);
                    serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text);

                    serialPort.Open();
                    btnOpen.Text = "关闭串口";
                    serialPort.DataReceived += SerialPort_DataReceived;
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"打开失败: {ex.Message}");
                }
            }
            else
            {
                serialPort.Close();
                btnOpen.Text = "打开串口";
            }
        }

        // 数据接收事件
        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string data = serialPort.ReadExisting();
            this.BeginInvoke(new Action(() =>
            {
                txtReceived.AppendText($"{data}rn");
                txtReceived.ScrollToCaret();

                // 解析数据
                int SignStart = data.IndexOf(":"); // 标识位
                if (SignStart < 0) return;
                int NumberStart = 5; // 起始位
                int NumberBits = 5; // 截取长度

                string dataPart = data.Substring(SignStart + NumberStart, NumberBits); // 数据段

                txtSend.Invoke(new Action(() =>
                {
                    txtSend.Text = dataPart;
                }));
            }));
        }

        // 关闭窗口
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort.IsOpen) serialPort.Close();
        }
    }
}

项目不仅实现基本的数据读取功能,还提供友好的用户界面供用户配置串口参数。另外,项目结构清晰,代码易于维护,适合进一步扩展和优化。

总结

通过上述步骤,我们成功实现了使用 WinForm读取电子秤数据的功能。该项目展示了如何利用.NET框架下的SerialPort类进行串行通信,以及如何解析接收到的数据。希望本文能为有类似需求的朋友提供一些参考。

关键词

C#WinForm、电子秤数据、System.IO.Ports、界面设计、数据解析、串口通信、Visual Studio 2022、数据接收、项目开发、开源项目

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:上位机李工

出处:mp.weixin.qq.com/s/Vx1UJI09iLHgxH0cmA2B0g

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!