示例#1
0
        public byte[] McuSendRead(ushort addr, ushort len)
        {
            byte[] send_pack = ModbusUdp.MBReqConnect();
            McuSend(send_pack, send_pack.Length);

            //Timeout = 300;
            //while (timeout--)
            //{ //等待应答
            //    if(应答成功)
            //    {
            //        return get_data;
            //    }
            //    sleep(1);
            //}

            return(null);
        }
示例#2
0
        private void ReceiveHandle()
        {
            //接收数据处理线程
            byte[] data = new byte[1024];

            while (true)
            {
                if (UdpInit.mySocket == null || UdpInit.mySocket.Available < 1)
                {
                    Thread.Sleep(10);
                    continue;
                }

                //接收UDP数据报,引用参数RemotePoint获得源地址
                try
                {
                    int rlen;
                    //这段代码需要测试
                    if (isMac == false)
                    {
                        rlen = UdpInit.mySocket.ReceiveFrom(data, ref UdpInit.RemotePoint);
                    }
                    else
                    {
                        Thread.Sleep(50);
                        rlen = UdpInit.mySocket.Receive(data);
                    }
                    ReceiveCallback tx = SetReceiveData;
                    tx(rlen, data);
                }
                catch (Exception e)
                {
                    Debug.WriteLine(e);
                    //data = Mcu.ModbusUdp.MBReqConnect();
                    UdpSend.UdpSendData(ModbusUdp.MBReqConnect(), ModbusUdp.MBReqConnect().Length, UdpInit.BroadcastRemotePoint);
                    Debug.WriteLine("Search server");
                }
            }
        }
示例#3
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);
            }
        }
示例#4
0
 //MCU数据发送函数
 public void McuSendConnect()
 {
     byte[] send_pack = ModbusUdp.MBReqConnect();
     McuSend(send_pack, send_pack.Length);
 }
示例#5
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);
                }
            }