通讯方式

mac2022-06-30  74

串口通讯:

using CommunicationInterfaceForm.Script; using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CommunicationInterfaceForm {     public partial class MainForm : Form     {         public SerialPort com = new SerialPort();         //定义端口类         private SerialPort ComDevice = new SerialPort();         private SqlConnDB sqlcline = new SqlConnDB();         public MainForm()         {             InitializeComponent();             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;             //初始化数据             comboBox2.Text = "9600";             comboBox5.Text = "0";             comboBox3.Text = "8";             comboBox4.Text = "1";             InitralConfig(int.Parse(comboBox2.Text));         }         /// <summary>         /// 从注册表获取系统串口列表         /// </summary>         public string[] GetComList()         {             RegistryKey keyCom = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm");             string[] sSubKeys = keyCom.GetValueNames();             string[] str = new string[sSubKeys.Length];             for (int i = 0; i < sSubKeys.Length; i++)             {                 str[i] = (string)keyCom.GetValue(sSubKeys[i]);             }             return str;         }         /// <summary>         /// 配置初始化         /// </summary>         private void InitralConfig(int btl)         {             Boolean open = false;             string[] coms = GetComList();             for (int i = 0; i < coms.Length; i++)             {                 open = false;                 if (com.IsOpen)                 {                     com.Close();                 }                 comboBox1.Items.Add(coms[i]);             }             if (comboBox1.Items.Count >= 0) {                 comboBox1.SelectedIndex = 0;             }             //向ComDevice.DataReceived(是一个事件)注册一个方法Com_DataReceived,当端口类接收到信息时时会自动调用Com_DataReceived方法             ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);         }         /// <summary>         /// 一旦ComDevice.DataReceived事件发生,就将从串口接收到的数据显示到接收端对话框         /// </summary>         /// <param name="sender"></param>         /// <param name="sender"></param>         /// <param name="sender"></param>         /// <param name="e"></param>         private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)         {             //开辟接收缓冲区             byte[] ReDatas = new byte[ComDevice.BytesToRead];             //从串口读取数据             ComDevice.Read(ReDatas, 0, ReDatas.Length);             //实现数据的解码与显示             AddData(ReDatas);         }         /// <summary>         /// 解码过程         /// </summary>         /// <param name="data">串口通信的数据编码方式因串口而异,需要查询串口相关信息以获取</param>         public void AddData(byte[] data)         {             StringBuilder sb = new StringBuilder();             for (int i = 0; i < data.Length; i++)             {                 sb.AppendFormat("{0:x2}" + " ", data[i]);             }             AddContent(sb.ToString());//.ToUpper()         }         /// <summary>         /// 接收端对话框显示消息         /// </summary>         /// <param name="content"></param>         private void AddContent(string content)         {             BeginInvoke(new MethodInvoker(delegate             {                 textBox1.AppendText(content);             }));             //将数据保存到数据库             if (!string.IsNullOrWhiteSpace(content))             {                 string sql = string.Format("insert into test (Content,Equipment) values ('{0}','假装是设备')", content);                 int a = sqlcline.update(sql);                 if (a == -1)                 {                     MessageBox.Show("连接数据库错误");                 }             }         }         /// <summary>         /// 串口开关         /// </summary>         /// <param name="sender"></param>         /// <param name="e"></param>         private void button1_Click(object sender, EventArgs e)         {             if (comboBox1.Items.Count <= 0)             {                 MessageBox.Show("未发现可用串口,请检查硬件设备");                 return;             }                         if (ComDevice.IsOpen == false)             {                 //设置串口相关属性                 ComDevice.PortName = comboBox1.Text;                 ComDevice.BaudRate = Convert.ToInt32(comboBox2.Text);                 ComDevice.Parity = (Parity)Convert.ToInt32(comboBox5.Text);                 ComDevice.DataBits = Convert.ToInt32(comboBox3.Text);                 ComDevice.StopBits = (StopBits)Convert.ToInt32(comboBox4.Text);                 try                 {                     //开启串口                     ComDevice.Open();                     button2.Enabled = true;                     button1.Text = "关闭";                     //接收数据                     ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);                 }                 catch (Exception ex)                 {                     MessageBox.Show(ex.Message, "未能成功开启串口", MessageBoxButtons.OK, MessageBoxIcon.Error);                     return;                 }             }             else             {                 try                 {                     ComDevice.Close();                     button2.Enabled = false;                 }                 catch (Exception ex)                 {                     MessageBox.Show(ex.Message, "串口关闭错误", MessageBoxButtons.OK, MessageBoxIcon.Error);                 }                 button1.Text = "开启";             }             comboBox1.Enabled = !ComDevice.IsOpen;             comboBox2.Enabled = !ComDevice.IsOpen;             comboBox3.Enabled = !ComDevice.IsOpen;             comboBox4.Enabled = !ComDevice.IsOpen;             comboBox5.Enabled = !ComDevice.IsOpen;         }         /// <summary>         /// 将消息编码并发送         /// </summary>         /// <param name="sender"></param>         /// <param name="e"></param>         private void button2_Click(object sender, EventArgs e)         {             byte[] sendData = null;             sendData = Hex16StringToHex16Byte(textBox1.Text);             SendData(sendData);         }         /// <summary>         /// 此方法用于将16进制的字符串转换成16进制的字节数组         /// </summary>         /// <param name="_hex16ToString">要转换的16进制的字符串。</param>         public static byte[] Hex16StringToHex16Byte(string _hex16String)         {             //去掉字符串中的空格。             _hex16String = _hex16String.Replace(" ", "");             if (_hex16String.Length / 2 == 0)             {                 _hex16String += " ";             }             //声明一个字节数组,其长度等于字符串长度的一半。             byte[] buffer = new byte[_hex16String.Length / 2];             for (int i = 0; i < buffer.Length; i++)             {                 //为字节数组的元素赋值。                 buffer[i] = Convert.ToByte((_hex16String.Substring(i * 2, 2)), 16);             }             //返回字节数组。             return buffer;         }         /// <summary>         /// 此函数将编码后的消息传递给串口         /// </summary>         /// <param name="data"></param>         /// <returns></returns>         public bool SendData(byte[] data)         {             if (ComDevice.IsOpen)             {                 try                 {                     //将消息传递给串口                     ComDevice.Write(data, 0, data.Length);                     return true;                 }                 catch (Exception ex)                 {                     MessageBox.Show(ex.Message, "发送失败", MessageBoxButtons.OK, MessageBoxIcon.Error);                 }             }             else             {                 MessageBox.Show("串口未开启", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);             }             return false;         }         /// <summary>         /// 16进制编码         /// </summary>         /// <param name="hexString"></param>         /// <returns></returns>         private byte[] strToHexByte(string hexString)         {             hexString = hexString.Replace(" ", "");             if ((hexString.Length % 2) != 0) hexString += " ";             byte[] returnBytes = new byte[hexString.Length / 2];             for (int i = 0; i < returnBytes.Length; i++)                 returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Replace(" ", ""), 16);             return returnBytes;         }            } }  socket通讯 using httpClient.script; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.NetworkInformation; using System.Management; namespace httpClient {     enum AgreeType     {         UDP,         TCP     }     public partial class Form1 : Form     {         private static SqlConnDB sqlcline = new SqlConnDB();         TCPClient tc = new TCPClient();         private static byte[] result = new byte[1024];         static Socket serverSocket;         Thread myThread;         //udp的socket         private static Socket udpServer;         //tcp的socket         private static Socket clientSocket;         public Form1()         {             InitializeComponent();             comboBox1.SelectedIndex = 0;             comboBox3.Items.Add(GetAddressIP());             comboBox3.SelectedIndex = 0;         }         /// <summary>         /// 获取本地IP         /// </summary>         /// <returns></returns>         private string GetAddressIP()         {             string AddressIP = string.Empty;             foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)             {                 if (_IPAddress.AddressFamily.ToString() == "InterNetwork")                 {                     AddressIP = _IPAddress.ToString();                 }             }             return AddressIP;         }         private void button1_Click(object sender, EventArgs e)         {             if (string.Equals(button1.Text, "连接"))             {                 switch (comboBox1.SelectedIndex)                 {                     case (int)AgreeType.TCP:                         //服务器IP地址                                    IPAddress ip = IPAddress.Parse(GetAddressIP());                         serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                         serverSocket.Bind(new IPEndPoint(ip, Convert.ToInt32(textBox2.Text)));                         //绑定IP地址:端口                                    serverSocket.Listen(10);                         //设定最多10个排队连接请求                                   textBox1.AppendText(string.Format("启动监听{0}成功", serverSocket.LocalEndPoint.ToString()));                         //通过Clientsoket发送数据                                    myThread = new Thread(ListenClientConnect);                         myThread.Start();                         //ListenClientConnect();                         break;                     case (int)AgreeType.UDP:                         //1.Socket creat                                    udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);                         //2.Bind ip and port                                    udpServer.Bind(new IPEndPoint(IPAddress.Parse(GetAddressIP()),Convert.ToInt32(textBox2.Text)));                         //3.receive data                                    new Thread(UdpRecivceMsg) {IsBackground = true}.Start();                         break;                     default:                         break;                 }                 button1.Text = "关闭";                 comboBox1.Enabled = false;                 comboBox3.Enabled = false;                 textBox2.Enabled = false;             }else             {                 button1.Text = "连接";                 comboBox1.Enabled = true;                 comboBox3.Enabled = true;                 textBox2.Enabled = true;                 if (string.Equals(comboBox1.Text, "TCP"))                 {                     close();                 }                 if (string.Equals(comboBox1.Text, "UDP"))                 {                     udpServer.Close();                 }             }         }         #region udp实例         private void UdpSendMsg(string msg)         {             Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);             EndPoint serverPoint = new IPEndPoint(IPAddress.Parse(GetAddressIP()), 9999);             byte[] data = Encoding.UTF8.GetBytes(msg);             udpClient.SendTo(data, serverPoint);         }           /// <summary>         /// 接收数据         /// </summary>         private static void UdpRecivceMsg()         {             while (true)             {                 EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);                 byte[] data = new byte[1024];                 //MessageBox.Show("1111");                 int length = udpServer.ReceiveFrom(data, ref remoteEndPoint);                 //将数据保存到数据库                                 //MessageBox.Show("eee");                 //此方法把数据来源ip、port放到第二个参数中                                string message = Encoding.UTF8.GetString(data, 0, length);                 MessageBox.Show("从ip" + (remoteEndPoint as IPEndPoint).Address.ToString() + ":" + (remoteEndPoint as IPEndPoint).Port + "Get" + message);                 if (!string.IsNullOrWhiteSpace(message))                 {                     string sql = string.Format("insert into test (Content,Equipment) values ('{0}','假装是设备')", message);                     int a = sqlcline.update(sql);                     if (a == -1)                     {                         MessageBox.Show("连接数据库错误");                     }                 }             }         }         #endregion         #region tcp实例         /// <summary>               /// /// 监听客户端连接                /// /// </summary>                private static void ListenClientConnect()         {             while (true)             {                 clientSocket = serverSocket.Accept();                 clientSocket.Send(Encoding.ASCII.GetBytes("Hello,welcome to my new world!"));                 Thread receiveThread = new Thread(ReceiveMessage);                 receiveThread.Start(clientSocket);             }         }         /// <summary>               ///  发送消息                /// </summary>         private static void SendMessage(string msg)         {             clientSocket.Send(Encoding.ASCII.GetBytes(msg));         }         /// <summary>                /// /// 接收消息                /// /// </summary>                /// /// <param name="clientSocket"></param>                private static void ReceiveMessage(object clientSocket)         {             Socket myClientSocket = (Socket)clientSocket;             while (true)             {                 try                 {                     //通过clientSocket接收数据                                        int receiveNumber = myClientSocket.Receive(result);                     MessageBox.Show(string.Format("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber)));                     if (!string.IsNullOrWhiteSpace(Encoding.ASCII.GetString(result, 0, receiveNumber)))                     {                         string sql = string.Format("insert into test (Content,Equipment) values ('{0}','假装是设备')", Encoding.ASCII.GetString(result, 0, receiveNumber));                         int a = sqlcline.update(sql);                         if (a == -1)                         {                             MessageBox.Show("连接数据库错误");                         }                     }                 }                 catch (Exception ex)                 {                     MessageBox.Show(ex.Message);                     myClientSocket.Shutdown(SocketShutdown.Both);                     myClientSocket.Close();                     break;                 }             }         }                 public void close()         {             serverSocket.Close();             myThread.Abort();         }         #endregion         private void button2_Click(object sender, EventArgs e)         {             if (string.Equals(comboBox1.Text,"TCP")) {                 SendMessage(textBox1.Text);             }             else {                 UdpSendMsg(textBox1.Text);             }         }             } }

转载于:https://www.cnblogs.com/ganzhihui/p/11531510.html

最新回复(0)