Create软件资源服务网!
技术中心 Tech
  • 推荐文章
  • 热门文章
当前位置:科瑞特软件 >> 技术专区 >> C#WinForm >> 浏览文章
c#串口操作类
作者:jary 日期:2010年08月24日 来源:本站原创 浏览:

核心提示:using System; using System.Collections.Generic; using System.Text; using System.IO.Ports; using System.Windows.Forms; using System.Data; namespace DAQ.Com{    ///     /// 串口操作类    /// Date:2010-08-17

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

namespace DAQ.Com
{
    /// <summary>
    /// 串口操作类
    /// Date:2010-08-17
    /// Author:qzg
    /// Version:1.0
    /// </summary>
    public  class Com
    {
        /// <summary>
        /// 构造串口设置表结构
        /// </summary>
        /// <returns></returns>
        public static DataTable GetComSet()
        {
            //设置串口设置信息
            DataTable dtComSet = new DataTable("ComSet");
            dtComSet.Columns.AddRange(new DataColumn[]
            {
                new DataColumn("DevName",typeof(String)),//设备名称
                new DataColumn("Protrocl",typeof(String)),//协议名称
                new DataColumn("ComName",typeof(string)),//串口名称
                new DataColumn("Rate",typeof(int)),//波特率
                new DataColumn("Parity",typeof(string)),//校验位
                new DataColumn("Databit",typeof(byte)),//校验位
            });
            return dtComSet;
        }


        /// <summary>
        /// 串口组件
        /// </summary>
        private SerialPort sport;
       /// <summary>
        /// 设置发送缓冲区大小
       /// </summary>
        public int outBufferSize
        {
            set
            {
                sport.WriteBufferSize = value;
            }
        }
        /// <summary>
        /// 设置接收缓冲区大小
        /// </summary>
        public int inBufferSize
        {
            set
            {
                sport.ReadBufferSize = value;
            }
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        public Com()
        {
            sport = new SerialPort();
        }
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="portName">端口名称</param>
        /// <param name="rate">波特率</param>
        /// <param name="parity">校验方式</param>
        public Com(string portName,int rate,Parity parity)
        {
            sport = new SerialPort(portName,rate,parity);  
        }
        /// <summary>
        /// 初始化串口
        /// </summary>
        /// <returns></returns>
        public bool InitCom()
        {
            if (sport.IsOpen)
                return true;
            else
            {
                try
                {
                    sport.Open();
                    return true;
                }
                catch (Exception e)
                {
                    return false;
                }
            }
        }
        /// <summary>
        /// 关闭串口
        /// </summary>
        public void Close()
        {
            if (sport.IsOpen)
                sport.Close();
        }
        /// <summary>
        /// 串口设置并打开
        /// </summary>
        /// <param name="portName"></param>
        /// <param name="rate"></param>
        /// <param name="parity"></param>
        /// <returns></returns>
        public bool InitCom(string portName, int rate, Parity parity)
        {
            if (sport.IsOpen)
                sport.Close();
            sport.BaudRate = rate;
            sport.PortName = portName;
            sport.Parity = parity;

            try
            {
                sport.Open();
                return true;
            }
            catch (Exception e)
            {
                return false;

            }
        }
      /// <summary>
      /// 发送字节
      /// </summary>
      /// <param name="writeBytes">要发送的字节</param>
      /// <param name="count">发送字节的数量</param>
      /// <returns></returns>
        public bool write(byte[] writeBytes,int count)
        {
            if (InitCom())
            {
                try
                {
                    sport.Write(writeBytes, 0, count);
                    return true;
                }
                catch (Exception e)
                {

                    return false;
                }
            }
            return false;
        }
        /// <summary>
        /// 发送字符串
        /// </summary>
        /// <param name="writestrs"></param>
        /// <returns></returns>
        public bool write(string writeStrs)
        {
            if (InitCom())
            {
                try
                {
                    sport.Write(writeStrs);
                    System.Threading.Thread.Sleep(100);
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            return false;
        }
        /// <summary>
        /// 读取数据
        /// </summary>
        /// <param name="NumBytes">读取的字节数</param>
        /// <returns></returns>
        public byte[] Read(int NumBytes)
        {
            byte[] inbuffer=null;

            if (sport.IsOpen && sport.BytesToRead > 0)
            {
                if (NumBytes > sport.BytesToRead)
                    NumBytes = sport.BytesToRead;
                try
                {
                    int b = sport.ReadByte();
                    string s = sport.ReadExisting();
                    string s1 = sport.NewLine;
                    //string ss = sport.ReadLine();
                    inbuffer = new byte[NumBytes];

                    int count = sport.Read(inbuffer, 0, NumBytes);
                }
                catch (TimeoutException) { throw; }
            }

            //sport.Close();
            return inbuffer;
        }
        /// <summary>
        /// 读取数据
        /// </summary>
        /// <returns></returns>
        public byte[] Read()
        {
            return Read(sport.BytesToRead);
        }
        /// <summary>
        /// 读取行数据
        /// </summary>
        /// <returns></returns>
        public string ReadLine()
        {
            try
            {
                if (sport.IsOpen && sport.BytesToRead > 0)
                {
                    string s = sport.ReadExisting();
                    return sport.ReadLine();
                }
            
                return null;
            }
            catch (TimeoutException e)
            {
                return e.Message;
            }
        }
        /// <summary>
        /// 读取可用字节流
        /// </summary>
        /// <returns></returns>
        public string ReadExisting()
        {
            return sport.ReadExisting();
        }
        /// <summary>
        /// 握手标签
        /// </summary>
        /// <param name="cmd"></param>
        public void SendSignal(byte cmd)
        {
            byte[] hexdata = new byte[5];
            hexdata[0] = 0x01;
            hexdata[1] = 0x03;
            hexdata[2] = cmd;
            ushort crc = CommWithARM. CRC_16(hexdata, 3);
            hexdata[3] = (byte)(crc / 256);
            hexdata[4] = (byte)(crc % 256);
            write(hexdata, 5); 
        }
        /// <summary>
        /// 读取ARM信息
        /// </summary>
        public void OnOnCommMscomm1()
        {
           byte[] rxdata= Read();

           if (rxdata != null)
           {
               int len = rxdata.Length;
               if (len == 23)
               {
                    CommWithARM.CheckHandSignal(rxdata);
               }
               else if (len >= 53)
               {
                    CommWithARM.HandData(rxdata, len);
               }
           }
        }

        #region cancel code 2010-08-23
        ///// <summary>
        ///// 串口组件侦听数据接收
        ///// </summary>
        ///// <param name="sender"></param>
        ///// <param name="e"></param>
        //public void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        //{
        //    byte[] readBuffer = new byte[this.sport.ReadBufferSize];
        //    sport.Read(readBuffer, 0, readBuffer.Length);
        //    this.Invoke(interfaceUpdataHandle, new string[] { Encoding.UTF8.GetString(readBuffer) });
        //}
        #endregion
    }
}

上一篇文章:一个c#应用程序,想让它开机自动启动
下一篇文章:没有了