Beispiel #1
0
        /// <summary>
        /// 根据功能码来判断要发送的指令
        /// </summary>
        public static void Send()
        {
            //byte[] data ;
            //ushort addr ;
            //ushort len ;
            //byte[] array;          //data+addr+len
            byte[] Data;             //最终发送的数据

            while (true)
            {
                if (UdpConnect.flagValue == true)  //连接成功标志
                {
                    switch (flagSend)              //发送标志
                    {
                    case 101:
                        Data = ModbusUdp.MBReqMonitor(1);
                        break;

                    case 102:                       //read_ram
                        Data = SendRead();
                        break;

                    //case 103:                  //write_ram
                    // Data = SendWrite(Window1.sliderPositionValue);
                    // break;
                    case 104:                    //read_falsh
                        Data     = SendReadChip();
                        flagSend = 0;
                        break;

                    case 105:                   //write_falsh
                        Data     = SendWriteChip();
                        flagSend = 0;
                        break;

                    case 106:                 //GetId
                        //Data = Mcu.ModbusUdp.MBReqUuid();
                        Data     = SendGetId();
                        flagSend = 0;
                        break;

                    case 107:                //GetTimeCode
                        Data = SendGetTimeCode();
                        break;

                    default:
                        Data = new byte[0];
                        break;
                    }
                    UdpSend.UdpSendData(Data, Data.Length, UdpInit.RemotePoint);
                }
                Thread.Sleep(1000);
            }
        }
Beispiel #2
0
        private void UdpServerTask()
        {
            //启动一个新的线程,执行方法this.ReceiveHandle,
            //以便在一个独立的进程中执行数据接收的操作
            byte   monitorTick = 0;
            Thread thread      = new Thread(new ThreadStart(this.ReceiveHandle));

            thread.IsBackground = true; //设置为后台线程
            thread.Start();

            //发送UDP数据包
            byte[] data;

            while (true)
            {
                if (flagValue == false)
                {
                    data = ModbusUdp.MBReqConnect();
                    if (MainWindow.PlayMac.Equals("TRUE"))
                    {
                        IPAddress  ip   = IPAddress.Parse(Module.macFile[1]);
                        IPEndPoint ipep = new IPEndPoint(ip, 1030);
                        UdpInit.RemotePoint = (EndPoint)(ipep);
                        isMac = true;
                        //flagValue = true;
                        //UdpSend.flagSend = (byte)ModbusUdp.MBFunctionCode.GetId;
                        UdpSend.UdpSendData(data, data.Length, UdpInit.RemotePoint);
                    }
                    else
                    {
                        UdpSend.UdpSendData(data, data.Length, UdpInit.BroadcastRemotePoint);
                    }
                    Debug.WriteLine("寻找服务器" + data);
                    //Module.WriteLogFile("重新连接");
                }

                else
                {
                    //发送UDP心跳包
                    if (monitorTickRx != monitorTick)
                    {
                        if (monitorTickRx >= 0)
                        {
                            monitorTickTimeOut++;
                        }
                    }

                    if (monitorTickTimeOut == 5)     //计时超过5秒,重新连接
                    {
                        flagValue = false;
                        //取消测试
                        //connectFlag = false;
                        monitorTick        = 0;
                        monitorTickRx      = 0;
                        monitorTickTimeOut = 0;
                        Debug.WriteLine("Connect lose...");
                        Module.WriteLogFile("连接丢失");
                    }

                    if (monitorTick < 0xff)
                    {
                        monitorTick++;
                    }
                    else
                    {
                        monitorTick = 0;
                    }

                    data = ModbusUdp.MBReqMonitor(monitorTick);
                    UdpSend.UdpSendData(data, data.Length, UdpInit.RemotePoint);
                    Debug.WriteLine("Connect monitor...");
                }
                Thread.Sleep(1000);
            }
        }
Beispiel #3
0
            private void UdpServerTask()
            {
                byte MonitorTick = 0;

                IPAddress ip;
                int       port;

                //得到本机IP,设置UDP端口号
                IPAddress.TryParse(GetLocalIP(), out ip);
                port         = 0; //自动分配端口
                ipLocalPoint = new IPEndPoint(ip, port);

                //定义网络类型,数据连接类型和网络协议UDP
                mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

                //绑定网络地址
                try
                {
                    mySocket.Bind(ipLocalPoint);
                }
                catch
                {
                    MessageBox.Show("网络端口被占用");
                    //System.Environment.Exit(0);
                }

                //设置广播地址
                ip   = IPAddress.Broadcast;
                port = 1030;
                IPEndPoint ipep = new IPEndPoint(ip, port);
                EndPoint   BroadcastRemotePoint = (EndPoint)(ipep);

                //设置客户机IP,默认为广播地址
                RemotePoint = (EndPoint)(ipep);

                //允许广播
                mySocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

                //启动一个新的线程,执行方法this.ReceiveHandle,
                //以便在一个独立的进程中执行数据接收的操作

                Thread thread = new Thread(new ThreadStart(this.ReceiveHandle));

                thread.IsBackground = true; //设置为后台线程
                thread.Start();

                //发送UDP数据包
                byte[] data;

                while (true)
                {
                    if (!UdpConnectCompleteFlag.Value)
                    {
                        data = ModbusUdp.MBReqConnect();
                        mySocket.SendTo(data, data.Length, SocketFlags.None, BroadcastRemotePoint);
                        Debug.WriteLine("Search udp server...");
                    }
                    else
                    {
                        if (MonitorTickAck.Value != MonitorTick)
                        {
                            if (MonitorTickTimeout.Value > 0)
                            {
                                MonitorTickTimeout.Value--;
                            }
                        }
                        else
                        {
                            MonitorTickTimeout.Value = MonitorTickTimeoutValue;
                        }

                        if (MonitorTickTimeout.Value == 0)
                        {
                            UdpConnectCompleteFlag.Value = false;
                            MonitorTick              = 0;
                            MonitorTickAck.Value     = 0;
                            MonitorTickTimeout.Value = MonitorTickTimeoutValue;
                            Debug.WriteLine("Connect lose...");
                            continue;
                        }
                        else
                        {
                            //发送UDP心跳包
                            if (MonitorTick < 0xff)
                            {
                                MonitorTick++;
                            }
                            else
                            {
                                MonitorTick = 0;
                            }
                            data = ModbusUdp.MBReqMonitor(MonitorTick);
                            mySocket.SendTo(data, data.Length, SocketFlags.None, RemotePoint);
                            Debug.WriteLine("Connect monitor...");
                        }
                    }
                    Thread.Sleep(1000);
                }
            }