坤宏电子称 数据读取类

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

 

posted @ 2015-02-27 17:03  何德海  阅读(4275)  评论(0编辑  收藏  举报