
/// <summary>
/// 只能通过CreateInstance方法来创建类的实例。单例模式
/// </summary>
public static ElectricityMeter CreateInstance()
{
return _instance
}
/// <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 = 2400// 请将设备的波特率设置为此。
_serialPort.DataBits = 8
_serialPort.StopBits = StopBits.One
_serialPort.Parity = Parity.Even
_serialPort.Open()
}
catch( Exception e )
{
MessageBox.Show( e.Message )
}
}
/// <summary>
/// 关闭设备。
/// </summary>
public void Close()
{
if( _serialPort.IsOpen == true )
{
_serialPort.Close()
_serialPort.Dispose()
}
}
/// <summary>
/// 获伏宴唯取耗电量
/// </summary>
public Decimal GetPowerConsumption()
{
if( _serialPort.IsOpen == true )
{
// 十六进制的命祥袭令字符串
string strCmd = "68 AA AA AA AA AA AA 68 11 04 33 33 33 33 AD 16"
// 转换为十六进制的字节数组
string[] strs = strCmd.Split( new char[] { ' ' } )// 空格分组
byte[] cmdBytes = new byte[ strs.Length ]
// 转换为十进制的字节数组
for( int i = 0i <cmdBytes.Lengthi++ ) {
cmdBytes[ i ] = Convert.ToByte( strs[ i ], 16 )// 16进制转换为10进制
}
_serialPort.Write( cmdBytes, 0, cmdBytes.Length )
System.Threading.Thread.Sleep( 500 ) // 500ms内应当有响应
byte[] resultBytes = new byte[ 21 ]// 容量为21的字节数组
_serialPort.Read( resultBytes, 0, resultBytes.Length )
string n1 = Convert.ToString( resultBytes[ 18 ] - 51, 16 )// 将十进制转成16进制的字符串
string n2 = Convert.ToString( resultBytes[ 17 ] - 51, 16 )// 将十进制转成16进制的字符串
string n3 = Convert.ToString( resultBytes[ 16 ] - 51, 16 )// 将十进制转成16进制的字符串
string n4 = Convert.ToString( resultBytes[ 15 ] - 51, 16 )// 将十进制转成16进制的字符串
string resultString = n1 + n2 + n3 + "." + n4
return Decimal.Parse( resultString )
}
else
{
throw new Exception( "串口没有打开" )
}
}
/// <summary>
/// 在窗体关闭的时候关闭串口连接。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void _frm_FormClosing( object sender, FormClosingEventArgs e )
{
this.Close()
}
}
1、表计时间太久,按钮氧化,接触不良。导致按键无反应。因为你说你是表厂。可缺山肆以用镊子短接编程按钮两端。可进入编程允许状态伏轿。 2、如果1无法解决。可唯冲能程序跑乱。重新更新程序。欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)