|
@@ -11,6 +11,7 @@ using System.Diagnostics;
|
|
|
using System.Web.UI.WebControls;
|
|
|
using System.ComponentModel;
|
|
|
using CCWin.Win32.Com;
|
|
|
+using System.Drawing;
|
|
|
|
|
|
namespace MOKA_Factory_Tools
|
|
|
{
|
|
@@ -2800,15 +2801,17 @@ namespace MOKA_Factory_Tools
|
|
|
if (onebit == ACKhead[2])
|
|
|
{
|
|
|
if (Comport.ReadByte() == ACKhead[3])
|
|
|
+ {
|
|
|
if (Comport.ReadByte() == ACKhead[4])
|
|
|
{
|
|
|
for (int j = 0; j <= 4; j++)
|
|
|
{
|
|
|
result[j] = ACKhead[j];
|
|
|
}
|
|
|
- mark = true;
|
|
|
- goto CheckTCL2Receive;
|
|
|
+ mark = true; // 表示第一段接受正确;
|
|
|
+ break;
|
|
|
}
|
|
|
+ }
|
|
|
}
|
|
|
else if (onebit == ACKhead2[2])
|
|
|
{
|
|
@@ -2842,96 +2845,166 @@ namespace MOKA_Factory_Tools
|
|
|
}
|
|
|
//delay(Comport, CMDID);
|
|
|
}
|
|
|
- CheckTCL2Receive:
|
|
|
+
|
|
|
+ if ( !mark )
|
|
|
+ {
|
|
|
+ Log.WriteErrorLog("Received Error:" + SerialInit.ByteToHex(result.Take(5).ToArray()));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
if (receive2)
|
|
|
{
|
|
|
- //delay(Comport, CMDID, true);
|
|
|
- if (mark)
|
|
|
+ // 分2段2次返回,第2次同样要再次设置超时值;
|
|
|
+ Comport.ReadTimeout = ReadTimeout;
|
|
|
+ //等待一段时间确保接收到完整数据
|
|
|
+ Thread.Sleep(100);
|
|
|
+ //取一个空间存放第二段
|
|
|
+ //校验第二段CRC是否正确
|
|
|
+ //根据长度判断是否有FE字段
|
|
|
+ byte[] receive2Data = new byte[20480];
|
|
|
+ //划一个空间用来存放实际长度
|
|
|
+ int reallyLength=Comport.Read(receive2Data, 0,20480);
|
|
|
+ //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])
|
|
|
{
|
|
|
- // 分2段2次返回,第2次同样要再次设置超时值;
|
|
|
- Comport.ReadTimeout = ReadTimeout;
|
|
|
- //等待一段时间确保接收到完整数据
|
|
|
- Thread.Sleep(100);
|
|
|
- //取一个空间存放第二段
|
|
|
- //校验第二段CRC是否正确
|
|
|
- //根据长度判断是否有FE字段
|
|
|
- byte[] receive2Data = new byte[20480];
|
|
|
- //划一个空间用来存放实际长度
|
|
|
- int reallyLength=Comport.Read(receive2Data, 0,20480);
|
|
|
- //CRC校验
|
|
|
- byte crcHighByte = receive2Data[reallyLength - 2];
|
|
|
- byte crcLowByte = receive2Data[reallyLength - 1];
|
|
|
-
|
|
|
- string crc = CrcTest.Program.CalcCRC16(receive2Data.Take(reallyLength - 2).ToArray());
|
|
|
-
|
|
|
- byte[] calCrc = SerialInit.HexToByte(crc);
|
|
|
- if(crcHighByte == calCrc[0] && crcLowByte == calCrc[1])
|
|
|
+ //根据实际收到的数据判断是否有FE字段
|
|
|
+ if (reallyLength > 255)
|
|
|
{
|
|
|
- //根据实际收到的数据判断是否有FE字段
|
|
|
- if (reallyLength > 255)
|
|
|
+ //数据大于255,应该有FE
|
|
|
+ if (receive2Data[1] != 0xFE)
|
|
|
{
|
|
|
- //数据大于255,应该有FE
|
|
|
- if (receive2Data[1] != 0xFE)
|
|
|
- {
|
|
|
- Log.WriteErrorLog("数据大于255,协议无FE字段");
|
|
|
- return false;
|
|
|
- }
|
|
|
+ Log.WriteErrorLog("数据大于255,协议无FE字段");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
- //获取数据,获取长度字节,然后判断
|
|
|
- uint packetLen = (uint)((receive2Data[2] << 8) | receive2Data[3]);
|
|
|
- if (packetLen != reallyLength)
|
|
|
+ //获取数据,获取长度字节,然后判断
|
|
|
+ packetLen = (int)((receive2Data[2] << 8) | receive2Data[3]);
|
|
|
+ if (packetLen != reallyLength)
|
|
|
+ {
|
|
|
+ Log.WriteErrorLog("实际长度与读出的长度不符");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是否是FC指令;
|
|
|
+ if (CMDID[0] == 0xFC)
|
|
|
+ {
|
|
|
+ if (receive2Data[4] != 0xFC)
|
|
|
{
|
|
|
- Log.WriteErrorLog("实际长度与读出的长度不符");
|
|
|
+ Log.WriteErrorLog("Key 里面应该第四个字节应为FC指令");
|
|
|
return false;
|
|
|
}
|
|
|
- //判断命令是否正确(有无FC字段,有的时候命令应往后移一个
|
|
|
- if (receive2Data[receive2Data[4] != 0xFC ? 4 : 5] != CMDID[0] + 1)
|
|
|
+
|
|
|
+ if (receive2Data[5] != CMDID[1] + 1)
|
|
|
{
|
|
|
Log.WriteErrorLog("收到的命令与发送的命令计算后值不同");
|
|
|
return false;
|
|
|
}
|
|
|
- // 获取数据部分;
|
|
|
- int skipLen = receive2Data[4] == 0xFC ? 6 : 5;
|
|
|
- data = receive2Data.Skip(skipLen).Take(reallyLength - skipLen - 2).ToArray();
|
|
|
- Log.WriteInfoLog("Receive Data:" + SerialInit.ByteToHex(result.Take(5).ToArray()) + SerialInit.ByteToHex(receive2Data.Take(reallyLength).ToArray()));
|
|
|
- return true;
|
|
|
}
|
|
|
-
|
|
|
else
|
|
|
{
|
|
|
- //获取数据,获取长度字节,然后判断
|
|
|
- int packetLength = receive2Data[1];
|
|
|
- if (packetLength != reallyLength)
|
|
|
- {
|
|
|
- Log.WriteErrorLog("实际长度与读出的长度不符");
|
|
|
- return false;
|
|
|
- }
|
|
|
- //判断命令是否正确(有无FC字段,有的时候命令应往后移一个
|
|
|
- if (receive2Data[receive2Data[2] == 0xFC ? 3 : 2] != CMDID[0] + 1)
|
|
|
+ if (receive2Data[4] != CMDID[0] + 1)
|
|
|
{
|
|
|
Log.WriteErrorLog("收到的命令与发送的命令计算后值不同");
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
- int skipLen = receive2Data[2] == 0xFC ? 4 : 3;
|
|
|
- data = receive2Data.Skip(skipLen).Take(reallyLength - skipLen - 2).ToArray();
|
|
|
- Log.WriteInfoLog("Receive Data:" + SerialInit.ByteToHex(result.Take(5).ToArray()) + SerialInit.ByteToHex(receive2Data.Take(packetLength).ToArray()));
|
|
|
- return true;
|
|
|
}
|
|
|
+
|
|
|
+ // 获取数据部分;
|
|
|
+ int skipLen = receive2Data[4] == 0xFC ? 6 : 5;
|
|
|
+ data = receive2Data.Skip(skipLen).Take(reallyLength - skipLen - 2).ToArray();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- Log.WriteErrorLog("校验错误");
|
|
|
- return false;
|
|
|
+ // 找出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(6).Take(packetLen - 8).ToArray();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {// 假设FE直接表示的是长度;
|
|
|
+ if (receive2Data[2] == 0xFC && (receive2Data[3] == CMDID[1] + 1) && reallyLength == 0xFE)
|
|
|
+ {
|
|
|
+ data = receive2Data.Skip(4).Take(packetLen - 6).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(4).Take(packetLen - 6).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();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- Thread.Sleep(NextCommandWaitTime);
|
|
|
- return true;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
+ Log.WriteErrorLog("校验错误");
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
+ Log.WriteInfoLog("Receive Data:" + SerialInit.ByteToHex(result.Take(5).ToArray()) + SerialInit.ByteToHex(receive2Data.Take(packetLen).ToArray()));
|
|
|
+ Thread.Sleep(NextCommandWaitTime);
|
|
|
+ return true;
|
|
|
}
|
|
|
else
|
|
|
{
|