坤宏电子称 数据读取类

1、电子称配置   

    按照说明书,将电子称的数据传输模式设置为模式2,即在测量稳定后会自动返回数据。其它的配置按照默认的。

 

2、电子称的读取类

     按照厂家提供的通讯协议,对数据的读取进行了简单的封装。

using System;

using System.Collections.Generic;



using System.Text;

using System.IO.Ports;

using System.Windows.Forms;

using System.Diagnostics;





/// <summary>

/// 坤宏

/// </summary>





public class WeightMeterKH

{



    //****************************************************** 字 段 ************************************************************************** 

    SerialPort _serialPort = new SerialPort();

    Form _frm;







    //*****************************************************  事 件 ***************************************************************************

    /// <summary>

    /// 称重数据返回事件。

    /// </summary>

    public event EventHandler WeightDataReceived;







    //****************************************************** 属 性 *************************************************************************** 



    /// <summary>

    /// 重量值。请将设备的单位设成克。

    /// </summary>

    public decimal WeightData

    {

        get

        {

            return _WeightData;

        }

    }

    decimal _WeightData;















    //****************************************************** 构造函数  ******************************************************************* 



    /// <summary>

    /// 私有构造函数,防止类被实例化

    /// </summary>

    private WeightMeterKH()

    {

    }





    //****************************************************** 方 法  ******************************************************************* 







    /// <summary>

    /// 创建一个单例。只能通过CreateInstance方法来创建

    /// </summary>

    public static WeightMeterKH CreateInstance()

    {

        return instance;

    }

    private static readonly WeightMeterKH instance = new WeightMeterKH();









    /// <summary>

    /// 打开设备

    /// </summary>

    /// <param name="portName">串口号</param>

    /// <param name="frm">调用这个类的窗体。</param>

    public void Open( string portName, Form frm )

    {

        try

        {

            // 初始化窗体对象

            _frm = frm;

            _frm.FormClosing += new FormClosingEventHandler( _frm_FormClosing );

            //初始化SerialPort对象

            _serialPort.PortName = portName;

            _serialPort.BaudRate = 9600; // 请将设备的波特率设置为此。

            _serialPort.Open();

            _serialPort.DataReceived += _serialPort_DataReceived;   //添加事件注册

        }

        catch( Exception e )

        {

            MessageBox.Show( e.Message );

        }

    }













    /// <summary>

    /// 关闭设备。

    /// </summary>

    public void Close()

    {

        if( _serialPort.IsOpen == true )

        {

            _serialPort.Close();

            _serialPort.Dispose();

        }

    }





    /// <summary>

    /// 在电子称的模式用不上,使用指令取得重量值

    /// </summary>

    public void GetWeightData()

    {

        if( _serialPort.IsOpen == true )

        {

            _serialPort.Write( "RN" );  // Read Net weight

        }

        else

        {

            MessageBox.Show( "读值失败:串口没有打开。" );

        }

    }











    /// <summary>

    /// 串口数据接收函数。

    /// </summary>

    /// <param name="sender"></param>

    /// <param name="e"></param>

    void _serialPort_DataReceived( object sender, SerialDataReceivedEventArgs e )

    {

        string strRaw = _serialPort.ReadLine();

        //其数据由三个部分构成,用逗号分隔的,可以转换为一个数组。数据示例:ST,NT,   74.06 kg

        string[] strs = strRaw.Split( new char[] { ',' } );

        string str3 = strs[ 2 ].Trim(); // 重量数据的第三个部分,返回的数据就是 74.06 kg

        string strWeight = str3.Substring( 0, str3.Length - 2 ).Trim();



        bool flag = decimal.TryParse( strWeight, out _WeightData );



        if( flag == false )

        {

            MessageBox.Show( "电子称数据转换失败!" );

            // 写入日志

            StringBuilder sb = new StringBuilder();

            sb.AppendLine( DateTime.Now.ToString() + " 电子称数据转换失败" );

            sb.AppendLine( "    原始数据为:" + strRaw );

            sb.AppendLine( "    第三部分去除单位后的数据为:" + strWeight + "\r\n" );

            Trace.Write( sb.ToString() );

        }

        else

        {

            if( this.WeightDataReceived != null )

            {

                _frm.Invoke( ( EventHandler ) ( delegate

                {

                    this.WeightDataReceived( this, new EventArgs() );

                } ) );

            }

        }

    }









    /// <summary>

    /// 在窗体关闭的时候关闭串口连接。

    /// </summary>

    /// <param name="sender"></param>

    /// <param name="e"></param>

    void _frm_FormClosing( object sender, FormClosingEventArgs e )

    {

        this.Close();

    }



}
View Code

    调用方式:

 public partial class Form1 : Form

    {

        //*******************************   全局变量  ******************************

        WeightMeterKH _meter = WeightMeterKH.CreateInstance();





        public Form1()

        {

            InitializeComponent();

        }







        private void Form1_Load( object sender, EventArgs e )

        {

            _meter.Open( "COM10", this );

            _meter.WeightDataReceived += new EventHandler( _meter_WeightDataReceived );



        }









        /// <summary>

        /// 重量数据返回事件处理

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        void _meter_WeightDataReceived( object sender, EventArgs e )

        {

            lblWeight.Text = _meter.WeightData.ToString();



        }

    }
View Code

 

你可能感兴趣的:(数据)