用C# 写一个PowerMeter类方法有打开串口关闭串口发送命令到获取数据写在一个方法里串口协议命令有?是握手命令返回表示握手成功在发送24个T获取一组数据串口有时候发送一个T不会返回数据需要在次发送一个T一直到发送完整24个T获取25个返回数据。每次发送一个命令就等待2毫秒。从打开串口就开始发送命令到获取数据判断数据完整就关闭串口在这一个过程中如果有错误就直接关闭串口在打开串口在获取数据知道获
以下是一个可能的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/bea0 著作权归作者所有。请勿转载和采集!