

















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.Windows.Forms;namespace TCPClient{ public partial class Form1 : Form { private Thread ConnectThread;//連接線程 private IPAddress ipAddress;//ip地址 int Port = 0;//端口號 Boolean ConnectFlage = false;//連接標志 private TcpClient myTcpClient = null;// TcpClient private delegate void ButtonConnectDelegate(string str);//定義連接按鈕回調 ButtonConnectDelegate buttonConnectDelegate; private delegate void ShowReMsgTcpDelegate(byte[] by);//定義顯示TCP接收消息回調 private ShowReMsgTcpDelegate showReMsgTcpDelegate; private NetworkStream networkstrem = null;//網絡數據流 private Thread ReceiveThread;//接收消息線程 private Thread ShowDataThread;//顯示任務,點擊Hex顯示時 private delegate void ShowSeMsgTcpDelegate(byte[] by);//定義顯示TCP發送消息回調 private ShowSeMsgTcpDelegate showSeMsgTcpDelegate; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { timer1.Stop();//啟動定時器 buttonConnectDelegate = new ButtonConnectDelegate(buttonConnectMethod);//實例化 showReMsgTcpDelegate = new ShowReMsgTcpDelegate(ShowReMsgTcpMethod);//實例化顯示回調 showSeMsgTcpDelegate = new ShowSeMsgTcpDelegate(showSeMsgTcpMethod);//實例化發送回調 getIPAddress(); } /// <獲取本機 IP 地址> /// /// </summary> /// <returns></returns> private void getIPAddress() { IPAddress[] hostipspool = Dns.GetHostAddresses(""); comboBoxIPAdress.Items.Clear(); foreach (IPAddress ipa in hostipspool) { if (ipa.AddressFamily == AddressFamily.InterNetwork) { comboBoxIPAdress.Items.Add(ipa.ToString()); comboBoxIPAdress.SelectedIndex = comboBoxIPAdress.Items.Count > 0 ? 0 : -1; } } } /// <點擊IP下拉框> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void comboBoxIPAdress_DropDown(object sender, EventArgs e) { getIPAddress(); } /// <連接點擊事件> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonConnect_Click(object sender, EventArgs e) { if (ConnectFlage == false) { if (string.IsNullOrEmpty(comboBoxIPAdress.Text) == false) { ipAddress = IPAddress.Parse(comboBoxIPAdress.Text);//獲取IP地址 Port = Convert.ToInt32(textBoxPort.Text); //獲取端口號 ConnectThread = new Thread(ConnectMethod); ConnectThread.Start(); } else { MessageBox.Show("請檢查IP地址!", "提示"); } } else { //斷開處理函數 ConnectFlage = false; buttonConnect.Invoke(buttonConnectDelegate, "連接"); try { ReceiveThread.Abort(); } catch { } try { networkstrem.Dispose(); } catch { } try { myTcpClient.Close(); } catch { } } } /// <連接線程方法> /// /// </summary> private void ConnectMethod() { myTcpClient = new TcpClient(); //實例化myTcpClient try { myTcpClient.Connect(ipAddress, Port);//連接服務器 networkstrem = myTcpClient.GetStream();//獲取數據流 ReceiveThread = new Thread(ReceiveDataMethod);//啟動接收數據任務 ReceiveThread.Start(); buttonConnect.Invoke(buttonConnectDelegate, "斷開"); ConnectFlage = true; } catch (Exception) { //異常處理函數 ConnectFlage = false; buttonConnect.Invoke(buttonConnectDelegate, "連接"); try { ReceiveThread.Abort(); }//銷毀任務 catch { } try { networkstrem.Dispose(); }//釋放資源 catch { } try { myTcpClient.Close(); }//關閉TCP catch { } } } /// <打開按鈕回調函數> /// /// </summary> private void buttonConnectMethod(string str) { if (str == "斷開") { timer1.Enabled = true; timer1.Start();//啟動定時器 } else { timer1.Enabled = false; timer1.Stop();//停止定時器 } buttonConnect.Text = str; } /// <顯示串口接收到的信息--回調函數> /// /// </summary> private void ShowReMsgTcpMethod(byte[] by) { string getMsg = string.Empty; if (checkBoxHexShow.Checked)//16進制顯示 { getMsg = byteToHexStr(by); //用到函數byteToHexStr--字節數組轉16進制字符串 } else { getMsg = new ASCIIEncoding().GetString(by); } textBoxDataRes.AppendText(getMsg); } private void showSeMsgTcpMethod(byte[] by) { string getMsg = string.Empty; if (checkBoxHexSend.Checked)//16進制顯示 { getMsg = byteToHexStr(by); //用到函數byteToHexStr--字節數組轉16進制字符串 } else { getMsg = new ASCIIEncoding().GetString(by); } textBoxSend.AppendText(getMsg); } /// <字節數組轉16進制字符串> /// /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static string byteToHexStr(byte[] bytes) { string returnStr = ""; try { if (bytes != null) { for (int i = 0; i < bytes.Length; i++) { returnStr += bytes.ToString("X2"); } } return returnStr; } catch (Exception) { return returnStr; } } /// <接收消息線程> /// /// </summary> private void ReceiveDataMethod() { int RecvCnt = 0; byte[] recvBytes = new byte[1024]; while (true) { try { if ((myTcpClient.Client.Poll(20, SelectMode.SelectRead)) && (myTcpClient.Client.Available == 0)) { myTcpClient.Close();//引發異常 } RecvCnt = networkstrem.Read(recvBytes, 0, recvBytes.Length); byte[] receive = new byte[RecvCnt];//設置緩沖區 RecvCnt 個字節 for (int i = 0; i < receive.Length; i++) { receive = recvBytes; } textBoxDataRes.Invoke(showReMsgTcpDelegate, receive); } catch (Exception) { //異常處理函數 ConnectFlage = false; buttonConnect.Invoke(buttonConnectDelegate, "連接"); try { ReceiveThread.Abort(); }//銷毀任務 catch { } try { networkstrem.Dispose(); }//釋放資源 catch { } try { myTcpClient.Close(); }//關閉TCP catch { } } } } /// <發送按鈕點擊事件> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonSend_Click(object sender, EventArgs e) { if (!checkBoxHexSend.Checked)//字符發送 { byte[] sendbyte = Encoding.Default.GetBytes(textBoxSend.Text); try { networkstrem.Write(sendbyte, 0, sendbyte.Length); } catch (Exception) { MessageBox.Show("請檢查連接", "提示!"); } } else//16形式進制發送 { byte[] sendbyte = strToToHexByte(textBoxSend.Text);//字符串轉16進制格式,不夠自動前面補零 try { networkstrem.Write(sendbyte, 0, sendbyte.Length); } catch (Exception) { MessageBox.Show("請檢查連接", "提示!"); } } } /// <字符串轉16進制格式,不夠自動前面補零> /// /// </summary> /// <param name="hexString"></param> /// <returns></returns> private static byte[] strToToHexByte(String hexString) { int i; bool Flag = false; hexString = hexString.Replace(" ", "");//清除空格 if ((hexString.Length % 2) != 0) { Flag = true; } if (Flag == true) { byte[] returnBytes = new byte[(hexString.Length + 1) / 2]; try { for (i = 0; i < (hexString.Length - 1) / 2; i++) { returnBytes = Convert.ToByte(hexString.Substring(i * 2, 2), 16); } returnBytes[returnBytes.Length - 1] = Convert.ToByte(hexString.Substring(hexString.Length - 1, 1).PadLeft(2, '0'), 16); } catch { for (i = 0; i < returnBytes.Length; i++) { returnBytes = 0; } MessageBox.Show("超過16進制范圍A-F,已初始化為0", "提示"); } return returnBytes; } else { byte[] returnBytes = new byte[(hexString.Length) / 2]; try { for (i = 0; i < returnBytes.Length; i++) { returnBytes = Convert.ToByte(hexString.Substring(i * 2, 2), 16); } } catch { for (i = 0; i < returnBytes.Length; i++) { returnBytes = 0; } MessageBox.Show("超過16進制范圍A-F,已初始化為0", "提示"); } return returnBytes; } } /// <字符串轉換成字節數組> /// /// </summary> /// <param name="stringToConvert"></param> /// <returns></returns> public static byte[] StringToByte(string stringToConvert) { return (new ASCIIEncoding()).GetBytes(stringToConvert); } /// <發送Hex和字符串選擇> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void checkBoxHexSend_CheckedChanged(object sender, EventArgs e) { if (checkBoxHexSend.Checked) { try { byte[] by = StringToByte(textBoxSend.Text); textBoxSend.Clear(); textBoxSend.BeginInvoke(showSeMsgTcpDelegate, by); } catch (Exception) { //MessageBox.Show(ex.ToString()); } } else { try { byte[] by = strToToHexByte(textBoxSend.Text); textBoxSend.Clear(); textBoxSend.BeginInvoke(showSeMsgTcpDelegate, by); } catch (Exception) { //MessageBox.Show(ex.ToString()); } } } /// <接收Hex和字符串選擇> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void checkBoxHexShow_CheckedChanged(object sender, EventArgs e) { if (checkBoxHexShow.Checked) { try { byte[] by = StringToByte(textBoxDataRes.Text); textBoxDataRes.BeginInvoke(showReMsgTcpDelegate, by); } catch (Exception) { //MessageBox.Show(ex.ToString()); } } else { try { byte[] by = strToToHexByte(textBoxDataRes.Text); textBoxDataRes.Clear(); textBoxDataRes.BeginInvoke(showReMsgTcpDelegate, by); } catch (Exception) { //MessageBox.Show(ex.ToString()); } } } /// <清除接收> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonClearRecv_Click(object sender, EventArgs e) { textBoxDataRes.Clear(); } /// <清除發送> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonClearSend_Click(object sender, EventArgs e) { textBoxSend.Clear(); } /// <設置DA輸出> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void trackBarDAout_Scroll(object sender, EventArgs e) { textBoxDAout.Text = trackBarDAout.Value.ToString(); } /// <CRC 效驗 > /// /// </summary> /// <param name="modbusdata"></param> /// <param name="length"></param> /// <returns></returns> private int crc16_modbus(byte[] modbusdata, int length) { int i, j; int crc = 0xffff; try { for (i = 0; i < length; i++) { crc ^= modbusdata; for (j = 0; j < 8; j++) { if ((crc & 0x01) == 1) { crc = (crc >> 1) ^ 0xa001; } else { crc >>= 1; } } } } catch (Exception) { throw; } return crc; } /* modbusdata 要校驗的數據 length 數據長度 返回值 1 正確 0 錯誤 */ private int crc16_flage(byte[] modbusdata, int length) { int Receive_CRC = 0, calculation = 0;//接收到的CRC,計算的CRC Receive_CRC = crc16_modbus(modbusdata, length); calculation = modbusdata[length + 1]; calculation <<= 8; calculation += modbusdata[length]; if (calculation != Receive_CRC) { return 0; } return 1; } /// <定時發送事件> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void timer1_Tick(object sender, EventArgs e) { byte[] sendbyte = new byte[3]; sendbyte[0] = 0xaa; sendbyte[1] = 0x55; sendbyte[2] = 0x01; SerialSend(sendbyte); } /// <網絡發送數據函數> /// /// </summary> /// <param name="sendbyte"></param> private void SerialSend(byte[] byt) { int crc = 0; byte[] sendbyte = new byte[byt.Length + 2]; for (int i = 0; i < byt.Length; i++) { sendbyte = byt; } crc = crc16_modbus(byt, byt.Length);//計算CRC byte[] Crcbyte = System.BitConverter.GetBytes(crc);//得到CRC sendbyte[sendbyte.Length - 2] = Crcbyte[0]; sendbyte[sendbyte.Length - 1] = Crcbyte[1]; try { networkstrem.Write(sendbyte, 0, sendbyte.Length); } catch (Exception) { //異常處理函數 ConnectFlage = false; timer1.Stop();//停止定時器 buttonConnect.Invoke(buttonConnectDelegate, "連接"); try { ReceiveThread.Abort(); }//銷毀任務 catch { } try { networkstrem.Dispose(); }//釋放資源 catch { } try { myTcpClient.Close(); }//關閉TCP catch { } MessageBox.Show("請檢查連接", "提示!"); } } }}




| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |