소스 검색

串口读取函数重写

jianfeng1.wang 2 년 전
부모
커밋
dbd4d2368a
1개의 변경된 파일246개의 추가작업 그리고 150개의 파일을 삭제
  1. 246 150
      FactoryTool_CShare/IO/SerialCMD.cs

+ 246 - 150
FactoryTool_CShare/IO/SerialCMD.cs

@@ -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;
                 }