C#NET下设计串口终端程序+示例工程

C#.NET下设计串口终端程序+示例工程

以前一直用delphi和BCB设计和串口通信有关的软件, 不过为了与时俱进,今天在网上找了找资料,写了一个C#的串口小程序供大家参考学习.

GUI的图片:

C#NET下设计串口终端程序+示例工程

功能的设定是非常简单的,为了大家修改成自己需要的模式,我删除了大部分不常用的功能留下了最最基础的代码.

通过选择串口,设定波特率,启动,发送字符,HEX格式切换等基本功能实现了串口通信的功能。

一下是基本代码,因为所有的代码我都简化和加了注释,所以相信是非常容易理解的。

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;

namespace MyUSART
{
    public partial class MainForm : Form
    {
        bool USARTstate = true;// 串口状态 true 为可以启动 false 为可以关闭
        int RxNum = 0;
        int TxNum = 0;

        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            timer1.Enabled = false;
            timer1.Interval = 50;
            try
            {
                foreach (string com in System.IO.Ports.SerialPort.GetPortNames())
                    this.comboBox1PortName.Items.Add(com);
                comboBox1PortName.SelectedIndex = 0;
                comboBox2BaudRate.SelectedIndex = 0;
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("找不到通讯串口!", "串口提示");
            }
        }

        private void button1USARTstart_Click(object sender, EventArgs e)
        {
            if(USARTstate)//默认启动
            {
                button1USARTstart.Text = "停止";
                serialPort1.PortName = comboBox1PortName.Text;
                serialPort1.BaudRate = Convert.ToInt32(comboBox2BaudRate.Text);
                try
                {
                    serialPort1.Open();
                    USARTstate = false;//可以关闭
                    comboBox1PortName.Enabled = false;
                    comboBox2BaudRate.Enabled = false;
                    timer1.Enabled = true;
                }
                catch (System.Exception ex)
                {
                	MessageBox.Show("打开串口失败!\r\n:"+ex.Message);
                }
            }
            else
            {
                button1USARTstart.Text = "启动";
                try
                {
                    serialPort1.Close();
                    USARTstate = true;//可以启动
                    comboBox1PortName.Enabled = true;
                    comboBox2BaudRate.Enabled = true;
                    timer1.Enabled = false;
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show("关闭串口失败!\r\n:"+ex.Message);               	
                }
            }
        }



        //public static string ByteArrayToHexString(byte[] data)//字节数组转为十六进制字符串
        //{
        //    StringBuilder sb = new StringBuilder(data.Length * 3);
        //    foreach (byte b in data)
        //        sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
        //    return sb.ToString().ToUpper();
        //}

        public static string ByteArrayToString(byte[] data)//字节数组转为十六进制字符串
        {
            StringBuilder sb = new StringBuilder(data.Length * 3);
            foreach (byte b in data)
                sb.Append(Convert.ToChar(b));
            //return sb.ToString().ToUpper();
            return sb.ToString();
        }

        public static byte[] HexStrToHexByte(string hexStr)
        {
            hexStr = hexStr.Replace(" ", "");//去掉字符串中所有的空格
            if (hexStr.Length % 2 != 0) hexStr += " ";
            byte[] returnBytes = new byte[hexStr.Length / 2];//新建一个byte数组,存放16进制byte
            for (int i = 0; i < returnBytes.Length; i++)
            { returnBytes[i] = Convert.ToByte(hexStr.Substring(i * 2, 2).Trim(), 16); }
            return returnBytes;
        }


        private void button2SendData_Click(object sender, EventArgs e)//发送数据
        {

            if (serialPort1.IsOpen)
            {
                if (checkBox.Checked)//send hex
                {
                    //byte[] data = Encoding.ASCII.GetBytes(textBox1Tx.Text);
                    byte[] data = HexStrToHexByte(textBox1Tx.Text);
                    //string str = ByteArrayToHexString(data);
                    serialPort1.Write(data, 0, data.Length);
                    //serialPort1.Write(str);
                    TxNum += data.Length;
                }
                else
                {
                    string str = textBox1Tx.Text.Trim();// 获得
                    serialPort1.Write(str);
                    TxNum += str.Length;
                }
                labelTxNum.Text = "TX:" + TxNum.ToString();
            }
            else
                return;
        }


        private void timer1_Tick(object sender, EventArgs e)//定时器读取接受的数据,你想要的处理都可放在这里。
        {
            if (serialPort1.IsOpen == false) return;
            int receiveNumber = serialPort1.BytesToRead;
            if (receiveNumber == 0) return;
            string str = null;
            byte[] bs = new byte[receiveNumber];

            serialPort1.Read(bs, 0, receiveNumber);

            if (checkBox.Checked)
            {                
                foreach (byte b in bs)
                    str += b.ToString("x2") + " ";
            }
            else
            {    
                str = ByteArrayToString(bs);
            }
            textBox2Rx.AppendText(str);
            RxNum += receiveNumber;
            labelRxNum.Text = "RX:" + RxNum.ToString();

        }


        private void buttonClear_Click(object sender, EventArgs e)// 清除接收的textbox中的字符
        {
            textBox2Rx.Clear();
            TxNum = 0;
            RxNum = 0;
            labelTxNum.Text = "TX:" + TxNum.ToString();
            labelRxNum.Text = "RX:" + RxNum.ToString();
        }
    }
}