首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-10-21 
C#.NET下设计串口终端程序+示例工程以前一直用delphi和BCB设计和串口通信有关的软件, 不过为了与时俱进,今

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();        }    }}



热点排行