01_SerialPort類串口通信

 

文檔:SerialPort 類 (System.IO.Ports) | Microsoft Learn

 

 

頁面展示:

 代碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Timer = System.Windows.Forms.Timer;

namespace MyModbusTool
{
    public partial class FormModnus2 : Form
    {
        //串口類對象
        private SerialPort serial;
        //計時器
        private Timer timer;
        private Thread reavThread;
        public FormModnus2()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;//跨線程檢測關閉
            InitUI();
            //初始化
            serial = new SerialPort();
            timer = new Timer();
            timer.Tick += Timer_Tick;

        }

        /// <summary>
        /// 通過線程方式去接收數據
        /// </summary>
        public void StarreavThread()
        {
            reavThread = new Thread(() =>
            {
                while (true)
                {
                    try
                    {
                        //阻塞線程,先讀一個字節
                        //沒有數據就會阻塞,直到有數據纔會執行
                        int first = serial.ReadByte();
                        int len = serial.BytesToRead;//獲取剩下緩衝區中數據的字節數。
                        byte[] left = new byte[len];
                        int nRead = serial.Read(left, 0, len);

                        //合併數據到 data
                        byte[] data= new byte[1+len];
                        data[0] = (byte)first;
                        for(int i=0;i<len;i++)
                        {
                            data[1 + i] = left[i];
                        }

                        //獲取原有的內容
                        String strText = tbxJS.Text;
                        String content = Encoding.GetEncoding("GB2312").GetString(data);
                        String time = DateTime.Now.ToString("HH:mm:ss.fff:");

                        tbxJS.Text = strText + "\r\n" + time + content;

                    }
                    catch (Exception e)
                    {
                        break;
                    }
                }
            });
            reavThread.Start();
        }



        #region 初始化UI
        /// <summary>
        /// 初始化UI
        /// </summary>
        public void InitUI()
        {
            //獲取本機的所有的串口名稱
            string[] _porNames = SerialPort.GetPortNames();
            foreach (string _porName in _porNames)
            {
                this.cbxCKMC.Items.Add(_porName);
            }
            this.cbxCKMC.SelectedIndex = 0;//默認選中第一個

            //設置波特率
            string[] baudRates = { "9600", "14400", "19200", "38400", "57600", "115200" };
            foreach (string baudRate in baudRates)
            {
                this.cbxBTL.Items.Add(baudRate);
            }
            this.cbxBTL.SelectedIndex = 0;


            //數據位
            string[] dataBits = { "8", "7", "6", "5", };
            foreach (string s in dataBits)
            {
                this.cbxSJW.Items.Add(s);
            }
            this.cbxSJW.SelectedIndex = 0;

            //奇偶校驗
            Parity[] parities = { Parity.None, Parity.Odd, Parity.Even, Parity.Mark, Parity.Space };
            foreach (Parity s in parities)
            {
                this.cbxJOJY.Items.Add(s);
            }
            this.cbxJOJY.SelectedIndex = 0;


            //停止位
            StopBits[] stopBits = { /*StopBits.None, */StopBits.One, StopBits.Two, StopBits.OnePointFive };
            foreach (StopBits s in stopBits)
            {
                this.cbxTZW.Items.Add(s);
            }
            this.cbxTZW.SelectedIndex = 0;

        }
        #endregion

        #region 打開串口
        /// <summary>
        /// 打開串口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDKCK_Click(object sender, EventArgs e)
        {
            try
            {
                if (btnDKCK.Text == "打開串口")
                {
                    string _cbxCKMC = this.cbxCKMC.SelectedItem.ToString();//窗口名稱
                    string _cbxBTL = this.cbxBTL.SelectedItem.ToString();//波特率
                    string _cbxSJW = this.cbxSJW.SelectedItem.ToString();//數據位
                    string _cbxJOJY = this.cbxJOJY.SelectedItem.ToString();//奇偶校驗
                    string _cbxTZW = cbxTZW.SelectedItem.ToString();//停止位

                    serial.PortName = _cbxCKMC;
                    serial.BaudRate = Convert.ToInt32(_cbxBTL);
                    serial.DataBits = Convert.ToInt32(_cbxSJW);
                    serial.Parity = (Parity)Enum.Parse(typeof(Parity), _cbxJOJY);
                    serial.StopBits = (StopBits)Enum.Parse(typeof(StopBits), _cbxTZW);

                    serial.Open();
                    StarreavThread();

                    groupBox1.Enabled = false;
                    btnDKCK.Text = "關閉串口";
                }
                else
                {
                    serial.Close();
                    groupBox1.Enabled = true;
                    btnDKCK.Text = "打開串口";
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        #endregion

        /// <summary>
        /// 發送
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void butFS_Click(object sender, EventArgs e)
        {
            if (serial.IsOpen)
            {
                String StrMsg = tbxFS.Text;
                byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(StrMsg);
                serial.Write(bytes, 0, bytes.Length);
            }
        }

        /// <summary>
        /// 自動發送
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBox1_CheckStateChanged(object sender, EventArgs e)
        {
            try
            {
                //如果勾選
                if (checkBox1.Checked)
                {
                    int intervaar = Convert.ToInt32(tbxFSJG.Text);//獲取間隔時間
                    timer.Interval = intervaar;
                    timer.Start();//開始執行
                }
                else
                {
                    timer.Stop();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        /// <summary>
        /// 定時器響應事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Timer_Tick(object sender, EventArgs e)
        {
            butFS_Click(null, null);
        }

        /// <summary>
        /// 窗體關閉
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormModnus_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (serial.IsOpen)
            {
                serial.Close();
            }
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章