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
我就看看实力有限
:o你實力有限,俺們還咋混:'( tanks22 发表于 2014-10-17 09:42
你實力有限,俺們還咋混
{:2_25:}好好学 我在每次發送前開啟UDPClient,在接收后關閉UDPClient。
但是有時還會出現 第二次接收的數據還會有第一次的數據 這種情況。
這是為什麼呢??? 本帖最后由 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]