Socket通信 和 串口通信 (有人的硬件)


 硬件采用的是“有人公司”的串口轉wifi模塊。該模塊可以實現串口透傳。

 軟件如下

硬件模塊設置為 TCP Server  

using System;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;

namespace Socket串口
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 打開軟件加載項目
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmMain_Load(object sender, EventArgs e)
        {
            SerialPort();//加載系統當前可用的串口
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        #region 串口部分

        #region 定義變量

        SerialPort sp = new SerialPort();
        bool isOpen = false;//打開串口標志位

        #endregion
        /// <summary>
        /// 加載當前系統當中可用的串口
        /// </summary>
        void SerialPort()
        {
            string[] ports = System.IO.Ports.SerialPort.GetPortNames();
            if (ports == null)
            {
                MessageBox.Show("本機沒有串口!");
            }
            foreach (string port in System.IO.Ports.SerialPort.GetPortNames())
            {
                cbx_Port.Items.Add(port);
            }
            //添加波特率
            cbx_Baude_Rate.Items.Add("1200");
            cbx_Baude_Rate.Items.Add("2400");
            cbx_Baude_Rate.Items.Add("4800");
            cbx_Baude_Rate.Items.Add("9600");
            cbx_Baude_Rate.Items.Add("19200");
            cbx_Baude_Rate.Items.Add("38400");
            cbx_Baude_Rate.Items.Add("43000");
            cbx_Baude_Rate.Items.Add("56000");
            cbx_Baude_Rate.Items.Add("57600");
            cbx_Baude_Rate.Items.Add("115200");

            cbx_Baude_Rate.SelectedIndex = 3;
            cbx_Port.SelectedIndex = 0;

        }

        #region 打開和關閉串口資源

        private void SetPortProperty()
        {

            sp.PortName = cbx_Port.Text.Trim();
            sp.BaudRate = Convert.ToInt32(cbx_Baude_Rate.Text.Trim());
            sp.StopBits = StopBits.One;
            sp.DataBits = Convert.ToInt16(8);
            sp.Parity = Parity.None;
            sp.ReadTimeout = -1;//超讀時間
            sp.RtsEnable = true;
            //定義一個串口接受數據 觸發事件
            sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
        }
        void openSerialPort()
        {
            try
            {
                sp.Open();
            }
            catch
            {
                MessageBox.Show("打開失敗!");
            }

        }
        void closeSerialPort()
        {
            try
            {
                sp.Close();
            }
            catch
            {
                MessageBox.Show("關閉失敗!");
            }

        }

        private void btn_Open_Port_Click(object sender, EventArgs e)
        {
            if (isOpen == false)
            {
                SetPortProperty();
                openSerialPort();
                isOpen = true;

            }
        }

        /// <summary>
        /// 串口接收字符事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string ReadStr = "";
            ReadStr = sp.ReadExisting();
            Show_Port_Msg(socketSend.RemoteEndPoint + ":" + ReadStr);
        }
        void Show_Port_Msg(string str)
        { 
            if(txt_Port_Recv.TextLength>300)
            {
                txt_Port_Recv.Clear();
            }
            txt_Port_Recv.AppendText(str + "\r\n");
        }


        private void btn_Close_Port_Click(object sender, EventArgs e)
        {
            if (isOpen == true)
            {
                closeSerialPort();
                isOpen = true;
                sp.Dispose();
            }
        }

        #endregion
        /// <summary>
        /// 在串口接收窗口顯示當前接收到的數據
        /// </summary>
        /// <param name="a">接收到的具體數據</param>
        public void ShowTxt(string a)
        {
            this.txt_Port_Recv.AppendText(DateTime.Now.ToString() + " | " + a + "\n");
            if (txt_Port_Recv.TextLength > 300)
            {
                txt_Port_Recv.Clear();
            }
        }

        #region 發送窗口是否有數據 bool類型  CheckSendData()
        private bool CheckSendData()//檢查發送數據窗口是否有數據
        {
            if (txt_Port_Send.Text.Trim() == "") return false;
            return true;
        }

        private void btn_Com_Port_Send_Click(object sender, EventArgs e)
        {
            try
            {
                if (isOpen)
                {
                    string str = txt_Port_Send.Text.Trim();
                    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
                    sp.WriteLine(str);
                }
                else
                {
                    MessageBox.Show("請打開串口!");
                }
            }

            catch { }
        }
        #endregion

        #region  發送串口數據  btn_Send_Click事件

        private void btnSend_Click(object sender, EventArgs e)//發送串口數據
        {
            if (isOpen)//寫串口數據
            {
                if (!CheckSendData())//檢測要發送的數據
                {
                    MessageBox.Show("請輸入要發送的數據!", "錯誤提示");
                    return;
                }
                else
                {
                    try
                    {
                        sp.WriteLine(txt_Port_Send.Text.Trim());
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("發送數據時發生錯誤!", "錯誤提示");
                        return;
                    }
                }
            }
            else
            {
                MessageBox.Show("串口未打開!", "錯誤提示");
                return;
            }
        }

        #endregion
        
        #endregion


        #region socket部分

        #region Socket相關的定義變量
        Socket socketSend;
        #endregion

        /// <summary>
        /// Socket發送數據
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Send_Click(object sender, EventArgs e)
        {
            string str = txt_Socket_Send.Text.Trim();
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
            socketSend.Send(buffer);
        }
        /// <summary>
        /// 建立Socket連接
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Start_Click(object sender, EventArgs e)
        {
            try
            {
                socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(txt_IP.Text);
                IPEndPoint point=new IPEndPoint(ip,Convert.ToInt32(txt_Port.Text.Trim()));
                socketSend.Connect(point);
                ShowMsg("連接成功!");
                Thread th=new Thread(Recive);
                th.IsBackground=true;
                th.Start();
            }
            catch { }
        }
        void ShowMsg(string str)
        {            
            if (txt_Socket_Reccv.TextLength>300)
            {
                txt_Socket_Reccv.Clear();
            }
            txt_Socket_Reccv.AppendText(str + "\r\n");
        }
        /// <summary>
        /// 不停的接受服務器發來的消息
        /// </summary>
        void Recive()
        {
            while (true)
            {
                try
                {
                    byte[] buffer = new byte[1024 * 1024 * 3];
                    int r = socketSend.Receive(buffer);
                    //實際接收到的有效字節數
                    if (r == 0)
                    {
                        break;
                    }
                    string s = Encoding.UTF8.GetString(buffer, 0, r);
                    ShowMsg(socketSend.RemoteEndPoint + ":" + s);                  
                }
                catch { }
            }
        }
        #endregion
        
    }
}

最后實現了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM