Form1.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Drawing.Drawing2D;
  7. using System.Runtime.InteropServices;
  8. using System.Text;
  9. using System.Text.RegularExpressions;
  10. using System.Windows.Forms;
  11. using System.Windows.Forms.DataVisualization.Charting;
  12. using System.Web.ClientServices;
  13. using UAS_MES.CustomControl.DataGrid_View;
  14. using UAS_MES.DataOperate;
  15. using UAS_MES.PublicForm;
  16. using UAS_MES.PublicMethod;
  17. using System.Net;
  18. using System.IO;
  19. using System.Reflection;
  20. using System.Threading;
  21. using UAS_MES.CustomControl;
  22. using System.IO.Ports;
  23. using System.Net.Sockets;
  24. namespace UAS_MES
  25. {
  26. public partial class Form1 : Form
  27. {
  28. public Form1()
  29. {
  30. InitializeComponent();
  31. }
  32. private void Form1_Load(object sender, EventArgs e)
  33. {
  34. //Com.PortName = "COM4";
  35. //Com.ReadTimeout = 5000;
  36. //Com.WriteTimeout = 5000;
  37. //Com.BaudRate = 9600;
  38. //Com.StopBits = StopBits.One;
  39. //Com.Parity = Parity.None;
  40. }
  41. [DllImport("WinIo64.dll")]
  42. public static extern bool InitializeWinIo();
  43. [DllImport("WinIo64.dll")]
  44. public static extern void ShutdownWinIo();
  45. [DllImport("WinIo64.dll")]
  46. public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize);
  47. [DllImport("WinIo64.dll")]
  48. public static extern bool SetPortVal(IntPtr wPortAddr, int dwPortVal, byte bSize);
  49. //以下是与并口无关
  50. [DllImport("WinIo64.dll")]
  51. public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle);
  52. [DllImport("WinIo64.dll")]
  53. public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr);
  54. [DllImport("WinIo64.dll")]
  55. public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);
  56. [DllImport("WinIo64.dll")]
  57. public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);
  58. [DllImport("user32.dll")]
  59. public static extern int MapVirtualKey(uint Ucode, uint uMapType);
  60. public bool online = false; //WinIo打开标志
  61. //数据端口共8位,控制端口共4位,可以组成1~12位的任意数字输出端口;
  62. //状态端口共5位,控制端口共4位,可以组成1~9位的任意数字输入端口
  63. private static IntPtr data_port = (IntPtr)0x378; //数据端口地址 D0-D7 8个端口
  64. private static IntPtr state_port = (IntPtr)0x379; //状态端口地址 S3-S7 只能读取5位
  65. private static IntPtr control_port = (IntPtr)0x37A; //控制端口地址 C0-C3 只能控制或输出4位
  66. /// <summary>
  67. /// 设定DataPort输出
  68. /// </summary>
  69. /// <param name="WriteValue">设定值:范围为0~255</param>
  70. private void setDateBuff(int WriteValue)
  71. {
  72. IntPtr m_nport = data_port; //数据端口地址data_port
  73. int m_nValue = WriteValue;
  74. //调用WinIo库函数SetPortVal写端口值
  75. SetPortVal(m_nport, m_nValue, 1); //write a BYTE value to an I/O port
  76. }
  77. /// <summary>
  78. /// 设定ControlPort输出
  79. /// 高4位默认设置,请不要修改,因此输出时保持高位值不变,将要输出的值从低4位输出
  80. /// Control端口C2读写正常,C0、C1、C3写入0则输出高电平,写入1输出低电平;读取亦然
  81. /// </summary>
  82. /// <param name="WriteValue">设定值</param>
  83. private void setControlBuff(int WriteValue)
  84. {
  85. IntPtr m_nport = control_port; //获得控制端口地址
  86. //获得控制端口的值,
  87. int temp_dwPortVal = 0;
  88. GetPortVal(m_nport, out temp_dwPortVal, 1); //reads a BYTE value from an I/O port
  89. int temp_aa = temp_dwPortVal & 0xF0; //将低4位置为0;高4位不变
  90. int WriValue = WriteValue & 0x0F; //取设定值低4位;高4位为0
  91. temp_aa = temp_aa | WriteValue; //合并端口值高4位与设定值低4位
  92. temp_aa = temp_aa ^ 0x0B; //将低4位中C0、C1、C3取反(0->1;1->0)(保证设定值与实际电平相吻合)
  93. SetPortVal(m_nport, temp_aa, 1); //写出的值中,高4位保持端口原来的值不变,低4位实际输出
  94. }
  95. /// <summary>
  96. /// 读取ControlPort值
  97. /// Control端口C2读取正常,C0、C1、C3高电平则读入0,低电平则读入1
  98. /// </summary>
  99. /// <returns>返回C0-C3 四个端口的值:范围为0~15</returns>
  100. private int getControlBuff()
  101. {
  102. IntPtr m_nport = control_port; //控制端口地址data_port
  103. int m_nValue = 0;
  104. //调用WinIo库函数SetPortVal写端口值
  105. GetPortVal(m_nport, out m_nValue, 1); //reads a BYTE value from an I/O port
  106. int ValueGet = m_nValue ^ 0x0B; //将低4位中C0、C1、C3取反(0->1;1->0)
  107. ValueGet = ValueGet & 0x0F; //去掉高4位值
  108. return ValueGet;
  109. }
  110. /// <summary>
  111. /// 读取StatePort值
  112. /// State端口S7高电平则读入0,低电平则读入1;其他正常
  113. /// </summary>
  114. /// <returns>返回S3-S7 五个端口的值:范围0-31</returns>
  115. private int getStateBuff()
  116. {
  117. IntPtr m_nport = state_port; //控制端口地址state_port
  118. int dwPortVal = 0;
  119. GetPortVal(m_nport, out dwPortVal, 1); //reads a BYTE value from an I/O port
  120. int ValueGet = dwPortVal ^ 0x80; //将S7取反(保证读取与实际电平相吻合)
  121. ValueGet = ValueGet & 0xF8; //去掉S0 ~S2位;
  122. ValueGet = ValueGet >> 3; //右移3位,将S7~S3变为低5位
  123. return ValueGet;
  124. }
  125. public bool OpenWinIo()
  126. {
  127. if (InitializeWinIo())
  128. {
  129. this.online = true;
  130. return true;
  131. }
  132. else
  133. {
  134. this.online = false;
  135. return false;
  136. }
  137. }
  138. public void CloseWinIo()
  139. {
  140. ShutdownWinIo();
  141. this.online = false;
  142. }
  143. SerialPort Com = new SerialPort();
  144. private void button3_Click_1(object sender, EventArgs e)
  145. {
  146. //byte[] byteArr = new byte[20];
  147. //Com.Write(byteArr, 0, byteArr.Length);
  148. //CloseWinIo();
  149. }
  150. Thread threadWatch = null; //负责监听客户端的线程
  151. Socket socketWatch = null; //负责监听客户端的套接字
  152. //创建一个负责和客户端通信的套接字
  153. List<Socket> socConnections = new List<Socket>();
  154. List<Thread> dictThread = new List<Thread>();
  155. private void button4_Click(object sender, EventArgs e)
  156. {
  157. CheckForIllegalCrossThreadCalls = false;
  158. //定义一个套接字用于监听客户端发来的信息 包含3个参数(IP4寻址协议,流式连接,TCP协议)
  159. socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  160. //服务端发送信息 需要1个IP地址和端口号
  161. IPAddress ipaddress = IPAddress.Parse(txtIP.Text.Trim()); //获取文本框输入的IP地址
  162. //将IP地址和端口号绑定到网络节点endpoint上
  163. IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(txtPORT.Text.Trim())); //获取文本框上输入的端口号
  164. //监听绑定的网络节点
  165. socketWatch.Bind(endpoint);
  166. //将套接字的监听队列长度限制为20
  167. socketWatch.Listen(20);
  168. //创建一个监听线程
  169. threadWatch = new Thread(WatchConnecting);
  170. //将窗体线程设置为与后台同步
  171. threadWatch.IsBackground = true;
  172. //启动线程
  173. threadWatch.Start();
  174. //启动线程后 txtMsg文本框显示相应提示
  175. txtMsg.AppendText("开始监听客户端传来的信息!" + "\r\n");
  176. }
  177. private void WatchConnecting()
  178. {
  179. while (true)
  180. {
  181. byte[] data = new byte[1024];
  182. socketWatch.Receive(data);
  183. int length = data[5];
  184. byte[] datashow = new byte[length + 6];
  185. Console.WriteLine(data);
  186. for (int i = 0; i <= length + 5; i++)
  187. datashow[i] = data[i];
  188. string stringdata = BitConverter.ToString(datashow);//把数组转换成16进制字符串
  189. Console.WriteLine(stringdata);
  190. }
  191. }
  192. }
  193. }