瀏覽代碼

优化函数:Sendcmd,使能自适应FE标记的处理。

chenjiangqun 2 年之前
父節點
當前提交
6e88b467f4
共有 1 個文件被更改,包括 135 次插入62 次删除
  1. 135 62
      FactoryTool_CShare/IO/SerialCMD.cs

+ 135 - 62
FactoryTool_CShare/IO/SerialCMD.cs

@@ -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
                 {