C# PowerMeter 类:串口通信获取仪表数据
以下是一个可能的 PowerMeter 类实现,用于与仪表设备进行串口通信并获取数据:
using System;
using System.IO.Ports;
using System.Threading;
public class PowerMeter
{
private SerialPort _serialPort;
private bool _isOpen;
public PowerMeter()
{
_serialPort = new SerialPort();
_serialPort.BaudRate = 9600;
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.Handshake = Handshake.None;
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;
}
public bool Open(string portName)
{
if (_isOpen)
{
return true;
}
_serialPort.PortName = portName;
try
{
_serialPort.Open();
}
catch (Exception)
{
return false;
}
_isOpen = true;
// 发送握手命令
if (!SendCommand("?"))
{
Close();
return false;
}
// 等待握手成功
string response = ReadResponse();
if (response != ".")
{
Close();
return false;
}
// 发送获取数据命令
if (!SendCommand("T", 24))
{
Close();
return false;
}
// 等待获取完整数据
response = ReadResponse();
while (response.Length < 25 || !response.StartsWith("A") && !response.StartsWith("B")
&& !response.StartsWith("C") && !response.StartsWith("D") && !response.StartsWith("E")
&& !response.StartsWith("F") && !response.StartsWith("G") || !response.EndsWith("V"))
{
if (response.Length > 0 && response[response.Length - 1] == 'T')
{
// 发送补发命令
if (!SendCommand("T", 1))
{
Close();
return false;
}
}
else
{
// 等待一段时间再读取
Thread.Sleep(2);
response += ReadResponse();
}
}
// 关闭串口
Close();
return true;
}
public void Close()
{
if (_isOpen)
{
_serialPort.Close();
_isOpen = false;
}
}
private bool SendCommand(string command, int repeatCount = 1)
{
for (int i = 0; i < repeatCount; i++)
{
try
{
_serialPort.Write(command);
Thread.Sleep(2);
}
catch (Exception)
{
return false;
}
}
return true;
}
private string ReadResponse()
{
try
{
return _serialPort.ReadExisting();
}
catch (Exception)
{
return "";
}
}
}
该类使用 SerialPort 类实现串口通信,其中 Open 方法用于打开串口并开始发送命令,Close 方法用于关闭串口,SendCommand 方法用于发送命令并等待一段时间,ReadResponse 方法用于读取串口返回的数据。
在 Open 方法中,首先发送握手命令,检查返回的数据是否为 . ,如果不是则认为握手失败,关闭串口并返回 false。然后发送获取数据命令,如果发送失败则关闭串口并返回 false。接着等待串口返回的数据,如果返回的数据长度小于 25 或者开头不是 A/B/C/D/E/F/G 或者结尾不是 V,则说明返回的数据不完整,需要等待一段时间再次读取,如果读取到的数据中有 T,则说明数据不完整,需要发送补发命令,如果补发命令发送失败,则关闭串口并返回 false。如果读取到的数据是完整的,则关闭串口并返回 true。如果在任何一个步骤中发生了错误,则直接关闭串口并返回 false。
注意: 这个类的实现仅供参考,具体的实现可能会因为硬件、协议等方面的不同而有所区别。
原文地址: https://www.cveoy.top/t/topic/mEZ6 著作权归作者所有。请勿转载和采集!