1、电子称配置
按照说明书,将电子称的数据传输模式设置为模式2,即在测量稳定后会自动返回数据。其它的配置按照默认的。
2、电子称的读取类
按照厂家提供的通讯协议,对数据的读取进行了简单的封装。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 + " " ); 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(); } }
调用方式:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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(); } }