Help_SerialPort

本文介绍了如何使用C#编程实现串口对象Help_SerialPort,包括属性设置、事件委托(如数据发送和接收)、自定义方法(如TX_发送数据)以及处理接收事件。涵盖了串口连接、波特率配置、数据传输和事件调用等内容。
摘要由CSDN通过智能技术生成

串口对象 

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace help
{
    #region 全局
    //====1定义委托============================================
    public delegate void WT_串口发送事件(string data);
    public delegate void WT_串口接收事件(string data);
    #endregion
    /// <summary>
    /// Help_SerialPort comx = new Help_SerialPort();//串口对象
    /// </summary>
    public class Help_SerialPort //:SerialPort  //继承串口
    {// Help_SerialPort comx = new Help_SerialPort();//串口对象

        #region 字段
        Help_String help_string = new Help_String();// 文本处理
        //Timer timer=new Timer();//   DateTime.Now.Year
        #endregion
        #region 属性
        //====2生成属性=========================================
        //public  WT_串口发送事件 wt_串口发送事件=> Help_BaseData.Wt_串口发送事件; 
        //public  WT_串口接收事件 wt_串口接收事件=> Help_BaseData.Wt_串口接收事件;//委托

        public static event WT_串口发送事件 wt_串口发送事件;
        public static event WT_串口接收事件 wt_串口接收事件;//委托   public delegate void WT_串口接收事件(string data);


        public SerialPort serialPort { set; get; }//串口(属性是引用类型)
        public static uint read_帧计数 { get; set; }
        public string read_下位机数据 { get; set; }
        /// <summary>
        /// 触发接收事件的字节数
        /// </summary>
        public int 帧长字节 { get => serialPort.ReceivedBytesThreshold; set => serialPort.ReceivedBytesThreshold = value; }
        //public int 帧字节 => serialPort.ReceivedBytesThreshold;

        #region get参数
        //===get==================================================
        public bool isopen { get { return serialPort.IsOpen; } }
        public string[] get可用串口 { get { return SerialPort.GetPortNames(); } }
        /// <summary>
        ///  "110","300","600","1200","2400","4800","9600","14400","28800","19200",
        ///  "38400","56000","57600","115200","230400","460800","921600"
        /// </summary>
        public string[] get波特率 => new string[]{
                "110","300","600","1200","2400","4800","9600","14400","28800","19200",
                "38400","56000","57600","115200","230400","460800","921600"};
        /// <summary>
        /// "5", "6", "7", "8"
        ///  数据位的值 5至8。默认8
        /// </summary>
        public string[] get数据位 { get { return new string[] { "5", "6", "7", "8" }; } }
        /// <summary>
        /// None   Odd  Even  Mark  Space ,
        /// None 不发生奇偶校验检查。
        /// Odd  设置奇偶校验位,使位数等于奇数。
        /// Even 设置奇偶校验位,使位数等于偶数。
        /// Mark 将奇偶校验位保留为 1。
        /// Space将奇偶校验位保留为 0。
        /// </summary>
        public string[] get校验位 { get { return Enum.GetNames(typeof(Parity)); } } //  校验位
        /// <summary>
        /// None One  Two  OnePointFive 。
        /// 0  1  2  1.5
        /// </summary>
        public string[] get停止位 { get { return Enum.GetNames(typeof(StopBits)); } }  //
        #endregion
        #region set参数
        //===set=================================================
        /// <summary>
        /// serialPort1.PortName = name;
        /// </summary>
        /// <param name="name"></param>
        public void set串口名(string name)
        {
            try
            {
                serialPort.PortName = name;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);//显示错误
            }
        }
        /// <summary>
        /// serialPort1.BaudRate = Convert.ToInt32(BaudRate, 10);//十进制的
        /// </summary>
        /// <param name="BaudRate"></param>
        public void set波特率(string BaudRate)
        {
            try
            {
                serialPort.BaudRate = Convert.ToInt32(BaudRate, 10);//十进制的
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
        }
        /// <summary>
        /// serialPort1.DataBits = Convert.ToInt32(DataBits, 10);//十进制的
        /// </summary>
        /// <param name="DataBits"></param>
        public void set数据位(string DataBits)
        {
            try
            {
                serialPort.DataBits = Convert.ToInt32(DataBits, 10);//十进制的
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
        }
        /// <summary>
        /// serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), Parity, true);//true 为忽略大小写
        /// </summary>
        /// <param name="Parity"></param>
        public void set校验位(string Parity)
        {
            try
            {
                serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), Parity, true);//true 为忽略大小写
                //return Enum.GetNames(typeof(Parity));
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
        }
        /// <summary>
        /// serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBits, true);
        /// "None"  "One"  "Two"  "OnePointFive"
        /// </summary>
        /// <param name="StopBits"></param>
        public void set停止位(string StopBits)
        {
            try
            {
                serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBits, true);
                //return Enum.GetNames(typeof(StopBits));
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
        }
        #endregion

        #endregion
        #region 构造
        /// <summary>
        /// =Help_BaseData.COMX;//静态  绑定全局变量 串口
        /// </summary>
        public Help_SerialPort()
        {
            //serialPort1=cnc.Program.COMX;//  绑定全局变量 串口
            serialPort = Help_BaseData.COMX;//静态
            serialPort.DataReceived += SerialPort1_DataReceived;//绑定一个委托    接收事件
        }
        /// <summary>
        /// 串口帮助类
        /// </summary>
        /// <param name="comx">SerialPort 串口 </param>
        public Help_SerialPort(SerialPort comx)//类是引用类型
        {
            serialPort = comx;
            serialPort.DataReceived += SerialPort1_DataReceived;//绑定一个委托    接收事件
        }
        #endregion
        #region 自定义方法


        /// <summary>
        /// 串口接收事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {   //throw new NotImplementedException();

            int length = serialPort.BytesToRead;//字节长度
            if (length == 0) return;//空数据
            byte[] buffer = new byte[length];//匹配的数据包
            serialPort.Read(buffer, 0, length);//加载数据
                                               //wt_rx(help_string.BytesToHexStrings(buffer));//显示接收数据
                                               //string data= Encoding.UTF8.GetString(buffer);//显示接收数据
            string data = help_string.BytesToHexStrings(buffer);
            if (data.Length > 0)
            {
                read_帧计数 += 1;//接收到数据帧
                read_下位机数据 = data;//保存下位机接收的数据
                //wt_串口接收事件(data);//接收的数据呼叫上层ui
                wt_数据呼叫上层(data);
            }
        }


        public void TX_发送数据(byte[] data)//发送
        {
            try
            {
                serialPort.Write(data, 0, data.Length);
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
        }
        public void TX_发送数据(string data)//发送
        {
            try
            {
                byte[] buffer = Encoding.Default.GetBytes(data);//以计算机的编码发送
                serialPort.Write(buffer, 0, buffer.Length);//  开始发送
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
        }
        public void TX_发送命令(byte[] buffer)//发送
        {//RS485专用
            try
            {//显示发送的命令
                wt_串口发送事件(help_string.BytesToHexStrings(buffer));//待发送的命令
                //Help_SerialPort.serialPort1.Write(buffer, 0, buffer.Length);
                serialPort.Write(buffer, 0, buffer.Length);
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }//显示错误
        }

        #endregion

        #region WT_委托
        //呼叫委托
        public void wt_数据呼叫上层(string data)
        {
            //====3呼叫委托===========================
            wt_串口接收事件(data);
        }
        #endregion


    }

    #region 串口日志
    class C_串口日志
    {
        #region 字段
        //public DateTime sj_数据时间;
        public int ff_数据时间;//当前时间的   毫秒
        #endregion
        #region 属性
        public string ff_最后数据内容 { get; set; }
        public int 错误帧数 { get; set; }
        #endregion
        #region 构造
        public C_串口日志()
        {
            ff_数据时间 = DateTime.Now.Millisecond;//当前时间   毫秒

        }
        #endregion
        #region 方法

        #endregion
        #region 委托

        #endregion




    }

    #endregion

    class Help_BaseData //全局
    {
        public static SerialPort COMX = new SerialPort();// 字段,全局变量,串口
        public static event WT_串口发送事件 Wt_串口发送事件;
        public static event WT_串口接收事件 Wt_串口接收事件;//委托
        //public static  WT_串口发送事件 Wt_串口发送事件;
        //public static  WT_串口接收事件 Wt_串口接收事件;//委托
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值