C# Winform 基于SerialPort类实现串口通信,ASCII数据收发(打开、关闭、接收、发送)

C# Winform 基于SerialPort类实现串口通信

效果展示

 

UI界面代码

 

复制代码
public partial class Frm_SerialPortTest : Form
{
    SerialPort mySerialPort;
    public Frm_SerialPortTest()
    {
        InitializeComponent();
        this.MinimumSize = new System.Drawing.Size(650, 500);
        this.CenterToScreen();
    }
    /// <summary>
    /// 窗体加载事件
    /// </summary>
    private void Frm_SerialPortTest_Load(object sender, EventArgs e)
    {
        
        // // 获取本机存在的所有 COM 口
        cbx_SerialPort.DataSource = SerialPortTest.PortArray();
        //波特率
        cbx_BaudRate.DataSource = SerialPortTest.BaudRateArray();
        cbx_BaudRate.SelectedIndex = cbx_BaudRate.Items.Count - 1;
        //校验位
        cbx_Parity.DataSource = SerialPortTest.ParityArray();
        //数据位
        cbx_DataBit.DataSource = SerialPortTest.DataBitArray();
        //停止位,
        cbx_StopBit.DataSource = SerialPortTest.StopBitArray();
        cbx_StopBit.SelectedIndex = 1;
        btn_Open.Enabled = true;
        btn_Close.Enabled = false;
    }

    #region 按钮事件
    /// <summary>
    /// 打开按钮事件
    /// </summary>
    private void btn_Open_Click(object sender, EventArgs e)
    {
        try
        {
            mySerialPort = new SerialPort(cbx_SerialPort.Text); // 选择正确的串口号

            mySerialPort.BaudRate = int.Parse(cbx_BaudRate.Text);
            mySerialPort.Parity = (Parity)Enum.Parse(typeof(Parity), cbx_Parity.Text);
            mySerialPort.DataBits = int.Parse(cbx_DataBit.Text);
            mySerialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cbx_StopBit.Text);

            mySerialPort.Handshake = Handshake.None;
            mySerialPort.RtsEnable = checkBox_RtsEnable.Checked;
            mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            mySerialPort.Open();
            picBx_StatusShow.BackColor = Color.LimeGreen;
            MessageShow("打开串口成功!");
            MessageShow($"port = {mySerialPort.PortName},Parity = {mySerialPort.Parity},DataBits = {mySerialPort.DataBits},stopBits = {mySerialPort.StopBits}");
            ParamControlUpdata(gpbx_SetParam, false);
            btn_Open.Enabled = false;
            btn_Close.Enabled = true;
        }
        catch (Exception ex)
        {
            picBx_StatusShow.BackColor = Color.Gray;
            MessageShow(ex.Message);
            ParamControlUpdata(gpbx_SetParam, true);
            btn_Open.Enabled = true;
            btn_Close.Enabled = false;
        }
    }

    /// <summary>
    /// 关闭按钮事件
    /// </summary>
    private void btn_Close_Click(object sender, EventArgs e)
    {
        try
        {
            if (mySerialPort == null)
            {
                picBx_StatusShow.BackColor = Color.Gray;
            }
            else
            {
                picBx_StatusShow.BackColor = Color.Gray;
                MessageShow("关闭串口成功!");
                MessageShow($"port = {mySerialPort.PortName},Parity = {mySerialPort.Parity},DataBits = {mySerialPort.DataBits},stopBits = {mySerialPort.StopBits}");
                mySerialPort.Close();
                mySerialPort = null;
            }
            ParamControlUpdata(gpbx_SetParam, true);
            btn_Open.Enabled = true;
            btn_Close.Enabled = false;
        }
        catch (Exception ex)
        {
            ParamControlUpdata(gpbx_SetParam, true);
            btn_Open.Enabled = true;
            btn_Close.Enabled = false;
        }
    }

    /// <summary>
    ///发送按钮
    /// </summary>
    private void btn_SendData_Click(object sender, EventArgs e)
    {
        if (mySerialPort == null) return;

        string data = rtbx_SendData.Text;
        mySerialPort.Write(data);

    }
    /// <summary>
    /// 清空接收框
    /// </summary>
    private void btn_ClearReceiveData_Click(object sender, EventArgs e)
    {
        rtbx_ReceivedData.Text = string.Empty;
    }
    // <summary>
    /// 清空发送框
    /// </summary>
    private void btn_ClearSendData_Click(object sender, EventArgs e)
    {
        rtbx_SendData.Text = string.Empty;
    }
    #endregion

    #region 委托方法
    /// <summary>
    /// 数据接收委托
    /// </summary>
    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;

        string indata = sp.ReadExisting();
        MessageShow(indata);
    }
    #endregion

    #region 其他方法

    /// <summary>
    /// 消息显示
    /// </summary>
    public void MessageShow(string data)
    {
        rtbx_ReceivedData.Invoke(new Action(() =>
        {
            rtbx_ReceivedData.AppendText($"{DateTime.Now}】{data}{Environment.NewLine}");
        }));
    }

    /// <summary>
    /// 更新指定控件的Enabled
    /// </summary>
    public void ParamControlUpdata(Control control, bool statu)
    {
        foreach (Control childControl in control.Controls)
        {
            if (childControl is ComboBox)
            {
                (childControl as ComboBox).Enabled = statu;
            }
            // 如果子控件是容器控件,则递归遍历其子控件
            if (childControl.HasChildren)
            {
                ParamControlUpdata(childControl, statu);
            }
        }
    }
    #endregion
}
复制代码

其他辅助类代码

 

复制代码
public class SerialPortTest
{
    public static int[] _BaudRateArray = { 110,300, 600, 1200, 2400, 4800, 9600, 14400,19200, 38400, 57600, 115200 };
    public static int[] _DataBitArray = { 8,7,6,5 };
    /// <summary>
    /// 串口号
    /// </summary>
    public string Port = "COM1";
    /// <summary>
    /// 波特率
    /// </summary>
    public int BaudRate = 115200;
    /// <summary>
    /// 校验位(奇偶性)
    /// </summary>
    public Parity Parity = Parity.None;
    /// <summary>
    /// 数据位
    /// </summary>
    public int DataBit   = 8;
    /// <summary>
    /// 停止位
    /// </summary>
    public StopBits StopBit = StopBits.One;
    /// <summary>
    /// 握手方式
    /// </summary>
    public Handshake Handshake = Handshake.None;
    /// <summary>
    /// 复位使能
    /// </summary>
    public bool RtsEnable = true;


    public SerialPortTest() { }
    public SerialPortTest(string port,int baudRate, Parity parity, int dataBit, StopBits stopBit) 
    {
        this.Port = port;
        this.BaudRate = baudRate;
        this.Parity = parity;
        this.DataBit = dataBit;
        this.StopBit = stopBit;
    }

    public void SetPortParam(string port, int baudRate, Parity parity, int dataBit, StopBits stopBit)
    {
        this.Port = port;
        this.BaudRate = baudRate;
        this.Parity = parity;
        this.DataBit = dataBit;
        this.StopBit = stopBit;
    }

    #region 静态方法
    public static Array PortArray()
    {
        return SerialPort.GetPortNames();
    }
    public static Array BaudRateArray()
    {
        return _BaudRateArray;
    }
    public static Array DataBitArray()
    {
        return _DataBitArray;
    }
    public static Array ParityArray()
    {
        return Enum.GetValues(typeof(Parity));
    }
    public static Array StopBitArray()
    {
        return Enum.GetValues(typeof(StopBits)); ;
    }
    #endregion
}
复制代码

 (本人)原文连接: http://t.csdnimg.cn/5Cne1

posted @   吾与谁归  阅读(216)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示