马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

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

  [复制链接]
查看8210 | 回复5 | 2014-10-17 14:30:47 | 显示全部楼层 |阅读模式
本帖最后由 tanks22 于 2014-10-22 08:48 编辑

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


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

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[100];
                while (udpclt.Available > 0)
                {
                    receiveData = udpclt.Receive(ref remotePoint);//接收數據
                    sMsg = byteArrayToString(receiveData);

                }
                isStop = true;
            }
            return sMsg;

}







ibcadmin | 2014-10-17 16:16:08 | 显示全部楼层
我就看看  实力有限

点评

你實力有限,俺們還咋混  详情 回复 发表于 2014-10-17 17:42
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
tanks22 | 2014-10-17 17:42:25 | 显示全部楼层
ibcadmin 发表于 2014-10-17 16:16
我就看看  实力有限

你實力有限,俺們還咋混
ibcadmin | 2014-10-17 17:47:12 | 显示全部楼层
tanks22 发表于 2014-10-17 09:42
你實力有限,俺們還咋混

  好好学
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
tanks22 | 2014-10-22 08:47:40 | 显示全部楼层
我在每次發送前開啟UDPClient,在接收后關閉UDPClient。
但是有時還會出現 第二次接收的數據還會有第一次的數據 這種情況。
這是為什麼呢???
tanks22 | 2014-10-23 16:44:31 | 显示全部楼层
本帖最后由 tanks22 于 2014-10-23 16:46 编辑

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

先說一下這個智能插座的原理:
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 = new  byte[]{ 0x00,0x00,0x05,0x9E,0xF4,0x03,0x59,0xFF,0x00 }
     udpclt.Send(error, error.Length,remotePoint);//發送錯誤指令
}



*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则