tanks22 发表于 2014-10-17 14:30:47

UDP 怎麼完整接收返回的數據

本帖最后由 tanks22 于 2014-10-22 08:48 编辑

從客戶端發送一個指令給智能插座,然後讀取智能插座返回的指令。現在的情況是,在點擊第一個按鈕后,Receive的數據可能沒有讀取完,
而在點擊第二個按鈕后,得到的字符串包含第一個按鈕產生的數據。
怎麼才能讓第一個的數據接收完?


對通信協議不是很懂,希望大家指點指點:loveliness:,謝謝啊!

IPEndPoint remotePoint = new IPEndPoint(remoteIP, remotePort);

IPEndPoint localPoint = new IPEndPoint(localIP, localPort);
UdpClient udpclt = new UdpClient(localPoint);

byte[] send1 = new byte[] {0x05, 0x00, 0x00, 0xFF, 0x00 };
byte[] send2 = new byte[] {0x05, 0x00, 0x00, 0x00, 0x00 };


private void button1_Click(object sender, EventArgs e)
{   
   udpclt.Send(send1, send1.Length, remotePoint);
   Thread.Sleep(100);
   string str1 = getReceive();
}
private void button2_Click(object sender, EventArgs e)
{
   udpclt.Send(send2, send2.Length, remotePoint);
   Thread.Sleep(100);
   string str2 = getReceive();
}



public void getReceive()
{
            string sMsg = string.Empty;
            bool isStop = false;
            while (!isStop)
            {
                Byte[] receiveData = new byte;
                while (udpclt.Available > 0)
                {
                  receiveData = udpclt.Receive(ref remotePoint);//接收數據
                  sMsg = byteArrayToString(receiveData);

                }
                isStop = true;
            }
            return sMsg;

}







ibcadmin 发表于 2014-10-17 16:16:08

我就看看实力有限

tanks22 发表于 2014-10-17 17:42:25

ibcadmin 发表于 2014-10-17 16:16
我就看看实力有限

:o你實力有限,俺們還咋混:'(

ibcadmin 发表于 2014-10-17 17:47:12

tanks22 发表于 2014-10-17 09:42
你實力有限,俺們還咋混

{:2_25:}好好学

tanks22 发表于 2014-10-22 08:47:40

我在每次發送前開啟UDPClient,在接收后關閉UDPClient。
但是有時還會出現 第二次接收的數據還會有第一次的數據 這種情況。
這是為什麼呢???

tanks22 发表于 2014-10-23 16:44:31

本帖最后由 tanks22 于 2014-10-23 16:46 编辑

有時候靈光就在一剎那,現在總結下這個問題,希望對其他人有所幫助,當然也是我一廂情願而已啦,:lol

先說一下這個智能插座的原理:
1.向插座發送一條數組命令,
2.插座會返回6組數組命令,第一組是固定格式,後面五組都相同,有效數組是這五組中的任意一組。

問題:
這六組數據傳回的較慢,在第二次發送命令時,有可能還會接收到第一次的數據。

解決方式:
1.接收第一組消息頭
2.接收第二組有效數據
3.再發送一條錯誤命令給插座,使設備不再反饋數據。

private void button1_Click(object sender, EventArgs e)
{   
   udpclt.Send(send1, send1.Length, remotePoint);
   byte[] receive_first = udpclt.Receive(ref remotePoint);//第一次接收數據(消息頭)
   byte[] receive_second = udpclt.Receive(ref remotePoint);//第二次接收數據(有效數據)
      //對receive_second進行解析
   //TODO
   byte[] error = newbyte[]{ 0x00,0x00,0x05,0x9E,0xF4,0x03,0x59,0xFF,0x00 }
   udpclt.Send(error, error.Length,remotePoint);//發送錯誤指令
}


页: [1]
查看完整版本: UDP 怎麼完整接收返回的數據