基本信息
源码名称:串口通信示例
源码大小:0.01M
文件格式:.rar
开发语言:C#
更新时间:2019-03-13
   源码介绍


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Text.RegularExpressions;

namespace SerialPortDemo
{
    public partial class Form1 : Form
    {
        private SerialPort spCom = new SerialPort();
        private StringBuilder strBuilderRx = new StringBuilder();
        private Timer timerAutoSend = new Timer();
        private long nCountRx = 0;
        private long nCountTx = 0;
        private string strFn;

        public Form1()
        {
            InitializeComponent();
        }

        private void SerialPortForm_Load(object sender, EventArgs e)
        {
            string[] straPorts = SerialPort.GetPortNames();
            Array.Sort(straPorts);
            comboPortName.Items.AddRange(straPorts);
            comboPortName.SelectedIndex = comboPortName.Items.Count > 0 ? 0 : -1;
            comboBaudRate.SelectedIndex = comboBaudRate.Items.IndexOf("9600");
            comboParity.SelectedIndex = comboParity.Items.IndexOf("None");
            comboDataBits.SelectedIndex = comboDataBits.Items.IndexOf("8");
            comboStopBits.SelectedIndex = comboStopBits.Items.IndexOf("1");

            spCom.NewLine = "\r\n";
            spCom.RtsEnable = true;

            buttonSend.Enabled = false;
            checkBoxAutoSend.Enabled = false;
            checkBoxNewLineRx.CheckState = CheckState.Checked;
            buttonSendFile.Enabled = false;

            comboPortName.Enabled = true;
            comboBaudRate.Enabled = true;
            comboParity.Enabled = true;
            comboDataBits.Enabled = true;
            comboStopBits.Enabled = true;

            textBoxTx.Text = "COM";
            textBoxTimerMs.Text = "1000";

            spCom.DataReceived  = new SerialDataReceivedEventHandler(Com_DataReceived);
            timerAutoSend.Tick  = new EventHandler(AutoSendTimer_Tick);
        }

        void AutoSendTimer_Tick(object sender, EventArgs e)
        {
            buttonSend_Click(sender, e);
        }

        void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int nReadSum = spCom.BytesToRead;
            nCountRx  = nReadSum;

            byte[] byteaBuf = new byte[nReadSum];
            spCom.Read(byteaBuf, 0, nReadSum);

            strBuilderRx.Clear();

            //因为要访问ui资源,所以需要使用invoke方式同步ui
            this.Invoke((EventHandler)(delegate
            {

                if (checkBoxHexView.Checked)
                {
                    foreach (byte byteBit in byteaBuf)
                    {
                        strBuilderRx.Append(byteBit.ToString("X2")   " ");
                    }
                }
                else
                {
                    strBuilderRx.Append(Encoding.ASCII.GetString(byteaBuf));
                }

                this.textBoxRx.AppendText(strBuilderRx.ToString());
                labelSumRx.Text = "Get:"   nCountRx.ToString();
            }));
        }

        private void buttonOpen_Click(object sender, EventArgs e)
        {
            if (spCom.IsOpen)
            {
                spCom.Close();
            }
            else
            {
                spCom.PortName = comboPortName.Text;
                spCom.BaudRate = int.Parse(comboBaudRate.Text);

                switch (comboParity.Text)
                {
                    case "None":
                        spCom.Parity = Parity.None;
                        break;
                    case "Odd":
                        spCom.Parity = Parity.Odd;
                        break;
                    case "Even":
                        spCom.Parity = Parity.Even;
                        break;
                    case "Mark":
                        spCom.Parity = Parity.Mark;
                        break;
                    case "Space":
                        spCom.Parity = Parity.Space;
                        break;
                    default:
                        spCom.Parity = Parity.None;
                        break;
                }

                spCom.DataBits = int.Parse(comboDataBits.Text);

                switch (comboStopBits.Text)
                {
                    case "1":
                        spCom.StopBits = StopBits.One;
                        break;
                    case "1.5":
                        spCom.StopBits = StopBits.OnePointFive;
                        break;
                    case "2":
                        spCom.StopBits = StopBits.Two;
                        break;
                    default:
                        spCom.StopBits = StopBits.One;
                        break;
                }

                try
                {
                    spCom.Open();
                }
                catch (System.Exception ex)
                {
                    spCom = new SerialPort();
                    MessageBox.Show(ex.Message);
                }
            }
            buttonOpen.Text = spCom.IsOpen ? "Close" : "Open";
            buttonSend.Enabled = spCom.IsOpen;
            checkBoxAutoSend.Enabled = spCom.IsOpen;
            buttonSendFile.Enabled = spCom.IsOpen;

            comboPortName.Enabled = !spCom.IsOpen;
            comboBaudRate.Enabled = !spCom.IsOpen;
            comboParity.Enabled = !spCom.IsOpen;
            comboDataBits.Enabled = !spCom.IsOpen;
            comboStopBits.Enabled = !spCom.IsOpen;
        }

        private void checkBoxNewLineRx_CheckedChanged(object sender, EventArgs e)
        {
            textBoxRx.WordWrap = checkBoxNewLineRx.Checked;
        }

        private void buttonSend_Click(object sender, EventArgs e)
        {
            int nSendSum = 0;
            if (checkBoxHexSend.Checked)
            {
                MatchCollection mc = Regex.Matches(textBoxTx.Text, @"(?i)[\da-f]{2}");
                List<byte> buf = new List<byte>();
                foreach (Match m in mc)
                {
                    buf.Add(byte.Parse(m.Value));
                }

                spCom.Write(buf.ToArray(), 0, buf.Count);

                nSendSum = buf.Count;

            }
            else
            {
                if (checkBoxNewLineTx.Checked)
                {
                    spCom.WriteLine(textBoxTx.Text);
                    nSendSum = textBoxTx.Text.Length   2;
                }
                else
                {
                    spCom.Write(textBoxTx.Text);
                    nSendSum = textBoxTx.Text.Length;
                }
            }
            nCountTx  = nSendSum;
            labelSumTx.Text = "Send:"   nCountTx.ToString();
        }

        private void buttonReset_Click(object sender, EventArgs e)
        {
            nCountTx = nCountRx = 0;
            labelSumRx.Text = "Get:0";
            labelSumTx.Text = "Send:0";

            checkBoxHexView.CheckState = CheckState.Unchecked;
            checkBoxNewLineRx.CheckState = CheckState.Checked;
            checkBoxHexSend.CheckState = CheckState.Unchecked;
            checkBoxNewLineTx.CheckState = CheckState.Unchecked;
            checkBoxAutoSend.CheckState = CheckState.Unchecked;

            textBoxRx.Clear();
            textBoxTx.Clear();
        }

        private void buttonZeroCount_Click(object sender, EventArgs e)
        {
            nCountTx = nCountRx = 0;
            labelSumTx.Text = "Send:"   nCountTx.ToString();
            labelSumRx.Text = "Get:"   nCountRx.ToString();
        }

        private void buttonClearRx_Click(object sender, EventArgs e)
        {
            textBoxRx.Clear();
        }

        private void AutoSend(object sender, EventArgs e)
        {
            if (checkBoxAutoSend.Checked == true)
            {
                timerAutoSend.Interval = Convert.ToInt32(textBoxTimerMs.Text, 10);
                timerAutoSend.Start();
            }
            else
            {
                timerAutoSend.Stop();
            }
        }

        private void Timer_ms_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8)
            {
                e.Handled = true;
            }
        }

        private void buttonSaveRx_Click(object sender, EventArgs e)
        {
            if (dlgSaveFile.ShowDialog() == DialogResult.OK)
            {
                strFn = dlgSaveFile.FileName;
                try
                {
                    File.WriteAllText(strFn, textBoxRx.Text);
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message, "SerialPort Tool error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }

        private void buttonClearTx_Click(object sender, EventArgs e)
        {
            textBoxTx.Clear();
        }

        private void buttonSendFile_Click(object sender, EventArgs e)
        {
            if (dlgOpenFile.ShowDialog() == DialogResult.OK)
            {
                strFn = dlgOpenFile.FileName;
                try
                {
                    spCom.Write(File.ReadAllText(strFn));
                    nCountTx  = File.ReadAllText(strFn).Length;
                    labelSumTx.Text = "Send:"   nCountTx.ToString();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.Message, "SerialPort Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }
    }
}