C#-WinForm串口通信Demo 附源工程文件可直接通过编译。

 

Demo功能介绍

 

 

 下载地址百度网盘

链接:https://pan.baidu.com/s/1AdhP8uUkSvVg3qXUtlMvOw?pwd=ieo5
提取码:ieo5

源代码

介绍:

cbx_Port为lable文字"串口号"后对应控件命名
cbx_BaudRate为lable文字"波特率"后对应控件命名
cbx_DataBits为lable文字"数据位"后对应控件命名
cbx_StopBits为lable文字"停止位"后对应控件命名
cbx_Parity为labl文字"校验位"后对应控件命名
btn_StartComm为"打开串口(关闭串口)"按钮命名
Senddatademo为"指令1"按钮命名
textBox1为打印区域控件命名
 
using System;
using System.IO.Ports;
using System.Threading;
using System.Windows.Forms;

namespace WinformDemo_RS485_
{
    public partial class Form1 : Form
    {
        private SerialPort serialPort1 = new SerialPort();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();//获取电脑上可用串口号
            cbx_Port.Items.AddRange(ports);
            cbx_Port.SelectedIndex = cbx_Port.Items.Count > 0 ? 0 : -1;//如果里面有数据,显示第0个
            cbx_BaudRate.SelectedIndex = 3;
            cbx_DataBits.SelectedIndex = 2;
            cbx_StopBits.SelectedIndex = 1;
            cbx_Parity.SelectedIndex = 0;
        }

        private void btn_StartComm_Click(object sender, EventArgs e)
        {
            if (btn_StartComm.Text == "打开串口")
            {
                try
                {
                    //获取cbx_Port要打开的串口号
                    serialPort1.PortName = cbx_Port.Text;

                    //获取 cbx_BaudRate选择的波特率
                    serialPort1.BaudRate = int.Parse(cbx_BaudRate.Text);

                    //设置数据位
                    serialPort1.DataBits = int.Parse(cbx_DataBits.Text);

                    ///设置停止位
                    if (cbx_StopBits.SelectedIndex == 1) { serialPort1.StopBits = StopBits.One; }
                    else if (cbx_StopBits.SelectedIndex == 3) { serialPort1.StopBits = StopBits.OnePointFive; }
                    else if (cbx_StopBits.SelectedIndex == 2) { serialPort1.StopBits = StopBits.Two; }
                    else if (cbx_StopBits.SelectedIndex == 0) { serialPort1.StopBits = StopBits.None; }

                    ///设置奇偶校验
                    if (cbx_Parity.SelectedIndex == 0) { serialPort1.Parity = Parity.None; }
                    else if (cbx_Parity.SelectedIndex == 1) { serialPort1.Parity = Parity.Odd; }
                    else if (cbx_Parity.SelectedIndex == 2) { serialPort1.Parity = Parity.Even; }
                    else if (cbx_Parity.SelectedIndex == 3) { serialPort1.Parity = Parity.Mark; }
                    else if (cbx_Parity.SelectedIndex == 4) { serialPort1.Parity = Parity.Space; }

                    serialPort1.Open();
                    btn_StartComm.Text = "关闭串口";
                }
                catch (Exception err)
                {
                    MessageBox.Show("打开失败" + err.ToString(), "提示!");
                }
            }
            else
            {
                try
                {
                    serialPort1.Close();
                }
                catch (Exception) { }
                btn_StartComm.Text = "打开串口";
            }
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x0219)
            {//设备改变
                if (m.WParam.ToInt32() == 0x8004)
                {//usb串口拔出
                    string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新获取串口
                    cbx_Port.Items.Clear();//清除comboBox里面的数据
                    cbx_Port.Items.AddRange(ports);//给cbx_Port添加数据
                    if (Senddatademo.Text == "关闭串口")
                    {//用户打开过串口
                        if (!serialPort1.IsOpen)
                        {//用户打开的串口被关闭:说明热插拔是用户打开的串口
                            Senddatademo.Text = "打开串口";
                            serialPort1.Dispose();//释放掉原先的串口资源
                            cbx_Port.SelectedIndex = cbx_Port.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号
                        }
                        else
                        {
                            cbx_Port.Text = btn_StartComm.Text;//显示用户打开的那个串口号
                        }
                    }
                    else
                    {//用户没有打开过串口
                        cbx_Port.SelectedIndex = cbx_Port.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号
                    }
                }
                else if (m.WParam.ToInt32() == 0x8000)
                {//usb串口连接上
                    string[] ports = System.IO.Ports.SerialPort.GetPortNames();//重新获取串口
                    cbx_Port.Items.Clear();
                    cbx_Port.Items.AddRange(ports);
                    if (Senddatademo.Text == "关闭串口")
                    {//用户打开过一个串口
                        cbx_Port.Text = btn_StartComm.Text;//显示用户打开的那个串口号
                    }
                    else
                    {
                        cbx_Port.SelectedIndex = cbx_Port.Items.Count > 0 ? 0 : -1;//显示获取的第一个串口号
                    }
                }
            }
            base.WndProc(ref m);
        }

        /// <summary>
        /// 接收数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int len = serialPort1.BytesToRead;//获取可以读取的字节数
            byte[] buff = new byte[len];//创建缓存数据数组
            serialPort1.Read(buff, 0, len);//把数据读取到buff数组

            Invoke((new Action(() =>
            {
                ///文本框打印指令
                textBox1.AppendText($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 收◇{ByteToString(buff)}\r\n");
            })));
        }

        /// <summary>
        /// 点击指令1按钮后发送指令
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Senddatademo_Click(object sender, EventArgs e)
        {
            byte[] data = { 0x01, 0x02, 0x03, 0x04 };
            try
            {
                if (data.Length > 0)
                {
                    serialPort1.Write(data, 0, data.Length);//串口发送数据

                    ///文本框打印指令
                    textBox1.AppendText($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 发◇{ByteToString(data)}\r\n");

                    Thread.Sleep(1000);

                    serialPort1_DataReceived(sender, null);
                }
            }
            catch (Exception) { }
        }

        /// <summary>
        /// 字节转字符 便于打印到文本框
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private string ByteToString(byte[] data)
        {
            string str = "";
            if (data != null)
            {
                for (int i = 0; i < data.Length; i++)
                {
                    str += data[i].ToString("X2") + " ";
                }
            }
            return str;
        }
    }
}

 

posted @ 2023-04-08 17:26  Curtin0  阅读(683)  评论(0)    收藏  举报