C#接收C++ udp数据包

c++ 协议格式

=======================================================


typedefstruct _THead

{

     unsignedshort wHeader;          ;   

    unsigned shortcmdFlag;      

}THead;

 

typedefstruct _TGpsData

{  

    unsigned char GpsId[6];      

     double lon;

     doublelat;

    unsigned char speed;

    unsigned char dir;  

     unsignedint  state;

     unsigned short nMsgtype;   

     unsignedshort height;

    doubletime;

}TGpsData;

 

typedefstruct _TGpsFram   

{

    THead Head;

     TGpsDataGpsData;

}TGpsFram;


======================================================

字段类型

=================================================


定位消息体报文

字段标志

描述

数据长度

字段类型

参数值

说明

wHeader

头定义

   2

Unsigned short

 0xAA

必须

cmdFlag

命令字

   2

Unsigned short

 0xCC

定位消息格式命令字[必须]

GpsId

设备编号

  6

Unsigned char

必须

定位终端编号为12位数字,不足12位的在数字前补0。从最左面的数字开始,每两个数字用一个字节表示。

lon

经度

  8

Double

必须

[必须]

Lat

纬度

  8

Double

必须

[必须]

speed

速度

  1

Unsigned char

必须

 

dir

方向

  1

Unsigned char

必须

目前显示不了360度,只能模2取整

state

星数

  4

Unsigned int

必须

 

nMsgtype

消息类型

  2

Unsigned short

必须

[必须]  对定位消息默认为  1

height

高程

  2

Unsigned short

必须

 

time

时间

  8

Double

必须

时间基准值coledatetime

1899:年1230 00:00:00



/定义对应结构体

  public struct THead
        {
            public ushort wHeader;
            public ushort cmdFlag;
        }
         [StructLayout(LayoutKind.Sequential, Pack = 1)] //结构体不自动调整长度
        public struct TGpsData
        {
          [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
            public Byte[] GpsId;
            public double lon;
            public double lat;
            public byte speed;
            public byte dir;
            public int state;
            public short nMsgtype;
            public short height;
            public double time;
        }
        public struct TGpsFram
        {
            public  THead Head;
            public  TGpsData GpsData;
        }


   private void button2_Click(object sender, RoutedEventArgs e)
        {
            dataGrid1.Items.Insert(0, new DataGridRow() { Item = new { IP地址 = i, ISSI = "2-2", 信息 = "3-3" } });
            i += 1;
          
            
            Thread newThread =


          new Thread(new ThreadStart(ReceiveData));


            newThread.Start();


        }
     




        public Object BytesToStruct(Byte[] bytes, Type strcutType)
        {
            Int32 size = Marshal.SizeOf(strcutType);
            IntPtr buffer = Marshal.AllocHGlobal(size);
            try
            {
                Marshal.Copy(bytes, 0, buffer, size);
                return Marshal.PtrToStructure(buffer, strcutType);
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }
        }


        delegate void TextBoxCallback(TGpsFram udpData);
        public void SetTextBox(TGpsFram udpData)
        {
            ih += 1;
           textBox1.Text =ih.ToString()+udpData.GpsData.lat.ToString();
        }
        private int port = 6666;
        private UdpClient udpClient;
        private int ih=0;
        TGpsFram udp_receive_data;
        private void ReceiveData()
        {
            //在本机指定的端口接收
            udpClient = new UdpClient(port);
            IPEndPoint remote = null;
            //接收从远程主机发送过来的信息;
            while (true)
            {
                try
                {
                    //关闭udpClient时此句会产生异常
                    byte[] bytes = udpClient.Receive(ref remote);


                    //string str = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
                 //   udp_receive_data.GpsData.GpsId = new byte[6];
                    udp_receive_data = (TGpsFram)BytesToStruct(bytes, typeof(TGpsFram));
                    TextBoxCallback tx = SetTextBox;
                    this.Dispatcher.Invoke(tx, udp_receive_data);//使用委托


                }
                catch
                {
                    //退出循环,结束线程
                    udpClient.Close();
                    break;
                }
            }
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值