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); }
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"); } } }
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); } }
//MCU数据发送函数 public void McuSendConnect() { byte[] send_pack = ModbusUdp.MBReqConnect(); McuSend(send_pack, send_pack.Length); }
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); } }