using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; using System.Web.ClientServices; using UAS_MES.CustomControl.DataGrid_View; using UAS_MES.DataOperate; using UAS_MES.PublicForm; using UAS_MES.PublicMethod; using System.Net; using System.IO; using System.Reflection; using System.Threading; using UAS_MES.CustomControl; using System.IO.Ports; using System.Net.Sockets; namespace UAS_MES { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //Com.PortName = "COM4"; //Com.ReadTimeout = 5000; //Com.WriteTimeout = 5000; //Com.BaudRate = 9600; //Com.StopBits = StopBits.One; //Com.Parity = Parity.None; } [DllImport("WinIo64.dll")] public static extern bool InitializeWinIo(); [DllImport("WinIo64.dll")] public static extern void ShutdownWinIo(); [DllImport("WinIo64.dll")] public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize); [DllImport("WinIo64.dll")] public static extern bool SetPortVal(IntPtr wPortAddr, int dwPortVal, byte bSize); //以下是与并口无关 [DllImport("WinIo64.dll")] public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle); [DllImport("WinIo64.dll")] public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr); [DllImport("WinIo64.dll")] public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal); [DllImport("WinIo64.dll")] public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal); [DllImport("user32.dll")] public static extern int MapVirtualKey(uint Ucode, uint uMapType); public bool online = false; //WinIo打开标志 //数据端口共8位,控制端口共4位,可以组成1~12位的任意数字输出端口; //状态端口共5位,控制端口共4位,可以组成1~9位的任意数字输入端口 private static IntPtr data_port = (IntPtr)0x378; //数据端口地址 D0-D7 8个端口 private static IntPtr state_port = (IntPtr)0x379; //状态端口地址 S3-S7 只能读取5位 private static IntPtr control_port = (IntPtr)0x37A; //控制端口地址 C0-C3 只能控制或输出4位 /// /// 设定DataPort输出 /// /// 设定值:范围为0~255 private void setDateBuff(int WriteValue) { IntPtr m_nport = data_port; //数据端口地址data_port int m_nValue = WriteValue; //调用WinIo库函数SetPortVal写端口值 SetPortVal(m_nport, m_nValue, 1); //write a BYTE value to an I/O port } /// /// 设定ControlPort输出 /// 高4位默认设置,请不要修改,因此输出时保持高位值不变,将要输出的值从低4位输出 /// Control端口C2读写正常,C0、C1、C3写入0则输出高电平,写入1输出低电平;读取亦然 /// /// 设定值 private void setControlBuff(int WriteValue) { IntPtr m_nport = control_port; //获得控制端口地址 //获得控制端口的值, int temp_dwPortVal = 0; GetPortVal(m_nport, out temp_dwPortVal, 1); //reads a BYTE value from an I/O port int temp_aa = temp_dwPortVal & 0xF0; //将低4位置为0;高4位不变 int WriValue = WriteValue & 0x0F; //取设定值低4位;高4位为0 temp_aa = temp_aa | WriteValue; //合并端口值高4位与设定值低4位 temp_aa = temp_aa ^ 0x0B; //将低4位中C0、C1、C3取反(0->1;1->0)(保证设定值与实际电平相吻合) SetPortVal(m_nport, temp_aa, 1); //写出的值中,高4位保持端口原来的值不变,低4位实际输出 } /// /// 读取ControlPort值 /// Control端口C2读取正常,C0、C1、C3高电平则读入0,低电平则读入1 /// /// 返回C0-C3 四个端口的值:范围为0~15 private int getControlBuff() { IntPtr m_nport = control_port; //控制端口地址data_port int m_nValue = 0; //调用WinIo库函数SetPortVal写端口值 GetPortVal(m_nport, out m_nValue, 1); //reads a BYTE value from an I/O port int ValueGet = m_nValue ^ 0x0B; //将低4位中C0、C1、C3取反(0->1;1->0) ValueGet = ValueGet & 0x0F; //去掉高4位值 return ValueGet; } /// /// 读取StatePort值 /// State端口S7高电平则读入0,低电平则读入1;其他正常 /// /// 返回S3-S7 五个端口的值:范围0-31 private int getStateBuff() { IntPtr m_nport = state_port; //控制端口地址state_port int dwPortVal = 0; GetPortVal(m_nport, out dwPortVal, 1); //reads a BYTE value from an I/O port int ValueGet = dwPortVal ^ 0x80; //将S7取反(保证读取与实际电平相吻合) ValueGet = ValueGet & 0xF8; //去掉S0 ~S2位; ValueGet = ValueGet >> 3; //右移3位,将S7~S3变为低5位 return ValueGet; } public bool OpenWinIo() { if (InitializeWinIo()) { this.online = true; return true; } else { this.online = false; return false; } } public void CloseWinIo() { ShutdownWinIo(); this.online = false; } SerialPort Com = new SerialPort(); private void button3_Click_1(object sender, EventArgs e) { //byte[] byteArr = new byte[20]; //Com.Write(byteArr, 0, byteArr.Length); //CloseWinIo(); } Thread threadWatch = null; //负责监听客户端的线程 Socket socketWatch = null; //负责监听客户端的套接字 //创建一个负责和客户端通信的套接字 List socConnections = new List(); List dictThread = new List(); private void button4_Click(object sender, EventArgs e) { CheckForIllegalCrossThreadCalls = false; //定义一个套接字用于监听客户端发来的信息 包含3个参数(IP4寻址协议,流式连接,TCP协议) socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //服务端发送信息 需要1个IP地址和端口号 IPAddress ipaddress = IPAddress.Parse(txtIP.Text.Trim()); //获取文本框输入的IP地址 //将IP地址和端口号绑定到网络节点endpoint上 IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(txtPORT.Text.Trim())); //获取文本框上输入的端口号 //监听绑定的网络节点 socketWatch.Bind(endpoint); //将套接字的监听队列长度限制为20 socketWatch.Listen(20); //创建一个监听线程 threadWatch = new Thread(WatchConnecting); //将窗体线程设置为与后台同步 threadWatch.IsBackground = true; //启动线程 threadWatch.Start(); //启动线程后 txtMsg文本框显示相应提示 txtMsg.AppendText("开始监听客户端传来的信息!" + "\r\n"); } private void WatchConnecting() { while (true) { byte[] data = new byte[1024]; socketWatch.Receive(data); int length = data[5]; byte[] datashow = new byte[length + 6]; Console.WriteLine(data); for (int i = 0; i <= length + 5; i++) datashow[i] = data[i]; string stringdata = BitConverter.ToString(datashow);//把数组转换成16进制字符串 Console.WriteLine(stringdata); } } } }