1. 程式人生 > >C#製作串列埠通訊助手

C#製作串列埠通訊助手

介面:


程式碼:

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;

namespace 串列埠通訊助手
{
    public partial class Form1 : Form
    {
        SerialPort sp = new SerialPort();//建立串列埠全域性變數

        //檢測當前可用串列埠函式
        private void CheckPort()
        {
            cbxPort.Items.Clear();//清除控制元件中當前值
            bool haveCOM = false;//用於最終判斷是否有串列埠
            string[] a = SerialPort.GetPortNames();//獲取本機的所有串列埠名稱
            if (a == null)
            {
                haveCOM = false; //無可用串列埠
            }
            else
            {
                foreach (string b in a) //將串列埠名稱新增到下拉列表控制元件中
                {
                    bool excitent = false;
                    try  //開啟串列埠,測試串列埠是否可用
                    {
                        SerialPort sp = new SerialPort(b);
                        sp.Open();
                        sp.Close();
                        excitent = true;
                    }
                    catch
                    {
                        excitent = false;
                    }
                    if (excitent)
                    {
                        cbxPort.Items.Add(b);
                        haveCOM = true;
                    }
                }
            }
            if (haveCOM)
            {
                cbxPort.SelectedIndex = 0;
            }
            else
            {
                MessageBox.Show("無可用串列埠!", "錯誤提示");
            }
        }

        //設定串列埠函式
        private void SetCOM()
        {
            try
            {
                sp.PortName = cbxPort.Text.Trim();//串列埠名
                sp.BaudRate = Convert.ToInt32(cbxBaud.Text.Trim());//波特率
                if (cbxParity.Text.Trim() == "奇校驗")//奇偶校驗位
                {
                    sp.Parity = Parity.Odd;
                }
                else if (cbxParity.Text.Trim() == "偶校驗")
                {
                    sp.Parity = Parity.Even;
                }
                else
                {
                    sp.Parity = Parity.None;
                }
                if (cbxStopBits.Text.Trim() == "1.5")//停止位
                {
                    sp.StopBits = StopBits.OnePointFive;
                }
                else if (cbxStopBits.Text.Trim() == "2")
                {
                    sp.StopBits = StopBits.Two;
                }
                else
                {
                    sp.StopBits = StopBits.One;
                }
                sp.DataBits = Convert.ToInt16(cbxDataBits.Text.ToString().Trim());//資料位

                sp.Encoding = Encoding.UTF8;//設定串列埠通訊的編碼格式,預設ASCII

            }
            catch
            {

            }
        }

        //16進位制字串轉換成ASCII字串
        private string HexToASCII(string str)
        {
            try
            {
                string[] mystr1 = str.Trim().Split(' ');
                byte[] t = new byte[mystr1.Length];
                for (int i = 0; i < t.Length; i++)
                {
                    t[i] = Convert.ToByte(mystr1[i], 16);
                }
                return Encoding.UTF8.GetString(t);
            }
            catch (Exception ex)
            {
                rbtSendAscii.Select();
                MessageBox.Show("轉換失敗!" + ex.Message, "錯誤提示");
                return str;
            }
        }

        //字串轉換成16進位制字元
        private string ASCIIToHex(string str)
        {
            try
            {
                byte[] a = Encoding.UTF8.GetBytes(str.Trim());
                string mystr1 = "";
                for (int i = 0; i < a.Length; i++)
                {
                    mystr1 += a[i].ToString("X2") + " ";
                }
                return mystr1;
            }
            catch (Exception ex)
            {
                rbtSendAscii.Select();
                MessageBox.Show("轉換失敗!" + ex.Message, "錯誤提示");
                return str;
            }
        }

        //接收串列埠資料事件
        private void COMReceived(object sender,SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(100);
            this.Invoke((EventHandler)(delegate {
                try
                {
                    string mystr1 = "[接收] " + DateTime.Now.ToString("yyyyMMddHHmmssfff") + " ";
                    byte[] a = new byte[sp.BytesToRead];
                    sp.Read(a, 0, a.Length);
                    string mystr2 = Encoding.UTF8.GetString(a);
                    string b = "";
                    if (rbtReceviedHex.Checked)
                    {
                        b = ASCIIToHex(mystr2);
                    }
                    else
                    {
                        b = mystr2;
                    }
                    tbxReceivedData.Text += mystr1 + b + "\r\n";
                    statusLabel1.Text = "接收成功!";
                }
                catch
                {
                    statusLabel1.Text = "接收失敗!";
                }
            }));
        }

        //初始化視窗函式
        public Form1()
        {
            InitializeComponent();
        }

        //載入視窗函式
        private void Form1_Load(object sender, EventArgs e)
        {
            statusLabel1.Text = "";//狀態條初始化

            //設定視窗大小
            this.MaximizeBox = false;//隱藏最大化按鈕
            this.MaximumSize = this.Size;//固定視窗尺寸最大為當前尺寸
            this.MinimumSize = this.Size;//固定視窗尺寸最小為當前尺寸

            tbxSendData.Focus();//預設將游標放在傳送文字框上

            rbtReceviedAscii.Select();//預設選擇ASCII字元顯示
            rbtSendAscii.Select();//預設選擇ASCII字元顯示

            CheckPort();//檢測可用串列埠

            //初始化波特率
            cbxBaud.Items.Clear();
            cbxBaud.Items.Add("1200");
            cbxBaud.Items.Add("2400");
            cbxBaud.Items.Add("4800");
            cbxBaud.Items.Add("9600");
            cbxBaud.Items.Add("12800");
            cbxBaud.Items.Add("19200");
            cbxBaud.Items.Add("25600");
            cbxBaud.Items.Add("115200");
            cbxBaud.SelectedIndex = 5;

            //初始化校驗位
            cbxParity.Items.Clear();
            cbxParity.Items.Add("無");
            cbxParity.Items.Add("奇校驗");
            cbxParity.Items.Add("偶校驗");
            cbxParity.SelectedIndex = 0;

            //初始化停止位
            cbxStopBits.Items.Clear();
            cbxStopBits.Items.Add("1");
            cbxStopBits.Items.Add("1.5");
            cbxStopBits.Items.Add("2");
            cbxStopBits.SelectedIndex = 0;

            //初始化資料位
            cbxDataBits.Items.Clear();
            cbxDataBits.Items.Add("7");
            cbxDataBits.Items.Add("8");
            cbxDataBits.SelectedIndex = 1;

            statusLabel1.Text = "";//修改狀態條內容
        }

        //檢測串列埠按鈕事件
        private void btnCheckCOM_Click(object sender, EventArgs e)
        {
            statusLabel1.Text = "檢測串列埠開始!";
            CheckPort();
            statusLabel1.Text = "串列埠檢測完成!";
        }

        //開啟串列埠按鈕事件
        private void btnOpenCOM_Click(object sender, EventArgs e)
        {
            if (btnOpenCOM.Text == "開啟串列埠")
            {
                SetCOM();//設定串列埠函式
                if (sp.IsOpen)
                {
                    statusLabel1.Text = "串列埠"+cbxPort.Text+"已開啟!";
                }
                else
                {
                    try
                    {
                        sp.Open(); //開啟串列埠
                        //禁用設定控制元件
                        btnCheckCOM.Enabled = false;
                        cbxPort.Enabled = false;
                        cbxBaud.Enabled = false;
                        cbxParity.Enabled = false;
                        cbxStopBits.Enabled = false;
                        cbxDataBits.Enabled = false;
                        btnOpenCOM.Text = "關閉串列埠";
                        statusLabel1.Text = "串列埠" + cbxPort.Text + "開啟成功!";
                        sp.DataReceived += new SerialDataReceivedEventHandler(COMReceived);//定義串列埠接收事件
                    }
                    catch(Exception ex)
                    {
                        MessageBox.Show("串列埠"+cbxPort.Text+"開啟失敗,失敗原因:"+ex.Message,"錯誤提示");
                        statusLabel1.Text = "串列埠" + cbxPort.Text + "開啟失敗,失敗原因:" + ex.Message;
                    }
                }
            }
            else //關閉串列埠
            {
                if (sp.IsOpen) //判斷串列埠是否開啟
                {
                    try
                    {
                        sp.Close(); //關閉串列埠
                        //啟用設定控制元件
                        btnCheckCOM.Enabled = true;
                        cbxPort.Enabled = true;
                        cbxBaud.Enabled = true;
                        cbxParity.Enabled = true;
                        cbxStopBits.Enabled = true;
                        cbxDataBits.Enabled = true;
                        btnOpenCOM.Text = "開啟串列埠";
                        statusLabel1.Text = "串列埠" + cbxPort.Text + "關閉成功!";
                    }
                    catch(Exception ex)
                    {
                        MessageBox.Show("串列埠"+ cbxPort.Text + "關閉失敗,錯誤提示:"+ex.Message,"錯誤提示");
                        statusLabel1.Text = "串列埠" + cbxPort.Text + "關閉失敗,錯誤提示:" + ex.Message;
                    }
                }
                else
                {
                    btnCheckCOM.Enabled = true;
                    cbxPort.Enabled = true;
                    cbxBaud.Enabled = true;
                    cbxParity.Enabled = true;
                    cbxStopBits.Enabled = true;
                    cbxDataBits.Enabled = true;
                    btnOpenCOM.Text = "開啟串列埠";
                    statusLabel1.Text = "串列埠未開啟,無法關閉!";
                    MessageBox.Show("串列埠未開啟,無法關閉!","錯誤提示");
                }
            }
        }

        //清除按鈕事件
        private void btnClear_Click(object sender, EventArgs e)
        {
            tbxReceivedData.Text = "";
            tbxSendData.Text = "";
        }

        private void rbtSendAscii_CheckedChanged(object sender, EventArgs e)
        {
            if (rbtSendAscii.Checked)
            {
                tbxSendData.Text= HexToASCII(tbxSendData.Text); 
            }
        }

        private void rbtSendHex_CheckedChanged(object sender, EventArgs e)
        {
            if (rbtSendHex.Checked)
            {
                tbxSendData.Text = ASCIIToHex(tbxSendData.Text.ToString());
            } 
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            try
            {
                string mystr1 = tbxSendData.Text;
                if (rbtSendHex.Checked)
                {
                    mystr1 = HexToASCII(tbxSendData.Text);
                }
                byte[] a = Encoding.UTF8.GetBytes(mystr1);
                string mystr2 = Encoding.UTF8.GetString(a);
                sp.Write(mystr2);
                tbxReceivedData.Text += "[傳送] " + DateTime.Now.ToString("yyyyMMddHHmmssfff") + " " + tbxSendData.Text + "\r\n";
                statusLabel1.Text = "傳送成功!";
            }
            catch
            {
                statusLabel1.Text = "傳送失敗";
            }
            
        }
    }
}