zoukankan      html  css  js  c++  java
  • SerialPort访问COM接口获取PLC数据

    using System;
    using System.IO.Ports;
    using System.Text;
    using System.Threading;

    namespace weight
    {
        /// <summary>
        /// 电子秤接口信息类,封装COM口数据
        /// </summary>
        public class WeightInformation
        {
            string _wdata;
            string _wunit;
            string _qdata;
            string _qunit;
            string _percentage;

            /// <summary>
            /// 获取或设置重量
            /// </summary>
            public string WData { get { return this._wdata; } set { this._wdata = value; } }
            /// <summary>
            /// 获取或设置重量单位
            /// </summary>
            public string WUnit { get { return this._wunit; } set { this._wunit = value; } }
            /// <summary>
            /// 获取或设置数量
            /// </summary>
            public string QData { get { return this._qdata; } set { this._qdata = value; } }
            /// <summary>
            /// 获取或设置数量单位
            /// </summary>
            public string QUnit { get { return this._qunit; } set { this._qunit = value; } }
            /// <summary>
            /// 获取或设置百分数
            /// </summary>
            public string Percentage { get { return this._percentage; } set { this._percentage = value; } }
        }

        /// <summary>
        /// 电子称数据读取类
        /// </summary>
        public class WeightReader : IDisposable
        {
            #region 字段、属性与构造函数
            SerialPort sp;
            int _speed = 300;

            /// <summary>
            /// 获取或设置电脑取COM数据缓冲时间,单位毫秒
            /// </summary>
            public int Speed
            {
                get
                {
                    return this._speed;
                }
                set
                {
                    if (value < 300)
                        throw new Exception("串口读取缓冲时间不能小于300毫秒!");
                    this._speed = value;
                }
            }

            public bool InitCom(string PortName)
            {
                return this.InitCom(PortName, 4800, 300);
            }

            /// <summary>
            /// 初始化串口
            /// </summary>
            /// <param name="PortName">数据传输端口</param>
            /// <param name="BaudRate">波特率</param>
            /// <param name="Speed">串口读数缓冲时间</param>
            /// <returns></returns>
            public bool InitCom(string PortName, int BaudRate,int Speed)
            {
                try
                {
                    sp = new SerialPort(PortName, BaudRate, Parity.None, 8);
                    sp.ReceivedBytesThreshold = 10;
                    sp.Handshake = Handshake.RequestToSend;
                    sp.Parity = Parity.None;
                    sp.ReadTimeout = 600;
                    sp.WriteTimeout = 600;
                    this.Speed = Speed;
                    if (!sp.IsOpen)
                    {
                        sp.Open();
                    }
                    return true;
                }
                catch
                {
                    throw new Exception(string.Format("无法初始化串口{0}!",PortName));
                }
            }

            #endregion

            #region 串口数据读取方法
            public WeightInformation ReadInfo()
            {
                string src = this.ReadCom();
                WeightInformation info = new WeightInformation();
                info.WData = this.DecodeWeightData(src);
                info.WUnit = this.DecodeWeightUnit(src);
                info.Percentage = this.DecodePercentage(src);
                info.QData = this.DecodeQualityData(src);
                info.QUnit = this.DecodeQualityUnit(src);

                return info;
            }
            /// <summary>
            /// 将COM口缓存数据全部读取
            /// </summary>
            /// <returns></returns>
            private string ReadCom()//返回信息
            {
                if (this.sp.IsOpen)
                {
                    Thread.Sleep(this._speed);
                    string res = "";
                    //for (int i = 0; i < 5; i++)
                    //{
                    byte[] buffer = new byte[sp.BytesToRead];
                    sp.Read(buffer, 0, buffer.Length);

                    res = System.Text.Encoding.ASCII.GetString(buffer);
                    //if (res != "")
                    //    break;
                    //}
                    if (res == "")
                    {
                        throw new Exception("串口读取数据为空,参数设置是否正确!");
                    }
                    return res;
                }
                return "";
            }
            #endregion

            #region  基本取数方法

            /// <summary>
            /// 从字符串中取值
            /// </summary>
            /// <param name="head">起始字符串</param>
            /// <param name="intervalLen">间隔位长度</param>
            /// <param name="valueLen">值长度</param>
            /// <param name="src">源字符串</param>
            /// <returns></returns>
            private string DecodeValue(string head, int intervalLen, int valueLen,string src)
            {
                int index = src.IndexOf(head);
                return src.Substring(index + intervalLen, valueLen);
            }
            /// <summary>
            /// 取重量
            /// </summary>
            /// <param name="srcString">源字符串</param>
            /// <returns></returns>
            private string DecodeWeightData(string srcString)
            {
                return this.DecodeValue("GS,", 3, 8,srcString);
            }
            /// <summary>
            /// 取重量单位
            /// </summary>
            /// <param name="srcString">源字符串</param>
            /// <returns></returns>
            private string DecodeWeightUnit(string srcString)
            {
                return this.DecodeValue("GS,", 12, 2, srcString);
            }
            /// <summary>
            /// 取百分数
            /// </summary>
            /// <param name="srcString">源字符串</param>
            /// <returns></returns>
            private string DecodePercentage(string srcString)
            {
                return this.DecodeValue("U.W.", 4, 14, srcString);
            }
            /// <summary>
            /// 取数量
            /// </summary>
            /// <param name="srcString">源字符串</param>
            /// <returns></returns>
            private string DecodeQualityData(string srcString)
            {
                return this.DecodeValue("PCS", 3, 9, srcString);           
            }
           
            /// <summary>
            /// 取数量单位
            /// </summary>
            /// <param name="srcString">源字符串</param>
            /// <returns></returns>
            private string DecodeQualityUnit(string srcString)
            {
                return this.DecodeValue("PCS", 12, 3, srcString);           
            }
            #endregion

            #region 释放所有资源
            public void Dispose()
            {
                if (sp != null && sp.IsOpen)
                {
                    sp.Close();
                }
            }
            #endregion
        }
    }

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/maomaoawen/archive/2009/06/20/4284514.aspx

  • 相关阅读:
    iOS的一些面试题分析总结(1)
    iOS的一些面试题分析总结(0)
    iOS页面间传值的一些方式总结
    自定义UIButton
    iOS查看3D效果的手势交互
    关于php得到参数数据
    ios安装ipa与安卓安装apk
    听说程序员想当就能当?
    W5100S、W5500、W5100差异对比
    annot read lifecycle mapping metadata for artifact org.apache.maven.plugins:maven-clean-plugin:maven
  • 原文地址:https://www.cnblogs.com/dfsxh/p/1653795.html
Copyright © 2011-2022 走看看