如何编程读取智能电表的数据?

如何编程读取智能电表的数据?,第1张

方 法:

/// <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无法解决。可唯冲能程序跑乱。重新更新程序。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12491236.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-25
下一篇2025-08-25

发表评论

登录后才能评论

评论列表(0条)

    保存