private void Process(byte b)
        {
            if (package_on == true)
            {
                if (pos > CACHE_LENGTH)
                {
                    package_on = false;
                    pos        = 0;
                    return;
                }

                cache[pos++] = b;
                if (pos > 4 &&
                    cache[pos - 4] == Command.tail[0] &&    //a pkg is finished
                    cache[pos - 3] == Command.tail[1] &&
                    cache[pos - 2] == Command.tail[2] &&
                    cache[pos - 1] == Command.tail[3] &&
                    cache[Command.head.Length] + Command.head.Length + Command.tail.Length == pos //check pkg len
                    )
                {
                    package_on = false;

                    byte[] temp = cache.Take(pos - 4).ToArray(); //remove tail' bytes
                    byte[] pkg  = temp.Skip(2).ToArray();        //remove head byte and pkg-len byte

                    if (CRC16.CheckCRC(pkg) == true)
                    {
                        ProcessResult(pkg.Take(pkg.Length - 2).ToArray());//remove crc's bytes
                    }
                    else
                    {
                        CleanWorkList();
                        CallProtocolError(ErrorCodeCrcError, "crc check error");
                    }
                }
            }
            else if (package_on == false && b == Command.head[0])   //start a pkg
            {
                package_on   = true;
                pos          = 0;
                cache[pos++] = b;
            }
        }
 //需要没有包头,没有包尾的数据
 public static bool CrcCheck(byte[] data)
 {
     return(CRC16.CheckCRC(data));
 }