|
@@ -8,6 +8,9 @@ using System.Collections;
|
|
using System.Threading;
|
|
using System.Threading;
|
|
using SXLibrary;
|
|
using SXLibrary;
|
|
using System.Diagnostics;
|
|
using System.Diagnostics;
|
|
|
|
+using System.Web.UI.WebControls;
|
|
|
|
+using System.ComponentModel;
|
|
|
|
+using CCWin.Win32.Com;
|
|
|
|
|
|
namespace MOKA_Factory_Tools
|
|
namespace MOKA_Factory_Tools
|
|
{
|
|
{
|
|
@@ -517,6 +520,8 @@ namespace MOKA_Factory_Tools
|
|
/// </summary>
|
|
/// </summary>
|
|
/// <param name="Comport"></param>
|
|
/// <param name="Comport"></param>
|
|
/// <param name="param"></param>
|
|
/// <param name="param"></param>
|
|
|
|
+ ///
|
|
|
|
+ ///
|
|
/// <param name="result"></param>
|
|
/// <param name="result"></param>
|
|
/// <param name="data"></param>
|
|
/// <param name="data"></param>
|
|
/// <param name="error"></param>
|
|
/// <param name="error"></param>
|
|
@@ -2843,64 +2848,83 @@ namespace MOKA_Factory_Tools
|
|
//delay(Comport, CMDID, true);
|
|
//delay(Comport, CMDID, true);
|
|
if (mark)
|
|
if (mark)
|
|
{
|
|
{
|
|
- string Br = "";
|
|
|
|
- string Sr = "";
|
|
|
|
// 分2段2次返回,第2次同样要再次设置超时值;
|
|
// 分2段2次返回,第2次同样要再次设置超时值;
|
|
- Comport.ReadTimeout = ReadTimeout;
|
|
|
|
- while (Comport.BytesToRead >= 0)
|
|
|
|
- {
|
|
|
|
- if (Comport.ReadByte() == ACKhead[0])
|
|
|
|
- {
|
|
|
|
- result[5] = ACKhead[0];
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if (!TwoLengthBit)
|
|
|
|
|
|
+ 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])
|
|
{
|
|
{
|
|
- int k = Comport.ReadByte();
|
|
|
|
- result[6] = (byte)k;
|
|
|
|
- int timeout = 0;
|
|
|
|
- while (Comport.BytesToRead < (k - 2) && timeout < 20)
|
|
|
|
|
|
+ //根据实际收到的数据判断是否有FE字段
|
|
|
|
+ if (reallyLength > 255)
|
|
{
|
|
{
|
|
- Thread.Sleep(100);
|
|
|
|
- timeout++;
|
|
|
|
- }
|
|
|
|
- Comport.Read(result, 7, k - 2);
|
|
|
|
- Comport.ReadTimeout = 200;
|
|
|
|
- Br = SerialInit.ByteToHex(result.Skip(8).Take(k - 5).ToArray());
|
|
|
|
- Sr = Encoding.ASCII.GetString(result.Skip(8).Take(k - 5).ToArray());
|
|
|
|
- data = result.Skip(8).Take(k - 5).ToArray();
|
|
|
|
- Log.WriteInfoLog("Received:" + SerialInit.ByteToHex(result.Take(5 + k).ToArray()));
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- int mark1= Comport.ReadByte();
|
|
|
|
- result[6] = (byte)mark1;
|
|
|
|
- if (result[6]!=0xFE)
|
|
|
|
- {
|
|
|
|
- Log.WriteInfoLog("返回错误,返回的第二段串口值不正确");
|
|
|
|
- return false;
|
|
|
|
|
|
+ //数据大于255,应该有FE
|
|
|
|
+ if (receive2Data[1] != 0xFE)
|
|
|
|
+ {
|
|
|
|
+ Log.WriteErrorLog("数据大于255,协议无FE字段");
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //获取数据,获取长度字节,然后判断
|
|
|
|
+ uint packetLen = (uint)((receive2Data[2] << 8) | receive2Data[3]);
|
|
|
|
+ if (packetLen != reallyLength)
|
|
|
|
+ {
|
|
|
|
+ Log.WriteErrorLog("实际长度与读出的长度不符");
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ //判断命令是否正确(有无FC字段,有的时候命令应往后移一个
|
|
|
|
+ if (receive2Data[receive2Data[4] != 0xFC ? 4 : 5] != CMDID[0] + 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;
|
|
}
|
|
}
|
|
|
|
|
|
- int k1 = Comport.ReadByte();
|
|
|
|
- int k2 = Comport.ReadByte();
|
|
|
|
- result[7] = (byte)k1;
|
|
|
|
- result[8] = (byte)k2;
|
|
|
|
- int k = k1 * 256 + k2;
|
|
|
|
- int timeout = 0;
|
|
|
|
- while (Comport.BytesToRead < (k - 4) && timeout < 20)
|
|
|
|
|
|
+ else
|
|
{
|
|
{
|
|
- Thread.Sleep(100);
|
|
|
|
- timeout++;
|
|
|
|
|
|
+ //获取数据,获取长度字节,然后判断
|
|
|
|
+ int packetLength = receive2Data[1];
|
|
|
|
+ if (packetLength != reallyLength)
|
|
|
|
+ {
|
|
|
|
+ Log.WriteErrorLog("实际长度与读出的长度不符");
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ //判断命令是否正确(有无FC字段,有的时候命令应往后移一个
|
|
|
|
+ if (receive2Data[receive2Data[2] == 0xFC ? 3 : 2] != 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;
|
|
}
|
|
}
|
|
- Comport.Read(result, 9, k - 4);
|
|
|
|
- Comport.ReadTimeout = 200;
|
|
|
|
- Br = SerialInit.ByteToHex(result.Skip(10).Take(k - 7).ToArray());
|
|
|
|
- Sr = Encoding.ASCII.GetString(result.Skip(10).Take(k - 7).ToArray());
|
|
|
|
- data = result.Skip(10).Take(k - 7).ToArray();
|
|
|
|
- Log.WriteInfoLog("Received:" + SerialInit.ByteToHex(result.Take(5 + k).ToArray()));
|
|
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ Log.WriteErrorLog("校验错误");
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
Thread.Sleep(NextCommandWaitTime);
|
|
Thread.Sleep(NextCommandWaitTime);
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|