SuperSocket.ClientEngine使用

  1. 最近這2天在做winform程序,用到json,supersocket.client   SerialPort

json使用的是Newtonsoft.Json.dll ,SuperSocket.ClientEngine使用的是SuperSocket.ClientEngine.dll和SuperSocket.ProtoBase.dll  SerialPort  是winform自帶的

  1. Json

string josnString = File.ReadAllText("./json/news.json", Encoding.Default);

listRtuBean = JsonConvert.DeserializeObject<List<RtuBean>>(josnString);

listRtuBean = listRtuBean.OrderBy(m => m.id).ToList();  //用於排序

  1. SuperSocket.ClientEngine

https://github.com/kerryjiang/SuperSocket.ClientEngine

需要引入

https://github.com/kerryjiang/SuperSocket.ProtoBase

SuperSocket.ClientEngine最新的是2017版的,我的是2015下的是老的

而且打開的是.csproj,按照visual studio 2015要求保存爲了SuperSocket.ClientEngine.Net45.sln

然後引入的SuperSocket.ProtoBase,引入的時候是到src下SuperSocket.ProtoBase.Net45.csproj這個

具體使用,我的是需要傳遞byte[]的按理說我按照這個要求能夠增加一個新類在SuperSocket.ProtoBase中指定傳遞byte,弄了2天沒成,雖然有SuperSocket.base(server端)的代碼,後來使用了他中的AsyncTcpSession client = null;

具體用法

private void initSocket()

        {

            //AsyncTcpSession client = new AsyncTcpSession(new IPEndPoint(IPAddress.Parse(UartInfo.ipAddress), UartInfo.port));

            client = new AsyncTcpSession();

            // 連接斷開事件

            client.Closed += client_Closed;

            // 收到服務器數據事件

            client.DataReceived += client_DataReceived;

            // 連接到服務器事件

            client.Connected += client_Connected;

            // 發生錯誤的處理

            client.Error += client_Error;

            client.Connect(new IPEndPoint(IPAddress.Parse(UartInfo.ipAddress), UartInfo.port));    

            

        }

 

private void client_Connected(object sender, EventArgs e)

        {

            Console.WriteLine("連接成功");

        }

 

        private void client_DataReceived(object sender, DataEventArgs e)

        {

            byte[] buffer = new byte[e.Length];

            Array.Copy(e.Data, buffer, buffer.Length);

            DelgateShowModbusTcpResponse delgateShowModbusTcpResponseByte = new DelgateShowModbusTcpResponse(parseNetData);

            Invoke(delgateShowModbusTcpResponseByte, buffer);   

        }

 

        

        private void client_Closed(object sender, EventArgs e)

        {

            client.Close();

            Console.WriteLine("連接斷開");

            //MessageBox.Show("網絡連接斷開");

        }

 

        private void client_Error(object sender, SuperSocket.ClientEngine.ErrorEventArgs e)

        {

            MessageBox.Show(e.Exception.Message);

        }

 

        private void parseNetData(byte[] data)

        {

            

        }

但是這個有個問題,就是初始化的時候,如果網絡不通,也不報錯誤,而是在發送的時候報錯誤

if (client != null && client.IsConnected) {

                client.Close();                

            }

  1. SerialPort

private void loadCOMControl()

        {

            try

            {

                serialPort.PortName = UartInfo.PortName;

                serialPort.BaudRate = UartInfo.BaudRate;

 

                if (UartInfo.Parity.Equals("None")) {

                    serialPort.Parity = Parity.None;

                }

                else if (UartInfo.Parity.Equals("Odd"))

                {

                    serialPort.Parity = Parity.Odd;

                }

                else if (UartInfo.Parity.Equals("Even"))

                {

                    serialPort.Parity = Parity.Even;

                }

 

                serialPort.DataBits = UartInfo.DataBits;

                if (UartInfo.StopBits.Equals("1")) {

                    serialPort.StopBits = StopBits.One;

                }

                else if (UartInfo.StopBits.Equals("2"))

                {

                    serialPort.StopBits = StopBits.Two;

                }

                else if (UartInfo.StopBits.Equals("1.5"))

                {

                    serialPort.StopBits = StopBits.OnePointFive;

                }

                

                serialPort.ReadBufferSize = 1024;

                serialPort.WriteTimeout = 3000;

                serialPort.ReadTimeout = 3000;

                serialPort.DataReceived += serialDataReceivedEvent;

                bool flag = serialPort.IsOpen;

                serialPort.Open();

 

            }

            catch (Exception e) {

                MessageBox.Show("打開端口失敗,請確認改端口是否已經被使用 "+e.Message);                

            }

        }

 

 void serialDataReceivedEvent(object sender, SerialDataReceivedEventArgs e)

        {

            SerialPort port = (SerialPort)sender;

            byte[] bytebuffer = new byte[port.BytesToRead];//serialport讀取串口數據

            port.Read(bytebuffer, 0, bytebuffer.Length);//串口讀取到數據

 

            try

            {

                lock (this)

                {

                    if (bytebuffer.Length > 0)

                    {

                        addByteToByteList(bytebuffer);

                        writeConsole(bytebuffer);

                        if (operateFlag == 1 || operateFlag == 4)

                        {

                            //讀數據返回

                            if (checkReadRecvData())

                            {

                                byte[] feData = ModbusRtu.getModbusReadResponse(portBufferByteList.ToArray());

                                delByteToByteList(feData);

                                showReadResponse(feData);

                            }

                        }

                        else if (operateFlag == 2 || operateFlag == 3 || operateFlag == 5 || operateFlag == 6)

                        {

                            //寫數據返回

                            if (checkWriteRecvData())

                            {

                                byte[] feData = ModbusRtu.getModbusWriteResponse(portBufferByteList.ToArray());

                                delByteToByteList(feData);

                                showWriteResponse(feData);

                            }

                        }

                    }

                }

            }

            catch (Exception ex)

            {

                MessageBox.Show("接收串口數據失敗" + ex.Message);

            }

        }

 

private void showReadResponse(byte[] feData)

        {

            DelgateShowReadResponse delgateShowReadResponseByte = new DelgateShowReadResponse(showReadResponseByte);

            Invoke(delgateShowReadResponseByte, feData);

        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章