|
@@ -2731,6 +2731,220 @@ namespace MOKA_Factory_Tools
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ private static bool ParseDataFEIsLen(SerialPort Comport, ref byte[] CMDID, ref int reallyLength, ref byte[] receive2Data, out int dataLen, out int dataIndex)
|
|
|
+ {
|
|
|
+ dataLen = 0;
|
|
|
+ dataIndex = 0;
|
|
|
+ if (CMDID[0] == 0xFC)
|
|
|
+ {
|
|
|
+ if (receive2Data[2] == 0xFC && receive2Data[3] == CMDID[1] + 1)
|
|
|
+ {// FE则表示长度;
|
|
|
+ dataIndex = 4;
|
|
|
+ dataLen = 0xFE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {// 如果FE是大于255标记;
|
|
|
+ Log.WriteErrorLog("FE may be is a mark");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (receive2Data[2] == CMDID[1] + 1)
|
|
|
+ {// 否则FE则表示长度;
|
|
|
+ dataIndex = 3;
|
|
|
+ dataLen = 0xFE;
|
|
|
+ }
|
|
|
+ else if (receive2Data[4] != CMDID[1] + 1)
|
|
|
+ {// 如果FE是大于255标记;
|
|
|
+ Log.WriteErrorLog("FE may be is a mark");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ int tryCount = 5;
|
|
|
+ while ( reallyLength < dataLen )
|
|
|
+ {
|
|
|
+ if (tryCount-- == 0)
|
|
|
+ break;
|
|
|
+ // 读取剩余数据;
|
|
|
+ int len = Comport.Read(receive2Data, reallyLength, 20480 - reallyLength);
|
|
|
+ reallyLength += len;
|
|
|
+ Thread.Sleep(30);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (reallyLength < dataLen)
|
|
|
+ {
|
|
|
+ Log.WriteErrorLog("recv data is not enough!");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ //CRC校验
|
|
|
+ byte crcHighByte = receive2Data[dataLen - 2];
|
|
|
+ byte crcLowByte = receive2Data[dataLen - 1];
|
|
|
+ string crc = CrcTest.Program.CalcCRC16(receive2Data.Take(dataLen - 2).ToArray());
|
|
|
+
|
|
|
+ byte[] calCrc = SerialInit.HexToByte(crc);
|
|
|
+ if (crcHighByte != calCrc[0] || crcLowByte != calCrc[1])
|
|
|
+ {
|
|
|
+ Log.WriteErrorLog("crc check error");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static bool ParseDataFEIsMark(SerialPort Comport, ref byte[] CMDID, ref int reallyLength, ref byte[] receive2Data, out int dataLen, out int dataIndex)
|
|
|
+ {
|
|
|
+ dataLen = 0;
|
|
|
+ dataIndex = 0;
|
|
|
+ int tryCount = 0;
|
|
|
+ if (CMDID[0] == 0xFC)
|
|
|
+ {
|
|
|
+ // 如果FE是大于255标记;
|
|
|
+ tryCount = 5;
|
|
|
+ while (reallyLength < 6)
|
|
|
+ {
|
|
|
+ int len = Comport.Read(receive2Data, reallyLength, 20480 - reallyLength);
|
|
|
+ reallyLength += len;
|
|
|
+ if (tryCount-- == 0)
|
|
|
+ break;
|
|
|
+ Thread.Sleep(10);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (reallyLength < 6)
|
|
|
+ {// 未接收够字节;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (receive2Data[4] == 0xFC && receive2Data[5] == CMDID[1] + 1)
|
|
|
+ {
|
|
|
+ dataIndex = 6;
|
|
|
+ dataLen = (int)((receive2Data[2] << 8) | receive2Data[3]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // 异常数据;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (receive2Data[4] == CMDID[1] + 1)
|
|
|
+ {
|
|
|
+ dataIndex = 5;
|
|
|
+ dataLen = (int)((receive2Data[2] << 8) | receive2Data[3]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ tryCount = 5;
|
|
|
+ while (reallyLength < dataLen)
|
|
|
+ {
|
|
|
+ if (tryCount-- == 0)
|
|
|
+ break;
|
|
|
+ // 读取剩余数据;
|
|
|
+ int len = Comport.Read(receive2Data, reallyLength, 20480 - reallyLength);
|
|
|
+ reallyLength += len;
|
|
|
+ Thread.Sleep(30);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (reallyLength < dataLen)
|
|
|
+ {
|
|
|
+ Log.WriteErrorLog("recv data is not enough!");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ //CRC校验
|
|
|
+ byte crcHighByte = receive2Data[dataLen - 2];
|
|
|
+ byte crcLowByte = receive2Data[dataLen - 1];
|
|
|
+ string crc = CrcTest.Program.CalcCRC16(receive2Data.Take(dataLen - 2).ToArray());
|
|
|
+
|
|
|
+ byte[] calCrc = SerialInit.HexToByte(crc);
|
|
|
+ if (crcHighByte != calCrc[0] || crcLowByte != calCrc[1])
|
|
|
+ {
|
|
|
+ Log.WriteErrorLog("crc check error");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static bool ParseDataWithoutFE(SerialPort Comport, ref byte[] CMDID, ref int reallyLength, ref byte[] receive2Data, out int dataLen, out int dataIndex)
|
|
|
+ {
|
|
|
+ dataLen = 0;
|
|
|
+ dataIndex = 0;
|
|
|
+ int tryCount = 0;
|
|
|
+ if (CMDID[0] == 0xFC)
|
|
|
+ {
|
|
|
+ tryCount = 5;
|
|
|
+ while (reallyLength < 5)
|
|
|
+ {
|
|
|
+ int len = Comport.Read(receive2Data, reallyLength, 20480 - reallyLength);
|
|
|
+ reallyLength += len;
|
|
|
+ if (tryCount-- == 0)
|
|
|
+ break;
|
|
|
+ Thread.Sleep(10);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (reallyLength < 5)
|
|
|
+ {// 未接收够字节;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (receive2Data[2] == 0xFC && receive2Data[3] == CMDID[1] + 1)
|
|
|
+ {
|
|
|
+ dataIndex = 4;
|
|
|
+ dataLen = receive2Data[1];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // 异常数据;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (receive2Data[2] == CMDID[1] + 1)
|
|
|
+ {
|
|
|
+ dataIndex = 3;
|
|
|
+ dataLen = receive2Data[1];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ tryCount = 5;
|
|
|
+ while (reallyLength < dataLen)
|
|
|
+ {
|
|
|
+ if (tryCount-- == 0)
|
|
|
+ break;
|
|
|
+ // 读取剩余数据;
|
|
|
+ int len = Comport.Read(receive2Data, reallyLength, 20480 - reallyLength);
|
|
|
+ reallyLength += len;
|
|
|
+ Thread.Sleep(30);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (reallyLength < dataLen)
|
|
|
+ {
|
|
|
+ Log.WriteErrorLog("recv data is not enough!");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ //CRC校验
|
|
|
+ byte crcHighByte = receive2Data[dataLen - 2];
|
|
|
+ byte crcLowByte = receive2Data[dataLen - 1];
|
|
|
+ string crc = CrcTest.Program.CalcCRC16(receive2Data.Take(dataLen - 2).ToArray());
|
|
|
+
|
|
|
+ byte[] calCrc = SerialInit.HexToByte(crc);
|
|
|
+ if (crcHighByte != calCrc[0] || crcLowByte != calCrc[1])
|
|
|
+ {
|
|
|
+ Log.WriteErrorLog("crc check error");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 通讯逻辑
|
|
|
/// </summary>
|
|
@@ -2853,175 +3067,57 @@ namespace MOKA_Factory_Tools
|
|
|
}
|
|
|
|
|
|
if (receive2)
|
|
|
- {
|
|
|
- // 分2段2次返回,第2次同样要再次设置超时值;
|
|
|
- Comport.ReadTimeout = ReadTimeout;
|
|
|
- //等待一段时间确保接收到完整数据
|
|
|
- Thread.Sleep(200);
|
|
|
- //取一个空间存放第二段
|
|
|
- //校验第二段CRC是否正确
|
|
|
- //根据长度判断是否有FE字段
|
|
|
+ {
|
|
|
+ int TryCount = 5;
|
|
|
+ int reallyLength = 0;
|
|
|
byte[] receive2Data = new byte[20480];
|
|
|
- //划一个空间用来存放实际长度
|
|
|
- int reallyLength=Comport.Read(receive2Data, 0,20480);
|
|
|
- if ( reallyLength <= 0 )
|
|
|
+ Comport.ReadTimeout = ReadTimeout;
|
|
|
+ // 读够最基本的5字节;
|
|
|
+ while ( reallyLength <= 5 )
|
|
|
+ {
|
|
|
+ Thread.Sleep(10);
|
|
|
+ int len = Comport.Read(receive2Data, reallyLength, 20480 - reallyLength);
|
|
|
+ reallyLength += len;
|
|
|
+ if (TryCount-- == 0)break;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 循环5次仍未满足5个字节;
|
|
|
+ if (reallyLength < 5)
|
|
|
{
|
|
|
- Log.WriteErrorLog("Received Nothing.");
|
|
|
+ Log.WriteErrorLog("Received Error:" + SerialInit.ByteToHex(receive2Data.Take(reallyLength).ToArray()));
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- int TryCount = 3;
|
|
|
- while ( reallyLength <= 2 )
|
|
|
+ if (receive2Data[0] != 0xAB)
|
|
|
{
|
|
|
- if (TryCount < 0)
|
|
|
- {
|
|
|
- Log.WriteErrorLog("接收数据错误");
|
|
|
- return false;
|
|
|
- }
|
|
|
- Thread.Sleep(350);
|
|
|
- int len = Comport.Read(receive2Data, reallyLength, 20480 - reallyLength);
|
|
|
- reallyLength += len;
|
|
|
- TryCount--;
|
|
|
+ Log.WriteErrorLog("Received Error:" + SerialInit.ByteToHex(receive2Data.Take(reallyLength).ToArray()));
|
|
|
+ return false;
|
|
|
}
|
|
|
- Log.WriteInfoLog("接收的数据2:" + SerialInit.ByteToHex(receive2Data.Take(reallyLength).ToArray()));
|
|
|
|
|
|
- //CRC校验
|
|
|
- byte crcHighByte = receive2Data[reallyLength - 2];
|
|
|
- byte crcLowByte = receive2Data[reallyLength - 1];
|
|
|
- string crc = CrcTest.Program.CalcCRC16(receive2Data.Take(reallyLength - 2).ToArray());
|
|
|
-
|
|
|
- int packetLen = 0;
|
|
|
- byte[] calCrc = SerialInit.HexToByte(crc);
|
|
|
- if (crcHighByte == calCrc[0] && crcLowByte == calCrc[1])
|
|
|
+ int dataLen = 0;
|
|
|
+ int dataIndex = 0;
|
|
|
+ if (receive2Data[1] == 0xFE)
|
|
|
{
|
|
|
- //根据实际收到的数据判断是否有FE字段
|
|
|
- if (reallyLength > 255)
|
|
|
+ if (!ParseDataFEIsLen(Comport, ref CMDID, ref reallyLength, ref receive2Data, out dataLen, out dataIndex))
|
|
|
{
|
|
|
- //数据大于255,应该有FE
|
|
|
- if (receive2Data[1] != 0xFE)
|
|
|
- {
|
|
|
- Log.WriteErrorLog("数据大于255,协议无FE字段");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- //获取数据,获取长度字节,然后判断
|
|
|
- packetLen = (int)((receive2Data[2] << 8) | receive2Data[3]);
|
|
|
- if (packetLen != reallyLength)
|
|
|
+ if (!ParseDataFEIsMark(Comport, ref CMDID, ref reallyLength, ref receive2Data, out dataLen, out dataIndex))
|
|
|
{
|
|
|
- Log.WriteErrorLog("实际长度与读出的长度不符");
|
|
|
+ Log.WriteErrorLog("Received Error:" + SerialInit.ByteToHex(receive2Data.Take(reallyLength).ToArray()));
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
- // 判断是否是FC指令;
|
|
|
- if (CMDID[0] == 0xFC)
|
|
|
- {
|
|
|
- if (receive2Data[4] != 0xFC)
|
|
|
- {
|
|
|
- Log.WriteErrorLog("Key 里面应该第四个字节应为FC指令");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (receive2Data[5] != CMDID[1] + 1)
|
|
|
- {
|
|
|
- Log.WriteErrorLog("收到的命令与发送的命令计算后值不同");
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (receive2Data[4] != CMDID[0] + 1)
|
|
|
- {
|
|
|
- Log.WriteErrorLog("收到的命令与发送的命令计算后值不同");
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 获取数据部分;
|
|
|
- int skipLen = 5;
|
|
|
- data = receive2Data.Skip(skipLen).Take(reallyLength - skipLen - 2).ToArray();
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // 找出CMDID对应的返回(CMDID+1);
|
|
|
- if (CMDID[0] == 0xFC)
|
|
|
- {
|
|
|
- // 第二个是FE
|
|
|
- if (receive2Data[1] == 0xFE)
|
|
|
- {
|
|
|
- packetLen = (int)((receive2Data[2] << 8) | receive2Data[3]);
|
|
|
- if (receive2Data[4] == 0xFC && (receive2Data[5] == CMDID[1] + 1) && packetLen == reallyLength)
|
|
|
- {// 假设FE表示的是使用2个字节存储长度的标记;
|
|
|
- data = receive2Data.Skip(5).Take(packetLen - 7).ToArray();
|
|
|
- }
|
|
|
- else
|
|
|
- {// 假设FE直接表示的是长度;
|
|
|
- if (receive2Data[2] == 0xFC && (receive2Data[3] == CMDID[1] + 1) && reallyLength == 0xFE)
|
|
|
- {
|
|
|
- data = receive2Data.Skip(3).Take(packetLen - 5).ToArray();
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- Console.WriteLine("命令不符合逻辑");
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else //不含FE字段
|
|
|
- {
|
|
|
- if (receive2Data[2] == 0xFC && (receive2Data[3] != CMDID[1] + 1))
|
|
|
- {
|
|
|
- Console.WriteLine("命令不对");
|
|
|
- return false;
|
|
|
- }
|
|
|
- packetLen = receive2Data[1];
|
|
|
- data = receive2Data.Skip(3).Take(packetLen - 5).ToArray();
|
|
|
- }
|
|
|
- }
|
|
|
- else //没有FC
|
|
|
- {
|
|
|
- //第二个是FE
|
|
|
- if (receive2Data[1] == 0xFE)
|
|
|
- {
|
|
|
- packetLen = (int)((receive2Data[2] << 8) | receive2Data[3]);
|
|
|
- //头有FE字段,且FE为占长度位置的标记
|
|
|
- if ((receive2Data[4] == CMDID[0] + 1) && packetLen == reallyLength)
|
|
|
- {
|
|
|
- //获取数据部分
|
|
|
- data = receive2Data.Skip(5).Take(packetLen - 7).ToArray();
|
|
|
- }
|
|
|
- else
|
|
|
- { //FE是长度
|
|
|
- if ((receive2Data[2] == CMDID[0] + 1) && reallyLength == 0xFE)
|
|
|
- {
|
|
|
- data = receive2Data.Skip(3).Take(packetLen - 5).ToArray();
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- Console.WriteLine("命令不符合逻辑");
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else //不含FE字段
|
|
|
- {
|
|
|
- if (receive2Data[2] != CMDID[0] + 1)
|
|
|
- {
|
|
|
- Console.WriteLine("命令不对");
|
|
|
- return false;
|
|
|
- }
|
|
|
- packetLen = receive2Data[1];
|
|
|
- data = receive2Data.Skip(3).Take(packetLen - 5).ToArray();
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- Log.WriteErrorLog("校验错误");
|
|
|
- return false;
|
|
|
+ if (!ParseDataWithoutFE(Comport, ref CMDID, ref reallyLength, ref receive2Data, out dataLen, out dataIndex))
|
|
|
+ {
|
|
|
+ Log.WriteErrorLog("Received Error:" + SerialInit.ByteToHex(receive2Data.Take(reallyLength).ToArray()));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- Log.WriteInfoLog("Receive Data:" + SerialInit.ByteToHex(result.Take(5).ToArray()) + SerialInit.ByteToHex(receive2Data.Take(packetLen).ToArray()));
|
|
|
+ data = receive2Data.Skip(dataIndex).Take(reallyLength - dataIndex - 2).ToArray();
|
|
|
+ Log.WriteInfoLog("Receive Data:" + SerialInit.ByteToHex(result.Take(5).ToArray()) + SerialInit.ByteToHex(receive2Data.Take(dataLen).ToArray()));
|
|
|
Thread.Sleep(NextCommandWaitTime);
|
|
|
return true;
|
|
|
}
|