串口通信握手与数据读取优化
private const string HandshakeSignal = "?"; private const string ReceiveSignal = "."; private const string TSignal = "T"; private const string HOSignal = "HO";
private void ReadWriter() { int handshakeCount = 0; string receivedData = ""; string matchWavelength = ""; string calculatedWavelength = ""; string result = "";
// 发送握手信号
SendSerialPort(HandshakeSignal);
// 循环等待接收数据
while (handshakeCount < 50)
{
// 暂停50毫秒
Thread.Sleep(50);
// 读取数据
receivedData = ReadSerialPort();
// 判断是否握手成功
if (receivedData.Contains(ReceiveSignal))
{
// 发送T信号
SendTSignal();
// 暂停50毫秒
Thread.Sleep(50);
// 读取数据
receivedData = ReadSerialPort();
// 查找匹配项
matchWavelength = arr.FirstOrDefault(x => receivedData.IndexOf(x.ToString().Length == 3 ? "0" + x.ToString() : x.ToString()) >= 0);
// 判断波长是否正确
if (matchWavelength == null)
{
result = "功率波长错误,目前功率计,计算值的波长是:" + string.Join(",", arr.ToArray()) + ",请检查你的功率计波长是否正确,波长正确但未包含在目前计算的波长里,如果连续是这样,请联内网通联系蒋云开。";
Send(result);
return;
}
// 计算波长
int index = receivedData.IndexOf(matchWavelength == null ? "" : matchWavelength);
if (index < 5)
{
continue;
}
calculatedWavelength = receivedData.Substring(0, index == 0 ? receivedData.Length - 0 : index);
switch (calculatedWavelength[calculatedWavelength.Length - 1])
{
case '2':
calculatedWavelength = calculatedWavelength.Insert(7 - 1, ".");
break;
case '3':
calculatedWavelength = calculatedWavelength.Insert(7 - 2, ".");
break;
case '4':
calculatedWavelength = calculatedWavelength.Insert(7 - 3, ".");
break;
case '5':
calculatedWavelength = calculatedWavelength.Insert(7 - 4, ".");
break;
}
if (calculatedWavelength.Length > 9)
{
result = "功率波长错误,目前功率计,计算值的波长是:" + string.Join(",", arr.ToArray()) + ",请检查你的功率计波长是否正确,波长正确但未包含在目前计算的波长里,如果连续是这样,请联内网通联系蒋云开。";
Send(result);
return;
}
result = Replace(calculatedWavelength);
Send(result);
// 发送HO信号
SendSerialPort(HOSignal);
return;
}
else
{
// 继续发送握手信号
SendSerialPort(HandshakeSignal);
handshakeCount++;
}
}
Send("握手失败。");
}
private void SendTSignal() { for (int i = 0; i < 24; i++) { SendSerialPort(TSignal); Thread.Sleep(3); } }
private string ReadSerialPort() { byte[] buffer = new byte[1024]; int length = 0;
try
{
length = serialPort.Read(buffer, 0, serialPort.BytesToRead);
}
catch (Exception ex)
{
HandleException(ex);
}
return Encoding.Default.GetString(buffer, 0, length);
}
private void SendSerialPort(string data) { try { serialPort.Write(data); } catch (Exception ex) { HandleException(ex); } }
private void HandleException(Exception ex) { Send(ex.Message); return; }
原文地址: http://www.cveoy.top/t/topic/jGOH 著作权归作者所有。请勿转载和采集!