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(); } }
調用方式:

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(); } }