public static byte[] SendWriteChip() { byte[] data; ushort addr; ushort len; byte[] array; //data+addr+len byte[] Data; //最终发送的数据 addr = 0; len = 8; data = new byte[len]; data[0] = Module.deadlineOrPermanent; data[1] = Module.deadlineYY; data[2] = Module.deadlineMM; data[3] = Module.deadlineDD; data[4] = Module.YY; data[5] = Module.MM; data[6] = Module.DD; data[7] = 1; array = ModbusUdp.ArrayAdd(addr, len, data); Data = ModbusUdp.MBReqWriteChip(array); return(Data); }
/// <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); } }
/// <summary> /// 影片结束发送复位指令 /// </summary> public static void SendZero() { byte[] data; ushort addr; ushort len; byte[] array; //data+addr+len byte[] Data; //最终发送的数据 addr = 0; len = 10; data = new byte[len]; array = ModbusUdp.ArrayAdd(addr, len, data); Data = ModbusUdp.MBReqSend_Data(array); UdpSendData(Data, Data.Length, UdpInit.RemotePoint); }
public static void UdpSendData(byte[] data, int len, EndPoint ip) { if (UdpInit.mySocket != null) { try { UdpInit.mySocket.SendTo(data, len, SocketFlags.None, ip); Debug.WriteLine("Send Data{0}", count++); Debug.WriteLine(ModbusUdp.ByteToHexStr(data)); } catch (Exception e) { Module.WriteLogFile(e.Message); } } }
/// <summary> /// 发送获取时间码指令 /// </summary> /// <returns></returns> public static byte[] SendGetTimeCode() { byte[] data; ushort addr; ushort len; byte[] array; //data+addr+len byte[] Data; //最终发送的数据 addr = 0; len = 4; data = new byte[0]; array = ModbusUdp.ArrayAdd(addr, len, data); Data = ModbusUdp.MBReqGetTimeCode(array); return(Data); }
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() { //接收数据处理线程 string msg; byte[] data = new byte[1024]; byte[] RecData; while (true) { if (mySocket == null || mySocket.Available < 1) { Thread.Sleep(10); continue; } //跨线程调用控件 //接收UDP数据报,引用参数RemotePoint获得源地址 int rlen = mySocket.ReceiveFrom(data, ref RemotePoint); if (UdpReceiveFun != null) { UdpReceiveFun(data, rlen); } if ((data[0] == 0xff) && (data[1] == 0x00)) { UdpConnectCompleteFlag.Value = true; } if (UdpConnectCompleteFlag.Value) { if ((data[0] == 0xff) && (data[1] == 0x01)) { MonitorTickAck.Value = data[2]; msg = data[2].ToString(); Debug.WriteLine(RemotePoint.ToString() + " : " + msg); } RecData = new byte[rlen]; Array.Copy(data, 0, RecData, 0, rlen); RecData = ModbusUdp.MBRsp(RecData); if (RecData != null) { Debug.WriteLine(ModbusUdp.ByteToHexStr(RecData)); } } } }
/// <summary> /// 影片结束发送复位指令 /// </summary> public static void SendReset() { byte[] data; ushort addr; ushort len; byte[] array; //data+addr+len byte[] Data; //最终发送的数据 addr = 0; len = 10; data = new byte[len]; if ("2DOF".Equals(MainWindow.PlayDOF)) { //两自由度数据 data[0] = 127; data[1] = 127; data[2] = 127; } else { //三自由度数据 data[0] = 0; data[1] = 0; data[2] = 0; } //复位指令 if (movieStop == true) { data[8] = 0; } else { data[8] = 1; } array = ModbusUdp.ArrayAdd(addr, len, data); Data = ModbusUdp.MBReqSend_Data(array); UdpSendData(Data, Data.Length, UdpInit.RemotePoint); }
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"); } } }
/// <summary> /// 发送获取id指令 /// </summary> /// <returns></returns> public static byte[] SendGetId() { byte[] Data; //最终发送的数据 Data = ModbusUdp.MBReqUuid(); return(Data); }
public static void SendWrite(double pos) { byte[] data; ushort addr; ushort len; byte[] array; //data+addr+len byte[] Data; //最终发送的数据 pos = pos * 2400; Debug.WriteLine(pos); addr = 0; len = 10; data = new byte[len]; int num1 = 3 * (int)(pos / 50); //actionFile数组下标 int num2 = 3 * (int)(pos / 50) + 1; int num3 = 3 * (int)(pos / 50) + 2; int num4 = 2 * (int)(pos / 50); //effectFile数组下标 int num5 = 2 * (int)(pos / 50) + 1; if (num1 - timeCodeTemp > 9 && num1 - timeCodeTemp < 0) { num1 = timeCodeTemp + 3; num2 = timeCodeTemp + 4; num3 = timeCodeTemp + 5; } Debug.WriteLine(num1 + " " + num2 + " " + num3); try { if (num3 > Module.actionFile.Length) { if ("2DOF".Equals(MainWindow.PlayDOF)) { //两自由度数据 data[0] = 127; //1号缸 data[1] = 127; //2号缸 data[2] = 127; //3号缸 } else { //三自由度数据 data[0] = 0; //1号缸 data[1] = 0; //2号缸 data[2] = 0; //3号缸 } } else { data[0] = (byte)(Module.actionFile[num1] * MainWindow.PlayHeight / 100); //1号缸 data[1] = (byte)(Module.actionFile[num2] * MainWindow.PlayHeight / 100); //2号缸 data[2] = (byte)(Module.actionFile[num3] * MainWindow.PlayHeight / 100); //3号缸 //data[0] = Module.actionFile[num1]; //data[1] = Module.actionFile[num2]; //data[2] = Module.actionFile[num3]; } data[3] = 0; //4号缸 data[4] = 0; //5号缸 data[5] = 0; //6号缸 //data[6] = 0; //保留 //data[7] = 0; //保留 if (Module.shakeFile != null) { if (num5 > Module.shakeFile.Length) { data[6] = 0; //振幅 data[7] = 0; //频率 } else { data[6] = Module.shakeFile[num4]; data[7] = Module.shakeFile[num5]; } } if (num5 > Module.effectFile.Length) { data[8] = 0; //座椅特效 //data[9] = 0; //环境特效 data[9] = dataLight; } else { data[8] = Module.effectFile[num5]; //座椅特效 //data[9] = Module.effectFile[num4]; //环境特效 data[9] = (byte)(Module.effectFile[num4] | dataLight); } Debug.WriteLine((int)(3 * (pos / 50))); } catch (Exception e) { Debug.WriteLine(e); } array = ModbusUdp.ArrayAdd(addr, len, data); Data = ModbusUdp.MBReqSend_Data(array); UdpSendData(Data, Data.Length, UdpInit.RemotePoint); timeCodeTemp = num1; }
public static void SendTotalNew(double pos) { byte[] data; ushort addr; ushort len; int dmxLen; byte[] array; //data+addr+len byte[] Data; //最终发送的数据 switch (MainWindow.PlayFrame) { case 48: pos = pos * 2400; break; case 60: pos = pos * 3000; break; case 120: pos = pos * 6000; break; } //5D模式下默认使用60帧 //if (MainWindow.PlayType.Equals("5D")) //{ // pos = pos * 3000; //} Debug.WriteLine(pos); addr = 0; len = 46; data = new byte[len]; int num1 = 3 * (int)(pos / 50); //actionFile2DOF与actionFile3DOF数组下标 int num2 = 3 * (int)(pos / 50) + 1; int num3 = 3 * (int)(pos / 50) + 2; int numEffect1 = 2 * (int)(pos / 50); //effectFile与shakeFile数组下标 int numEffect2 = 2 * (int)(pos / 50) + 1; try { switch (MainWindow.PlayDOF) { case "2DOF": if (Module.actionFile2DOF != null) { if (num3 > Module.actionFile2DOF.Length) { data[0] = 127; data[1] = 127; data[2] = 127; } else { data[0] = (byte)(Module.actionFile2DOF[num1] * MainWindow.PlayHeight / 100); //1号缸 data[1] = (byte)(Module.actionFile2DOF[num2] * MainWindow.PlayHeight / 100); //2号缸 data[2] = (byte)(Module.actionFile2DOF[num3] * MainWindow.PlayHeight / 100); //3号缸 } } else { data[0] = 127; data[1] = 127; data[2] = 127; } break; case "3DOF": if (Module.actionFile3DOF != null) { if (num3 > Module.actionFile3DOF.Length) { data[0] = 0; data[1] = 0; data[2] = 0; } else { data[0] = (byte)(Module.actionFile3DOF[num1] * MainWindow.PlayHeight / 100); //1号缸 data[1] = (byte)(Module.actionFile3DOF[num2] * MainWindow.PlayHeight / 100); //2号缸 data[2] = (byte)(Module.actionFile3DOF[num3] * MainWindow.PlayHeight / 100); //3号缸 } } break; case "6DOF": int num6DOF1 = 6 * (int)(pos / 50); //actionFile6DOF数组下标 int num6DOF2 = 6 * (int)(pos / 50) + 1; int num6DOF3 = 6 * (int)(pos / 50) + 2; int num6DOF4 = 6 * (int)(pos / 50) + 3; int num6DOF5 = 6 * (int)(pos / 50) + 4; int num6DOF6 = 6 * (int)(pos / 50) + 5; if (Module.actionFile6DOF != null) { if (num6DOF6 > Module.actionFile6DOF.Length) { //六自由度数据 data[0] = 0; //1号缸 data[1] = 0; //2号缸 data[2] = 0; //3号缸 data[3] = 0; //4号缸 data[4] = 0; //5号缸 data[5] = 0; //6号缸 } else { data[0] = (byte)(Module.actionFile6DOF[num6DOF1] * MainWindow.PlayHeight / 100); //1号缸 data[1] = (byte)(Module.actionFile6DOF[num6DOF2] * MainWindow.PlayHeight / 100); //2号缸 data[2] = (byte)(Module.actionFile6DOF[num6DOF3] * MainWindow.PlayHeight / 100); //3号缸 data[3] = (byte)(Module.actionFile6DOF[num6DOF4] * MainWindow.PlayHeight / 100); //4号缸 data[4] = (byte)(Module.actionFile6DOF[num6DOF5] * MainWindow.PlayHeight / 100); //5号缸 data[5] = (byte)(Module.actionFile6DOF[num6DOF6] * MainWindow.PlayHeight / 100); //6号缸 } } break; } if (Module.shakeFile != null) { if (numEffect2 > Module.shakeFile.Length) { data[6] = 0; //振幅 data[7] = 0; //频率 } else { data[6] = Module.shakeFile[numEffect1]; data[7] = Module.shakeFile[numEffect2]; } } if (Module.effectFile != null) { if (numEffect2 > Module.effectFile.Length) { data[8] = 0; data[9] = dataLight; } else { data[8] = Module.effectFile[numEffect2]; //座椅特效 data[9] = (byte)(Module.effectFile[numEffect1] | dataLight); //环境特效 } } } catch (Exception e) { Debug.WriteLine(e.Message); } //测试选座 //if (MainWindow.imageArray.Count == 0) //{ // data[9] = 0; //} //else //{ // data[9] = (byte)MainWindow.imageArray[iii]; //} //iii = iii + 1; //if (iii >= MainWindow.imageArray.Count) //{ // iii = 0; //} if (Module.dmx512File != null) { dmxLen = 0; byte[] dataDmxLen = new byte[8]; if (Module.dmx512File.Length != 0) { for (int ii = 0; ii < 8; ii++) { dmxLen += Module.dmx512File[ii]; dataDmxLen[ii] = Module.dmx512File[ii]; } } byte[] dataDmx = new byte[dmxLen]; if (((int)(pos / 50) + 1) * dmxLen < Module.dmx512File.Length) { for (int i = 0; i < dmxLen; i++) { dataDmx[i] = (byte)Module.dmx512File[(int)(pos / 50) * dmxLen + i + 8]; } } else { dataDmx = new byte[dmxLen]; } dataDmxLen.CopyTo(data, 12); dataDmx.CopyTo(data, 20); } array = ModbusUdp.ArrayAdd(addr, len, data); Data = ModbusUdp.MBReqSend_Data(array); UdpSendData(Data, Data.Length, UdpInit.RemotePoint); }
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); } }
public void SetReceiveData(int rlen, byte[] data) { byte[] RecData; RecData = new byte[rlen]; //byte[] realData; //realData = new byte[10]; Array.Copy(data, 0, RecData, 0, rlen); if (data[0] == 0xff && data[1] == 0x68 && data[2] == 0 && data[3] == 0x0A) { } //Module.controlCommand = System.Text.Encoding.Default.GetString(RecData); //Module.WriteLogFile(Module.controlCommand +" Len:"+ Module.controlCommand.Length); //string str = System.Text.Encoding.ASCII.GetString(RecData); Debug.WriteLine(ModbusUdp.ByteToHexStr(RecData)); //Debug.WriteLine("字符长度为:" + Module.controlCommand.Length); if (RecData[0] == 0xff && RecData[1] == 0x6c) { /*保存时间码信息*/ //Array.Copy(RecData, 14, realData, 0, 10); //try //{ // string path= @"c:\" + Module.nowTimeStr+".txt"; // FileStream fs = new FileStream(path, FileMode.Append); // StreamWriter sw = new StreamWriter(fs); // string pwd = ""; // for (int i = 0; i < realData.Length; i++) // { // pwd = pwd + (realData[i].ToString("X").Length < 2 ? "0" + realData[i].ToString("X") : realData [i].ToString("X")); // } // sw.WriteLine(pwd); // sw.Close(); //} //catch (IOException ex) //{ // Console.WriteLine(ex.Message); // Console.ReadLine(); // return; //} //要发送数据格式 double hours = (RecData[6]) * 60 * 60; double minutes = (RecData[7]) * 60; double seconds = RecData[8]; double frame = 0; if (MainWindow.PlayFrame == 48) { frame = RecData[9] / 24.000; } else if (MainWindow.PlayFrame == 60) { frame = RecData[9] / 30.000; } //巴克服务器 //frame = RecData[9] / 60.000; //if (isOver39) //{ // int ii = RecData[9] + 40; // frame = ii / 60.000; // if (ii == 59) // { // isOver39 = false; // } //} //if (RecData[9] == 39) //{ // isOver39 = true; //} // s[i].ToString("X").Length < 2 ? "0" + s[i].ToString("X") : s[i].ToString("X")); string strhours = RecData[6].ToString().Length < 2 ? "0" + RecData[6].ToString() : RecData[6].ToString(); string strminutes = RecData[7].ToString().Length < 2 ? "0" + RecData[7].ToString() : RecData[7].ToString(); string strseconds = RecData[8].ToString().Length < 2 ? "0" + RecData[8].ToString() : RecData[8].ToString(); string strframe = RecData[9].ToString().Length < 2 ? "0" + RecData[9].ToString() : RecData[9].ToString(); strTimeCode = strhours + ":" + strminutes + ":" + strseconds; strLongTimeCode = strhours + ":" + strminutes + ":" + strseconds + ":" + strframe; TimeCode = hours + minutes + seconds + frame; if (isRegistered == true && isDebug == false && "4DM".Equals(MainWindow.PlayType)) { //UdpSend.SendWrite(TimeCode); UdpSend.SendTotal(TimeCode); } //UdpSend.QuDong(TimeCode); //发送驱动器指令 //UdpSend.flagSend = (byte)Mcu.ModbusUdp.MBFunctionCode.Write; } if (RecData[0] == 0xff && RecData[1] == 0x65) //判断心跳应答 { monitorTickRx = RecData[2]; } if (RecData[0] == 0xff && RecData[1] == 0x6a && RecData[2] == 0) //判断uuid应答 { uuid = ""; for (int i = 0; i < RecData[3]; i++) { uuid += ((Char)(RecData[i + 4])).ToString(); } Debug.WriteLine("uuid:" + uuid); connectFlag = true; if (uuid == Module.uuidFile) //判断uuid是否与初始的一致 { UdpSend.flagSend = (byte)ModbusUdp.MBFunctionCode.ReadChip; } //else //{ // MessageBox.Show ("uuid不正确"); //} } if (RecData[0] == 0xff && RecData[1] == 0x68) //校验日期 { //MessageBox.Show("校验日期"); //获取储存在芯片的期限时间 Module.deadlineYY = RecData[7]; Module.deadlineMM = RecData[8]; Module.deadlineDD = RecData[9]; string reyear; if (Module.deadlineYY > 9) { reyear = "20" + Module.deadlineYY; } else { reyear = "200" + Module.deadlineYY; } //string reyear = "20" + Module.deadlineYY; if (Module.deadlineMM > 31) { Module.deadlineMM = 1; } string remonth = Module.deadlineMM.ToString(); if (Module.deadlineDD > 31) { Module.deadlineDD = 1; } string reday = Module.deadlineDD.ToString(); string redate = reyear + "-" + remonth + "-" + reday; valDate = redate; //获取储存在芯片的当前时间 string yearWrite; if (RecData[10] > 9) { yearWrite = "20" + RecData[10]; } else { yearWrite = "200" + RecData[10]; } string monthWrite = RecData[11].ToString(); string dayWrite = RecData[12].ToString(); string dateWrite = yearWrite + "-" + monthWrite + "-" + dayWrite; //获取当前电脑的系统时间 DateTime dateNow = Convert.ToDateTime(DateTime.Now.ToShortDateString()); DateTime getDate, getDateWrite; try { getDate = Convert.ToDateTime(redate); getDateWrite = Convert.ToDateTime(dateWrite); } catch (Exception e) { Debug.WriteLine(e); getDate = Convert.ToDateTime(DateTime.Now.ToShortDateString()); getDateWrite = Convert.ToDateTime(DateTime.Now.ToShortDateString()); } TimeSpan ts = getDate - dateNow; TimeSpan ts1 = dateNow - getDateWrite; int getday = ts.Days; //到期时间跟电脑时间对比 int contractDay = ts1.Days; //写进芯片的当前时间跟现在电脑时间对比 if (getday < 0 || contractDay < 0) { //isRegistered = false; Module.deadlineYY = 0; Module.deadlineMM = 1; Module.deadlineDD = 1; UdpSend.flagSend = (byte)ModbusUdp.MBFunctionCode.WriteChip; } else { isRegistered = true; UdpSend.flagSend = (byte)ModbusUdp.MBFunctionCode.WriteChip; switch (getday) { case 9: //MessageBox.Show("提示:使用期限还有10天"); Module.hintShow = true; Module.deadlineDay = 10; break; case 5: //MessageBox.Show("提示:使用期限还有6天"); Module.hintShow = true; Module.deadlineDay = 5; break; case 2: // MessageBox.Show("提示:使用期限还有3天"); Module.hintShow = true; Module.deadlineDay = 3; break; case 1: // MessageBox.Show("提示:使用期限还有2天"); Module.hintShow = true; Module.deadlineDay = 2; break; case 0: Module.hintShow = true; Module.deadlineDay = 1; //MessageBox.Show("提示:使用期限还有1天"); break; default: break; } //判断日期结束发送复位数据(两自由度) //if (clickRegisterFlag == false) //{ // UdpSend.SendReset(); //} } } //校验日期结尾 RecData = ModbusUdp.MBRsp(RecData); Debug.WriteLine(ModbusUdp.ByteToHexStr(RecData)); if (RecData != null) { if (RecData[0] == 0 && RecData[1] == 0 && RecData[2] == 0x01 && RecData[3] == 0x41) { IPEndPoint i = (IPEndPoint)(UdpInit.RemotePoint); string s2 = UdpInit.RemotePoint.ToString(); string ss = i.Address.ToString(); string s1 = GetMacAddress(ss); //Debug.WriteLine(s1); if (MainWindow.PlayMac.Equals("TRUE")) { if (s1.Equals(Module.macFile[0])) { IPAddress ip = IPAddress.Parse(Module.macFile[1]); IPEndPoint ipep = new IPEndPoint(ip, 1031); UdpInit.RemotePoint = (EndPoint)(ipep); flagValue = true; //要发送数据格式 UdpSend.flagSend = (byte)ModbusUdp.MBFunctionCode.GetId; } } else { //File.WriteAllText(Directory.GetCurrentDirectory() + @"\shuqeeMac.bin", s1); StreamWriter sw = new StreamWriter(Directory.GetCurrentDirectory() + @"\shuqeeMac.bin", false, System.Text.Encoding.Default); sw.WriteLine(s1); sw.WriteLine(ss); sw.Close(); flagValue = true; //要发送数据格式 UdpSend.flagSend = (byte)ModbusUdp.MBFunctionCode.GetId; } } if (RecData[0] == 0 && RecData[1] == 0xff && RecData[2] == 0 && RecData[3] == 0x1) { while (true) { byte[] Data = new byte[8]; Data[0] = 0xff; Data[1] = 0x64; Data[2] = 0x00; Data[3] = 0x00; Data[4] = 0x01; Data[5] = 0xc8; Data[6] = 0x65; Data[7] = 0xda; UdpSend.UdpSendData(Data, Data.Length, UdpInit.BroadcastRemotePoint); 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); } }