⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmserialport.cs

📁 串口通讯(原版是由一个老外开发的
💻 CS
字号:
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;

namespace SerialPortTest
{  

    public partial class frmSerialPort : Form
    {
        private Color[] LogMsgTypeColor = { Color.Blue, Color.Green, Color.Black, Color.Orange, Color.Red };//显示的字体颜色

        public frmSerialPort()//页面初始化
        {
            InitializeComponent();
            //InitializeControlValues();//串口初始化  
            //comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
        }

        private void InitializeControlValues()//串口初始化
        {
            try
            {
                comport.PortName = "COM1";//端口号
                comport.BaudRate = 9600;//波特率                
                comport.DataBits = 8;   //数据位
                comport.Parity = System.IO.Ports.Parity.None;//奇偶验检位
                comport.StopBits = System.IO.Ports.StopBits.One;//停止位
                comport.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show("初始化串口失败,串口正被使用,\n\n出现错误:\n" + ex.Message, "警告信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                comport.Close();
            }
        }

        private void frmTerminal_Shown(object sender, EventArgs e)//版权
        {
            Log(LogMsgType.Normal, String.Format(" Autumn: Application Started at {0}\n", DateTime.Now));
        }

        #region 数据接收格式

        private void port_DataReceived1(object sender, SerialDataReceivedEventArgs e)//接收(仪表 1)
        {
            try
            {                
                string data = comport.ReadExisting();//获得串口传来的数据
                System.Threading.Thread.Sleep(600);//  sleep   100ms   to   send   data
                if(data.Length>10)//判断长度
                {
                    string rr;
                    int ss;
                    rr = data.Substring(3, 7);
                    #region 去除小数点
                    if (rr.Substring(6, 1) == ".")
                    {
                        rr = data.Substring(3, 6);
                        ss = int.Parse(rr.ToString());
                    }
                    else if (rr.Substring(5, 1) == ".")
                    {
                        rr = data.Substring(3, 5);
                        ss = int.Parse(rr.ToString());
                    }
                    else if (rr.Substring(4, 1) == ".")
                    {
                        rr = data.Substring(3, 4);
                        ss = int.Parse(rr.ToString());
                    }
                    else if (rr.Substring(3, 1) == ".")
                    {
                        rr = data.Substring(3, 3);
                        ss = int.Parse(rr.ToString());
                    }
                    else if (rr.Substring(2, 1) == ".")
                    {
                        rr = data.Substring(3, 2);
                        ss = int.Parse(rr.ToString());
                    }
                    else if (rr.Substring(1, 1) == ".")
                    {
                        rr = data.Substring(3, 1);
                        ss = int.Parse(rr.ToString());
                    }
                    else
                    {
                        ss = int.Parse(rr.ToString());
                    }
                    #endregion
                    Log(LogMsgType.Incoming, ss.ToString());//传到rtfTerminal文本里
                    Log(LogMsgType.Outgoing, "接收内容: " + txtSendData.Text + "\n");//显示用户发送的数据并在后面加"\n" 
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("接收的数字中,有字符串;出现错误:" + ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error);               
            }
        }

        #endregion

        private void Log(LogMsgType msgtype, string msg)//显示在RtfTerminal文本
        {
            rtfTerminal.Invoke(new EventHandler(delegate
            {
                rtfTerminal.SelectedText = string.Empty;//只读
                rtfTerminal.SelectionFont = new Font(rtfTerminal.SelectionFont, FontStyle.Bold);//字体
                rtfTerminal.SelectionColor = LogMsgTypeColor[(int)msgtype];//颜色
                rtfTerminal.AppendText(msg);//追加
                rtfTerminal.ScrollToCaret();
            }));
        }

        private void btnFaSong_Click(object sender, EventArgs e)//发送按钮内容
        {
            try
            {
                if (this.txtSendData.Text == "" || this.txtSendData.Text == null)
                {
                    this.txtSendData.Focus();
                    return;
                }
                SetFaSong();
            }
            catch (Exception ex)
            {
                MessageBox.Show("串口发送时,出现错误:" + ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        
        private void btnOpenPort_Click(object sender, EventArgs e)//开启串口 /关闭串口
        {
            try
            {
                if (this.btnOpenPort.Text == "Open Port")
                {//串口打开
                    comport.PortName = cmbPortName.Text;//端口号
                    comport.BaudRate = int.Parse(cmbBaudRate.Text);//波特率                
                    comport.DataBits = int.Parse(cmbDataBits.Text);   //数据位

                    #region 奇偶验检位
                    switch (this.cmbParity.SelectedIndex)
                    {
                        case 0://无
                            comport.Parity = System.IO.Ports.Parity.None;
                            break;
                        case 1://偶效验
                            comport.Parity = System.IO.Ports.Parity.Even;
                            break;
                        case 2://奇效验
                            comport.Parity = System.IO.Ports.Parity.Odd;
                            break;
                    }
                    #endregion

                    #region 停止位
                    switch (this.cmbStopBits.SelectedIndex)
                    {
                        case 0://1
                            comport.StopBits = System.IO.Ports.StopBits.One;
                            break;
                        case 1://1.5
                            comport.StopBits = System.IO.Ports.StopBits.OnePointFive;
                            break;
                        case 2://2
                            comport.StopBits = System.IO.Ports.StopBits.Two;
                            break;
                    }
                    #endregion

                    #region 仪表型号
                    switch (this.cmbYiBiao.SelectedIndex)
                    {
                        case 0://仪表1
                            comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived1);
                            break;
                        case 1://仪表2
                            //comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived2);
                            break;
                        case 2://仪表3
                           //comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived3);
                            break;
                        case 3://仪表4
                            //comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived4);
                            break;
                    }
                    #endregion

                    comport.Open();
                    if (comport.IsOpen)//串口开启
                    {
                        this.btnOpenPort.Text = "Close Port";
                        this.rtfTerminal.Enabled = true;
                        this.groupBox2.Enabled = true;
                        groupBox1.Enabled = false;
                        txtSendData.Focus();
                    }
                }
                else
                {//串口关闭
                    comport.Close();//关闭串口
                    groupBox1.Enabled = true;
                    this.rtfTerminal.Enabled = false;
                    this.groupBox2.Enabled = false;
                    this.btnOpenPort.Text = "Open Port";                    
                    this.cmbPortName.Focus();
                }
            }
            catch (Exception ex)
            {
               MessageBox.Show("串口参数设置错误,出现错误:\n" + ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            
        }

        private void frmSerialPort_Load(object sender, EventArgs e)//窗体加载事件
        {
            try
            {
                this.cmbPortName.SelectedIndex = 0;//串口名称
                this.cmbBaudRate.SelectedIndex = 5;//波特率
                this.cmbDataBits.SelectedIndex = 1;//数据位
                this.cmbParity.SelectedIndex = 0;//奇偶验检位
                this.cmbStopBits.SelectedIndex = 0;//停止位
                this.cmbYiBiao.SelectedIndex = 0;//仪表型号
                this.ActiveControl = this.cmbPortName;
            }
            catch (Exception ex)
            {
                MessageBox.Show("窗体加载失败,出现错误:\n" + ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void txtSendData_KeyDown(object sender, KeyEventArgs e)//txtSendData的KeyDown事件
        {
            try
            {
                if (e.KeyCode == Keys.Enter)
                {
                    if (this.txtSendData.Text == "" || this.txtSendData.Text == null)
                    {
                        this.txtSendData.Focus();
                        return;
                    }
                    SetFaSong();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("串口发送时,出现错误:" + ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void linkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)//版权
        {           
            //(new frmCopyright()).ShowDialog(this);// 显示版权
        }

        private void SetFaSong()//发送数据
        {
            comport.Write(this.txtSendData.Text);//向端口发送数据  
            Log(LogMsgType.Outgoing, "发送内容: " + txtSendData.Text + "\n");//显示用户发送的数据and在后面加"\n"  
            this.txtSendData.Text = "";
            this.txtSendData.Focus();
        }

    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -