在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C#串口通信调试工具源码下载

C#串口通信调试工具源码下载

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.09M
  • 下载次数:51
  • 浏览次数:635
  • 发布时间:2016-06-13
  • 实例类别:C#语言基础
  • 发 布 人:STEVENYANG
  • 文件格式:.zip
  • 所需积分:2
 相关标签: C# 串口 通信 调试

实例介绍

【实例简介】

【实例截图】

【核心代码】

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

namespace RS232
{

    public partial class fclsRS232Tester : Form
    {
        // Various colors for logging info
        private Color[] MsgTypeColor = { Color.Blue, Color.Green, Color.Black, Color.Orange, Color.Red };

        string InputData = String.Empty;
        BackgroundWorker background_Send = new BackgroundWorker();

        /// <summary> Convert a string of hex digits (ex: E4 CA B2) to a byte array. </summary>
        /// <param name="s"> The string containing the hex digits (with or without spaces). </param>
        /// <returns> Returns an array of bytes. </returns>
        private byte[] HexStringToByteArray(string s)
        {
            s = s.Replace(" ", "");
            byte[] buffer = new byte[s.Length / 2];
            for (int i = 0; i < s.Length; i  = 2)
                buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
            return buffer;
        }

        /// <summary> Converts an array of bytes into a formatted string of hex digits (ex: E4 CA B2)</summary>
        /// <param name="data"> The array of bytes to be translated into a string of hex digits. </param>
        /// <returns> Returns a well formatted string of hex digits with spacing. </returns>
        private 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();
        }

        private byte[] intToByte(int i)
        {
            byte[] abyte0 = new byte[4];
            abyte0[0] = (byte)((0xff000000 & i) >> 24);
            abyte0[1] = (byte)((0xff0000 & i) >> 16);
            abyte0[2] = (byte)((0xff00 & i) >> 8);
            abyte0[3] = (byte)(0xff & i);
            return abyte0;
        }

        public byte[] shortToByte(int i)
        {
            byte[] abyte0 = new byte[2];
            abyte0[0] = (byte)((0xff00 & i) >> 8);
            abyte0[1] = (byte)(0xff & i);
            return abyte0;
        }

        public fclsRS232Tester()
        {
            InitializeComponent();

            cmbParity.Items.Clear();
            cmbParity.Items.AddRange(Enum.GetNames(typeof(Parity)));
            cmbStopBits.Items.Clear();
            cmbStopBits.Items.AddRange(Enum.GetNames(typeof(StopBits)));

            cmbStopBits.SelectedIndex = cmbStopBits.Items.IndexOf("One");
            cmbDataBits.SelectedIndex = cmbDataBits.Items.IndexOf("8");
            cmbParity.SelectedIndex = cmbParity.Items.IndexOf("None");
            cmbBaudRate.SelectedIndex = cmbBaudRate.Items.IndexOf("19200");

            //初始化下拉串口名称列表框
            cmbPortName.Items.Clear();
            foreach (string s in SerialPort.GetPortNames())
                cmbPortName.Items.Add(s); ;

            if (cmbPortName.Items.Count > 0)
                cmbPortName.SelectedIndex = 0;
            //else
            //{
            //    MessageBox.Show(this, "There are no COM Ports detected on this computer.\nPlease install a COM Port and restart this app.", "No COM Ports Installed", MessageBoxButtons.OK, MessageBoxIcon.Error);
            //    this.Close();
            //}

            cbomode.Items.Add("固定");
            cbomode.Items.Add("自增");
            cbomode.Items.Add("自减");
            cbomode.SelectedIndex = 0;

            background_Send.WorkerSupportsCancellation = true;
            background_Send.DoWork  = new DoWorkEventHandler(background_Send_DoWork);
            background_Send.RunWorkerCompleted  = new RunWorkerCompletedEventHandler(background_Send_RunWorkerCompleted);
        }

        private void Disablecontrol()
        {
            cmbPortName.Enabled = false;
            cmbBaudRate.Enabled = false;
            cmbDataBits.Enabled = false;
            cmbStopBits.Enabled = false;
            cmbParity.Enabled = false;
        }

        private void Enablecontrol()
        {
            cmbPortName.Enabled = true;
            cmbBaudRate.Enabled = true;
            cmbDataBits.Enabled = true;
            cmbStopBits.Enabled = true;
            cmbParity.Enabled = true;
        }

        // <summary>
        /// 串口初始化函数
        /// </summary>
        private void btnOpen_Click(object sender, EventArgs e)
        {

            if (btnOpen.Text == "打开串口")
            {
                if (cmbPortName.Text.Trim() == "")
                {
                    MessageBox.Show("COM Port cann't empty!", "RS232 tester", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                // try to open the selected port:
                try
                {
                   // If the port is open, close it.
                    if (port.IsOpen)
                        port.Close();
                    else
                    {
                        // Set the port's settings
                        port.BaudRate = int.Parse(cmbBaudRate.Text);
                        port.DataBits = int.Parse(cmbDataBits.Text);
                        port.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text);
                        port.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text);
                        port.PortName = cmbPortName.Text;
                        // Open the port
                        port.Open();
                        this.Disablecontrol();
                        stsStatus.Text = port.PortName   ": is Opened!" ;
                        btnOpen.Text = "关闭串口";
                    }             
                }
                
                // give a message, if the port is not available:
                catch
                {
                    MessageBox.Show("Serial port "   port.PortName   " cannot be opened!", "RS232 tester", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    cmbPortName.SelectedText = "";
                    stsStatus.Text = "Select serial port!";
                }
            }
            else
            {
                try
                {
                    if (port.IsOpen) port.Close();
                    this.Enablecontrol();
                    stsStatus.Text = port.PortName   ": 已关闭";
                    btnOpen.Text = "打开串口";
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

        }

        private void SendData(string str)
        {
            try
            {
                if (!port.IsOpen)//判断串口是否打开
                {
                    MessageBox.Show("Serial port is closed!", "RS232 tester", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                string sendstr = (chkpx.Checked) ? '\r'   str   '\n' : str;
                if (chkhex.Checked)
                {
                    byte[] data = HexStringToByteArray(sendstr);
                    port.Write(data, 0, data.Length);
                    txtOut.Text = strtohex(sendstr);
                }
                else
                {
                    byte[] data = System.Text.Encoding.ASCII.GetBytes(sendstr);
                    port.Write(data, 0, data.Length);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        string sendbuf;
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (btnSend.Text.Equals("停止发送"))
            {
                timer1.Enabled = false;
                btnSend.Text = "发送";
                sendbuf = "";
                return;
            }

            if (chkauto.Checked)
            {
                sendbuf = txtOut.Text;
                timer1.Interval = int.Parse(txtimes.Text);
                timer1.Enabled = true;
                btnSend.Text = "停止发送";
            }
            else
            {
                string temp = txtOut.Text;                
                SendData(temp);
                switch (cbomode.SelectedIndex)
                {
                    case 0:
                        temp = txtOut.Text;
                        break;
                    case 1:
                        temp = strinc(txtOut.Text, 10);
                        break;
                    case 2:
                        temp = strdec(txtOut.Text, 10);
                        break;
                }
                txtOut.Text = temp;
            }
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            txtMsg.Clear();
        }

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string dataRe = "";
            byte[] byteRead = new byte[port.BytesToRead];
            port.Read(byteRead, 0, byteRead.Length);
            dataRe= System.Text.Encoding.ASCII.GetString(byteRead);
            SetText(dataRe);

        }

        private void SetText(String data)
        {
            if (data == null) return;

            txtMsg.Invoke(new EventHandler(delegate
            {
                txtMsg.SelectedText = string.Empty;
                txtMsg.SelectionFont = new Font(txtMsg.SelectionFont, FontStyle.Bold);
                if (chkenter.Checked)
                    txtMsg.AppendText(data   "\r\n");
                else
                    txtMsg.AppendText(data);
                txtMsg.Select();//让RichTextBox获得焦点   
                txtMsg.Select(txtMsg.TextLength, 0);//将插入符号置于文本结束处   
                txtMsg.ScrollToCaret();
            }));
        }

        private void background_Send_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                string temp = sendbuf;               
                SendData(temp);
                switch (cbomode.SelectedIndex)
                {
                    case 0:
                        temp = sendbuf;
                        break;
                    case 1:
                        temp = strinc(sendbuf, 10);
                        break;
                    case 2:
                        temp = strdec(sendbuf, 10);
                        break;
                }
                sendbuf = temp;
                 
            }
            catch (System.IO.IOException ex)//读取失败
            {
                stsStatus.Text = ex.Message;
                e.Cancel = true;
                return;
            }
            catch (Exception ex)
            {
                stsStatus.Text = ex.Message;
                e.Cancel = true;
                return;
            }
        }

        private void background_Send_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                return;
            }
        }


        private void timer1_Tick(object sender, EventArgs e)
        {
            if (!background_Send.IsBusy)
            {
                background_Send.RunWorkerAsync();
            }
        }

        private void chkauto_CheckedChanged(object sender, EventArgs e)
        {
            txtimes.Enabled = chkauto.Checked;
        }

        #region string function
        /// <summary>
        /// Char转ASCII
        /// </summary>
        /// <param name="character"></param>
        /// <returns></returns>
        public static int Asc(string character)
        {
            if (character.Length == 1)
            {
                System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
                int intAsciiCode = (int)asciiEncoding.GetBytes(character)[0];
                return (intAsciiCode);
            }
            else
            {
                throw new Exception("Character is not valid.");
            }

        }
        /// <summary>
        /// ASCII码转Char
        /// </summary>
        /// <param name="asciiCode"></param>
        /// <returns></returns>
        public static string Chr(int asciiCode)
        {
            if (asciiCode >= 0 && asciiCode <= 255)
            {
                System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
                byte[] byteArray = new byte[] { (byte)asciiCode };
                string strCharacter = asciiEncoding.GetString(byteArray);
                return (strCharacter);
            }
            else
            {
                throw new Exception("ASCII Code is not valid.");
            }
        }
        /// <summary>
        /// 字符串加1函数
        /// </summary>
        /// <param name="s1"></param>
        /// <param name="hex"></param>
        /// <returns></returns>
        public static string strinc(string s1, int hex)
        {
            string str, newstr;
            int index = 0;
            int newInt;
            str = s1.Trim().Replace(" ", "");
            str = str.ToUpper();
            if (hex == 10)
            {
                for (int i = str.Length - 1; i > 0; i--)
                {
                    if (str[i] != (char)57)
                    {
                        index = i;
                        break;
                    }
                }
                newInt = Convert.ToInt32(str.Substring(index))   1;
                str = str.Substring(0, index)   newInt.ToString();
            }
            else if (hex == 16)
            {
                newstr = "";
                for (int i = str.Length - 1; i > 0; i--)
                {
                    if (str[i] == (char)57)
                    {
                        newstr = "A";
                        index = i;
                        break;
                    }
                    else if (str[i] != (char)70)
                    {
                        newstr = Chr(Asc(str.Substring(i, 1))   1);
                        index = i;
                        break;
                    }
                }
                str = str.Substring(0, index)   newstr   str.Substring(index   1).Replace("F", "0");
            }

            return str;
        }        
        /// <summary>
        /// 字符串减1函数
        /// </summary>
        /// <param name="s1"></param>
        /// <param name="hex"></param>
        /// <returns></returns>
        public static string strdec(string s1, int hex)
        {
            string str, newstr;
            int index = 0;
            int newInt;
            str = s1.Trim().Replace(" ", "");
            str = str.ToUpper();
            if (hex == 10)
            {
                for (int i = str.Length - 1; i > 0; i--)
                {
                    if (str[i] != (char)48)
                    {
                        index = i;
                        break;
                    }
                }
                newInt = Convert.ToInt32(str.Substring(index)) - 1;
                str = str.Substring(0, index)   newInt.ToString().PadLeft(str.Length - index, '0');
            }
            else if (hex == 16)
            {
                newstr = "";
                for (int i = str.Length - 1; i > 0; i--)
                {
                    if (str[i] == (char)65)
                    {
                        newstr = "9";
                        index = i;
                        break;
                    }
                    else if (str[i] != (char)48)
                    {
                        newstr = Chr(Asc(str.Substring(i, 1)) - 1);
                        index = i;
                        break;
                    }
                }
                str = str.Substring(0, index)   newstr   str.Substring(index   1).Replace("0", "F");
            }
            return str;
        }
        /// <summary>
        /// 字符串转16进制字符
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string strtohex(string str)
        {
            string strTemp = "";
            if (str == "")
                return "";
            byte[] bTemp = System.Text.Encoding.Default.GetBytes(str);
            for (int i = 0; i < bTemp.Length; i  )
            {
                strTemp  = bTemp[i].ToString("X2");
            }
            return strTemp;
        }
        #endregion       
    }
}

标签: C# 串口 通信 调试

实例下载地址

C#串口通信调试工具源码下载

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警