c# winform讀取及發送串口信號


請參考C#的API文檔:https://docs.microsoft.com/zh-cn/dotnet/api/system.io.ports.serialport?redirectedfrom=MSDN&view=netframework-4.5

 

通過串口讀寫數據,非常簡單,只需要將控制拉到窗口位置即可,就可以在窗口的下方查看到串口控件的圖標,點擊圖標,按下F4即可查看該串品的詳細屬性

也可以通過在代碼中創建一個串口類,並在代碼中直接操作串口收發數據

其中包括比較基礎的端口名稱、波特率、數據位、停止位、檢驗位等五個參數

也有只需要指定端口名稱即可,其他參數保持默認

 

知識點:向串口發送數據並獲取數據
只需要將serialPort加入至窗口中,並且指定其中的端口名及波特率,指定串口數據回應事件即可(DataReceived事件) 然后在窗口加載事件中,將serialPort打開即可 1,直接使用serialPort.writeLine方法即可將數據發送至端口 2,已為serialPort指定了數據回應事件,當有數據從串口中返回,事件即會響應

 

 


 

示例項目

系統啟動三個后台線程,

一個線程對應到更新當前時間

一個線程定時發送AA1086至串口7,並從串口7獲得返回的數據

一個線程定時獲取串口1的數據(修改為不需要后台線程)

 

示例代碼

兩個基礎類,線程及定時,存放在Common文件夾中

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;

namespace MES_MonitoringClient.Common
{
    /// <summary>
    /// 多線程任務
    /// </summary>
    public class ThreadHandler
    {
        //
        Thread _TThread = null;

        //默認后台運行
        private const bool default_isBackground = true;

        //默認不自動運行
        private const bool default_autoRun = false;




        public ThreadHandler(System.Threading.ThreadStart startFunction) : this(startFunction, default_isBackground, default_autoRun)
        { }

        public ThreadHandler(System.Threading.ThreadStart startFunction, bool isBackground) : this(startFunction, isBackground, default_autoRun)
        { }        

        /// <summary>
        /// 創建線程
        /// </summary>
        /// <param name="startFunction">運行方法</param>
        /// <param name="isBackground">是否后台運行</param>
        /// <param name="autoRun">是否自動運行</param>
        public ThreadHandler(System.Threading.ThreadStart startFunction, bool isBackground, bool autoRun)
        {
            _TThread = new Thread(startFunction);

            //是否后台運行
            _TThread.IsBackground = isBackground;

            //自動運行線程
            if (autoRun)
            {
                _TThread.Start();
            }
        }




        /// <summary>
        /// 開始線程
        /// </summary>
        public void ThreadStart()
        {
            _TThread.Start();
        }

        /// <summary>
        /// 查看線程執行狀態
        /// </summary>
        /// <returns></returns>
        public bool ThreadIsAlive()
        {
            return _TThread.IsAlive;
        }

        /// <summary>
        /// 查看線程
        /// 前后台執行
        /// </summary>
        /// <returns></returns>
        public string ThreadState()
        {
            return _TThread.ThreadState.ToString();
        }

        /// <summary>
        /// 當前線程唯一托管標識符
        /// </summary>
        /// <returns></returns>
        public int ThreadManagedThreadId()
        {
            return _TThread.ManagedThreadId;
        }

        /// <summary>
        /// 等待線程結束
        /// </summary>
        public void ThreadJoin()
        {
            _TThread.Join();
        }
    }
}
ThreadHandler
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;



namespace MES_MonitoringClient.Common
{
    /// <summary>
    /// 定時器幫助類
    /// 創建定時器=》開始執行任務
    /// </summary>
    public class TimmerHandler
    {
        //定時器
        System.Timers.Timer _TTimer = null;

        //定時器默認執行一次
        private const bool default_autoReset = false;

        //定時器默認一秒執行一次
        private const int default_interval = 1000;

        //定時器創建后即刻運行
        private const bool default_autoRun = false;



        public TimmerHandler(System.Timers.ElapsedEventHandler elapseEvent) : this(default_interval, elapseEvent, default_autoRun)
        { }

        public TimmerHandler(System.Timers.ElapsedEventHandler elapseEvent, bool autoRun) : this(default_interval, elapseEvent, autoRun)
        { }

        public TimmerHandler(int interval, System.Timers.ElapsedEventHandler elapseEvent, bool autoRun) : this(interval, default_autoReset, elapseEvent, autoRun)
        { }

        /// <summary>
        /// 創建定時器
        /// </summary>
        /// <param name="interval">間隔時間(ms)</param>
        /// <param name="autoReset">是否重復執行</param>
        /// <param name="elapseEvent">定時事件</param>
        /// <param name="autoRun">是否自動運行</param>
        public TimmerHandler(int interval, bool autoReset, System.Timers.ElapsedEventHandler elapseEvent, bool autoRun)
        {
            _TTimer = new System.Timers.Timer();

            //時間間隔            
            _TTimer.Interval = interval;

            //是否重復執行
            _TTimer.AutoReset = autoReset;

            //定時器處理事件
            _TTimer.Elapsed += elapseEvent;

            //定時器自動運行
            if (autoRun)
            {
                _TTimer.Start();
            }
        }




        /// <summary>
        /// 定時器是否可用
        /// </summary>
        /// <returns></returns>
        public bool GetTimmerEnable()
        {
            return _TTimer.Enabled;
        }

        /// <summary>
        /// 開始定時器任務
        /// </summary>
        public void StartTimmer()
        {
            _TTimer.Start();
        }

        /// <summary>
        /// 關閉定時器任務
        /// </summary>
        public void StopTimmer()
        {
            _TTimer.Stop();
        }

        /// <summary>
        /// 刪除定時器
        /// </summary>
        public void RemoveTimmer()
        {
            _TTimer.Stop();
            _TTimer.Dispose();
        }
    }
}
TimmerHandler

 

最后是窗體的代碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Threading;
using System.Diagnostics;

namespace MES_MonitoringClient
{
    public partial class frmMain : Form
    {

        /*---------------------------------------------------------------------------------------*/
        //發送信號數量
        static int sendDataCount = 0;
        //接收信號數量
        static int receviedDataCount = 0;
        //發送信號錯誤數量
        static int sendDataErrorCount = 0;
        //接收信號錯誤數量
        static int receviedDataErrorCount = 0;

        //向串口7發送的默認信號
        static string mc_DefaultSignal = "AA1086";

        //必須的串口端口
        static string[] mc_DefaultRequiredSerialPortName = new string[] { "COM1", "COM7" };

        //三個后台線程
        static Common.ThreadHandler DateTimeThreadHandler = null;
        static Common.ThreadHandler SerialPort1ThreadHandler = null;
        static Common.ThreadHandler SerialPort7ThreadHandler = null;


        /*---------------------------------------------------------------------------------------*/
        //后台線程變量
        Thread timerThread = null;

        //定時器變量
        System.Timers.Timer TTimer;


        /*主窗口方法*/
        /*---------------------------------------------------------------------------------------*/

        public frmMain()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 主窗口加載事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmMain_Load(object sender, EventArgs e)
        {
            try
            {
                var sw = Stopwatch.StartNew();
                //檢測端口


                //打開端口
                serialPort7.Open();
                serialPort1.Open();

                //開始后台進程
                DateTimeThreadHandler = new Common.ThreadHandler(new ThreadStart(DateTimeTimer), true, true);
                //SerialPort1ThreadHandler = new Common.ThreadHandler(new ThreadStart(GetRFIDDataTimer), true, true);
                SerialPort7ThreadHandler = new Common.ThreadHandler(new ThreadStart(SendDataToSerialPortTimer), true, true);

                label2.Text = DateTimeThreadHandler.ThreadState();

                //MessageBox.Show("初始化共使用" + sw.ElapsedMilliseconds.ToString() + "毫秒");
                
                sw.Stop();
            }
            catch (Exception ex)
            {
                ShowErrorMessage(ex.Message, "系統初始化");
            }
        }

        /// <summary>
        /// 主窗口關閉中事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            DateTimeThreadHandler.ThreadJoin();
            //SerialPort1ThreadHandler.ThreadJoin();
            SerialPort7ThreadHandler.ThreadJoin();


            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
            }
            if (serialPort7.IsOpen)
            {
                serialPort7.Close();
            }
        }

        /*定時器方法*/
        /*---------------------------------------------------------------------------------------*/

        /// <summary>
        /// 顯示時間定時器
        /// </summary>
        private void DateTimeTimer()
        {            
            Common.TimmerHandler TTimerClass = new Common.TimmerHandler(1000, true, (o, a) => {
                SetDateTime();
            }, true);
        }

        /// <summary>
        /// 獲取串口1RFID定時器
        /// </summary>
        private void GetRFIDDataTimer()
        {
            Common.TimmerHandler TTimerClass = new Common.TimmerHandler(1000, true, (o, a) => {
                GetRFIDData(mc_DefaultSignal);
            }, true);
        }

        /// <summary>
        /// 發送AA1086至串口7定時器
        /// </summary>
        private void SendDataToSerialPortTimer()
        {
            Common.TimmerHandler TTimerClass = new Common.TimmerHandler(1000, true, (o, a) => {
                SendDataToSerialPort(mc_DefaultSignal);
            }, true);
        }

        /*定時器委托*/
        /*---------------------------------------------------------------------------------------*/

        /// <summary>
        /// 聲明顯示當前時間委托
        /// </summary>
        private delegate void SetDateTimeDelegate();
        private void SetDateTime()
        {
            if (this.InvokeRequired)
            {
                try
                {
                    this.Invoke(new SetDateTimeDelegate(SetDateTime));
                }
                catch (Exception ex)
                {
                    //響鈴並顯示異常給用戶
                    System.Media.SystemSounds.Beep.Play();
                }
            }
            else
            {
                try
                {
                    label1.Text = string.Format("當前時間:" + DateTime.Now);
                }
                catch (Exception ex)
                {
                    //響鈴並顯示異常給用戶
                    System.Media.SystemSounds.Beep.Play();
                }
            }
        }

        /// <summary>
        /// 聲明發送數據至串口委托
        /// </summary>
        /// <param name="defaultSignal"></param>
        private delegate void SendDataToSerialPortDelegate(string defaultSignal);
        private void SendDataToSerialPort(string defaultSignal)
        {
            if (this.InvokeRequired)
            {
                SendDataToSerialPortDelegate sendDataToSerialPortDelegate = SendDataToSerialPort;
                try
                {
                    this.Invoke(sendDataToSerialPortDelegate, new object[] { defaultSignal });
                }
                catch (Exception ex)
                {
                    //響鈴並顯示異常給用戶
                    System.Media.SystemSounds.Beep.Play();
                }
            }
            else
            {
                try
                {
                    if (serialPort7.IsOpen)
                    {
                        serialPort7.WriteLine(defaultSignal);
                        sendDataCount += 1;
                        //lab_SendDataCount.Text = "發送成功:" + sendDataCount;
                    }
                }
                catch (Exception ex)
                {
                    sendDataErrorCount += 1;
                    //lab_SendDataErrorCount.Text = "發送錯誤:" + sendDataErrorCount;

                    //響鈴並顯示異常給用戶
                    System.Media.SystemSounds.Beep.Play();
                }
            }
        }

        /// <summary>
        /// 聲明獲取RFID串口委托
        /// </summary>
        /// <param name="defaultSignal"></param>
        private delegate void GetRFIDDataDelegate(string defaultSignal);
        private void GetRFIDData(string defaultSignal)
        {
            if (this.InvokeRequired)
            {
                GetRFIDDataDelegate getRFIDDataDelegate = GetRFIDData;
                try
                {
                    this.Invoke(getRFIDDataDelegate, new object[] { defaultSignal });
                }
                catch (Exception ex)
                {
                    //響鈴並顯示異常給用戶
                    System.Media.SystemSounds.Beep.Play();
                }
            }
            else
            {
                try
                {
                    if (serialPort7.IsOpen)
                    {
                        serialPort7.WriteLine(defaultSignal);
                        sendDataCount += 1;
                        //lab_SendDataCount.Text = "發送成功:" + sendDataCount;
                    }
                }
                catch (Exception ex)
                {
                    sendDataErrorCount += 1;
                    //lab_SendDataErrorCount.Text = "發送錯誤:" + sendDataErrorCount;

                    //響鈴並顯示異常給用戶
                    System.Media.SystemSounds.Beep.Play();
                }
            }
        }

        /*窗口公共方法*/
        /*---------------------------------------------------------------------------------------*/

        /// <summary>
        /// 顯示系統錯誤信息
        /// </summary>
        /// <param name="errorTitle">錯誤標題</param>
        /// <param name="errorMessage">錯誤</param>
        private void ShowErrorMessage(string errorTitle,string errorMessage)
        {
            MessageBox.Show(errorMessage, errorTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        /*獲取串口數據事件*/
        /*---------------------------------------------------------------------------------------*/

        /// <summary>
        /// 串口7獲取數據
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void serialPort7_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            {
                System.IO.Ports.SerialPort COM = (System.IO.Ports.SerialPort)sender;
                //因為要訪問UI資源,所以需要使用invoke方式同步ui
                this.Invoke((EventHandler)(delegate
                {
                    receviedDataCount += 1;
                    //lab_ReceviedDataCount.Text = "接收成功:" + receviedDataCount;

                    richTextBox1.AppendText(COM.ReadLine() + "\r");
                }
                   )
                );
            }
            catch (Exception ex)
            {
                //響鈴並顯示異常給用戶
                System.Media.SystemSounds.Beep.Play();
            }
        }       

        /// <summary>
        /// 串口1獲取數據
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            {
                System.IO.Ports.SerialPort COM = (System.IO.Ports.SerialPort)sender;
                //因為要訪問UI資源,所以需要使用invoke方式同步ui
                this.Invoke((EventHandler)(delegate
                {
                    richTextBox2.AppendText(COM.ReadLine() + "\r");
                }
                   )
                );
            }
            catch (Exception ex)
            {
                ShowErrorMessage("serialPort1_DataReceived", "RFID串口獲取數據時出錯");
                //響鈴並顯示異常給用戶
                System.Media.SystemSounds.Beep.Play();
            }
        }

        private void serialPort1_ErrorReceived(object sender, System.IO.Ports.SerialErrorReceivedEventArgs e)
        {
            ShowErrorMessage("serialPort1_ErrorReceived", "RFID串口獲取數據出錯");
        }
    }
}
frmMain

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM