PowerMeter 类:串口通信和数据获取的优化实现
public class PowerMeter { private SerialPort port; private int handshakeCount = 0;
// 打开串口并发送握手命令
public void OpenPort(PowerMeterInfo powerMeterInfo)
{
port = new SerialPort(powerMeterInfo.Port, powerMeterInfo.BaudRate);
port.Open(); // 打开串口
string result = SendCommand("?"); // 发送握手命令
while (handshakeCount < 500 && result != ".") // 循环发送握手命令直到握手成功或超过次数限制
{
result = SendCommand("?");
handshakeCount++;
}
if (handshakeCount >= 500) // 如果连续500次没有握手成功就关闭端口,重新再打开端口
{
ClosePort();
OpenPort(powerMeterInfo);
return;
}
else // 如果握手成功就用多线程或者异步线程调用GetCompleteData()方法
{
Task.Factory.StartNew(() => GetCompleteData());
}
}
// 关闭串口
public void ClosePort()
{
port.Close(); // 关闭串口
}
// 发送命令并读取返回数据
private string SendCommand(string cmd)
{
port.Write(cmd); // 发送命令
System.Threading.Thread.Sleep(2); // 等待2毫秒
return port.ReadExisting(); // 读取返回数据
}
// 发送命令并读取返回数据,直到获取完整的数据字符串
private string GetCompleteData()
{
string cmd = "T"; // 获取数据命令
int retryCount = 0;
string data = "";
while (data.Length < 24 && retryCount < 20) // 发送24次T,每发送一个T就返回一个数据,如果未返回一个数据就重复发送这个T,连续20次没有数据返回就重新发送握手命令
{
string result = SendCommand(cmd); // 发送命令
if (result != "") // 如果返回数据不为空就拼接数据
{
data += result;
}
else
{
retryCount++;
}
}
if (retryCount >= 20) // 如果连续20次没有数据返回就调用关闭串口方法,在重新打开串口
{
ClosePort();
OpenPort(powerMeterInfo);
return;
}
else // 如果获取数据成功就处理数据
{
// 处理数据
}
}
}
原文地址: http://www.cveoy.top/t/topic/mFeS 著作权归作者所有。请勿转载和采集!