/// <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); } }
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); } }
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); } }