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);
}
}
}
}