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; 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; Com.Open(); } [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(); } } }