コード例 #1
0
        /// <summary>
        /// 读取数据
        /// </summary>
        /// <param name="Address"></param>
        /// <param name="CC"></param>
        public void Read(string Address, string CC)//读取数据没有D1-Dn
        {
            CC_Data             = new Laser_CC_Data();
            CC_Data.RW          = "01";    //读取标志
            CC_Data.DataSize    = "00";    //读取数据,DataSize大小强制为0
            CC_Data.Address     = Address; //地址
            CC_Data.Com_Control = CC;      //控制指令
            //整合指令
            CC_Data.Sum = CC_Data.RW + CC_Data.DataSize + CC_Data.Address + CC_Data.Com_Control + CC_Data.Data;
            //发送数据
            SendToLaserControl(CC_Data.Sum);
            WR_OK = false;
            int Count = 0;

            do
            {
                if (!Program.SystemContainer.Laser_Control_Com.Open)
                {
                    return;
                }
                Thread.Sleep(200);//延时200ms,等待数据读取完成
                Count++;
                if (Count > 5)
                {
                    return;
                }
            } while (!WR_OK);
        }
コード例 #2
0
        /// <summary>
        /// 写入数据
        /// </summary>
        /// <param name="Address"></param>
        /// <param name="CC"></param>
        /// <param name="Data"></param>
        public void Write(string Address, string CC, string Data)//写入数据,这就包含写入数据的参数:D1-Dn
        {
            CC_Data             = new Laser_CC_Data();
            CC_Data.RW          = "00";                                             //写入标志
            CC_Data.DataSize    = Cal_Data_Size(Convert.ToUInt32(Data.Length / 2)); //写入数据,DataSize
            CC_Data.Address     = Address;                                          //地址
            CC_Data.Com_Control = CC;                                               //控制指令
            CC_Data.Data        = Data;                                             //数据
            //整合指令
            CC_Data.Sum = CC_Data.RW + CC_Data.DataSize + CC_Data.Address + CC_Data.Com_Control + CC_Data.Data;
            //发送数据
            SendToLaserControl(CC_Data.Sum);
            //等待数据完成解析
            WR_OK = false;
            int Count = 0;

            do
            {
                if (!Program.SystemContainer.Laser_Control_Com.Open)
                {
                    return;
                }
                Thread.Sleep(200);//延时200ms,等待数据读取完成
                Count++;
                if (Count > 5)
                {
                    return;
                }
            } while (!WR_OK);
        }
コード例 #3
0
        /// <summary>
        /// 解析接收的数据
        /// </summary>
        /// <param name="Rec_Data"></param>
        public void Resolve_Com_Data(byte[] Rec_Data)
        {
            //清空解析数据
            Resolve_Rec = new Laser_CC_Data();
            //数据拆分
            byte Header = 0x00; //头信息
            byte Ender  = 0x0d; //终止符 \r

            //判断结尾数据是否是Ender
            if (Rec_Data[Rec_Data.Length - 1] != Ender)
            {
                //再次发送数据
                SendToLaserControl(CC_Data.Sum);
                return;
            }
            string      Temp        = Encoding.Default.GetString(Rec_Data);//先转换为字符串
            List <byte> RecListData = new List <byte>(StrToHexByte(Temp).ToList());

            //判断写入还是读取
            if (CC_Data.RW == "00")//写入
            {
                WR_OK = true;
                return;
            }
            else if (CC_Data.RW == "01")//读取
            {
                Header = 0x03;
            }
            //检查接收到的数据是否完整
            if (RecListData.Count < 6)
            {
                //再次发送数据
                SendToLaserControl(CC_Data.Sum);
                return;
            }

            //获取索引值
            int HeadIndex = RecListData.FindIndex(o => o == Header);//获取头字节的 索引

            if (HeadIndex > -1)
            {
                RecListData.RemoveRange(0, HeadIndex);
            }
            else
            {
                //再次发送数据
                SendToLaserControl(CC_Data.Sum);
                return;
            }
            //判断数据长度是否合适
            if (RecListData.Count < (RecListData[1] + 4 + 2))//头部4 + 数据长度 + Crc校验2
            {
                //再次发送数据
                SendToLaserControl(CC_Data.Sum);
                return;
            }
            //数据处理
            Resolve_Rec.RW          = string.Format("{0:X2}", RecListData[0]);
            Resolve_Rec.DataSize    = string.Format("{0:X2}", RecListData[1]);
            Resolve_Rec.Address     = string.Format("{0:X2}", RecListData[2]);
            Resolve_Rec.Com_Control = string.Format("{0:X2}", RecListData[3]);
            //判断Adress地址
            if (Resolve_Rec.Address != CC_Data.Address)
            {
                //再次发送数据
                SendToLaserControl(CC_Data.Sum);
                return;
            }
            //检查格式
            byte[] DataByte;
            switch (RecListData[1])
            {
            case 0:
                DataByte         = new byte[2];
                DataByte[0]      = 0;
                DataByte[1]      = 0;
                Resolve_Rec.Data = "";    //获取Data数据
                break;

            case 1:
                DataByte         = new byte[2];
                DataByte[0]      = RecListData[4];
                DataByte[1]      = 0;
                Resolve_Rec.Data = string.Format("{0:X2}", BitConverter.ToInt16(DataByte, 0));    //获取Data数据
                break;

            case 2:
                DataByte         = new byte[2];
                DataByte[0]      = RecListData[5];
                DataByte[1]      = RecListData[4];
                Resolve_Rec.Data = string.Format("{0:X4}", BitConverter.ToInt16(DataByte, 0));    //获取Data数据
                break;

            case 3:
                DataByte         = new byte[4];
                DataByte[0]      = RecListData[6];
                DataByte[1]      = RecListData[5];
                DataByte[2]      = RecListData[4];
                DataByte[3]      = 0x00;
                Resolve_Rec.Data = string.Format("{0:X6}", BitConverter.ToInt32(DataByte, 0));    //获取Data数据
                break;

            case 4:
                DataByte         = new byte[4];
                DataByte[0]      = RecListData[7];
                DataByte[1]      = RecListData[6];
                DataByte[2]      = RecListData[5];
                DataByte[3]      = RecListData[4];
                Resolve_Rec.Data = string.Format("{0:X8}", BitConverter.ToInt32(DataByte, 0));    //获取Data数据
                break;

            case 5:
                DataByte         = new byte[8];
                DataByte[0]      = RecListData[8];
                DataByte[1]      = RecListData[7];
                DataByte[2]      = RecListData[6];
                DataByte[3]      = RecListData[5];
                DataByte[4]      = RecListData[4];
                DataByte[5]      = 0;
                DataByte[6]      = 0;
                DataByte[7]      = 0;
                Resolve_Rec.Data = string.Format("{0:X10}", BitConverter.ToInt64(DataByte, 0));    //获取Data数据
                break;

            default:
                DataByte         = new byte[2];
                DataByte[0]      = 0;
                DataByte[1]      = 0;
                Resolve_Rec.Data = "";    //获取Data数据
                break;
            }
            Resolve_Rec.Crc = string.Format("{0:X4}", BitConverter.ToInt32(new byte[] { RecListData[RecListData[1] + 4 + 1], RecListData[RecListData[1] + 4], 0, 0 }, 0)); //获取CRC值
            Resolve_Rec.Sum = Resolve_Rec.RW + Resolve_Rec.DataSize + Resolve_Rec.Address + Resolve_Rec.Com_Control + Resolve_Rec.Data;                                    //该序列数据
            //校验数据完整性
            if (Crc_Append_Str((ushort)compCRC.Check_Sum(StrToHexByte(Resolve_Rec.Sum))) == Resolve_Rec.Crc)
            {
                if (RecListData[1] <= 4)
                {
                    Resolve_Rec.Num = HexStrToInt32(Resolve_Rec.Data);
                }
                else
                {
                    //Resolve_Rec.StatusNum = HexStrToInt64(Resolve_Rec.Data);
                    Resolve_Rec.StatusD1 = RecListData[4];
                }
                WR_OK = true;
                LogInfo?.Invoke("激光控制接收数据 校验OK!!!");
            }
            else
            {
                //再次发送数据
                SendToLaserControl(CC_Data.Sum);
            }
        }