C++ 调用c#的dll动态链接库,进行UDP通信数据处理

本文介绍了一位新手如何使用C++通过UDP通信接收雷达数据,并将其转换为C#DLL库所需的array<unsignedchar>类型进行处理。主要学习了C++中创建CLI数组、处理托管字符错误以及C++到C#数据类型的转换。通过循环赋值实现了数据包的转换,同时展示了如何实例化并调用C#DLL库中的函数进行数据处理。
摘要由CSDN通过智能技术生成

我需要将雷达的数据包通过UDP通信接回来,然后用c++调用c# 的dll库来实现雷达数据处理,

c++ udp通信网上资料很多,由于我是新手,完全不了解c++和c#,所以我的大部分时间都是在解决c++ 字符类型到c# 的类型转换。

通过这个试验学到了:

调用c# dll动态链接库时

1. 刚开始调用的时候看着网上的步骤来的,但是我的有时候会报  托管字符 这种错误。后来经过别人的指点了解到 CLI::

cli::array<unsigned char>^ buffer = gcnew cli::array<unsigned char>(1400);

2.学会创建array<unsigned char>类型,长度为1400 的数组

cli::array<unsigned char>^ buffer = gcnew cli::array<unsigned char>(1400);

3.udp通信时接回来的数据都是char类型的

recvfrom(sockRec, recvBuf, 1400, 0, (SOCKADDR*)&addrSen, &len);

而c# 需要的是array<unsigned char>类型

我通过查资料只找到了,循环赋值的这种方法,还需要查找有没有更好的办法。

        for (int i = 0; i < 1400; i++)
        {
            buffer[i] = recvBuf[i];
        } 

全程序

#include <string>
#include <WinSock2.h>
#include <iostream>
#include <array>
#pragma comment(lib,"WS2_32.lib")

# 把路径写全
#using "D:\vs\ConsoleApplication1xandll\fd_radar.dll"

using namespace fd_radar;
using namespace std;
using namespace System;


int main()
{
    # c#的需要用到的字符串
    string parms = "<?xml version=\"1.0\" ?><Param><type>FD5</type><antenna_tilt>0 </antenna_tilt><working_radius>6000 </working_radius ></Param> ";

    # 转换了一下格式类型
    String^ managedString = gcnew String(parms.c_str());

    # 创建类型为array<unsigned char>类型的 长度为1400 的数组
    cli::array<unsigned char>^ buffer = gcnew cli::array<unsigned char>(1400);

    # 把需要调用c#dll库里的函数实例化
    fd_radar::Trace^ trace = gcnew fd_radar::Trace("FD5",managedString );
    

    // UDP通信
    //创建套接字
    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested = MAKEWORD(1, 1);
    int err = WSAStartup(wVersionRequested, &wsaData);
    printf("Client is operating!\n\n");
    SOCKET sockRec = socket(AF_INET, SOCK_DGRAM, 0);
    //套接字绑定到一个本地地址和端口
    SOCKADDR_IN addrRec;
    addrRec.sin_addr.S_un.S_addr = htonl(INADDR_ANY); // ip地址
    addrRec.sin_family = AF_INET;
    addrRec.sin_port = htons(60000);//端口号
    bind(sockRec, (SOCKADDR*)&addrRec, sizeof(SOCKADDR));
    //调用recvfrom()向服务器发送指定数据
    SOCKADDR_IN addrSen;
    int len = sizeof(SOCKADDR);
    char recvBuf[1400];

    while (true)
    {
        # 接收数据包
        recvfrom(sockRec, recvBuf, 1400, 0, (SOCKADDR*)&addrSen, &len);
        printf("%s\n", recvBuf);

        // c++ char类型转为 c# array<unsigned char>类型
        for (int i = 0; i < 1400; i++)
        {
            buffer[i] = recvBuf[i];
        }


        // 将转换后的字符串输入dll库里的函数  通过实例化的trace可以直接调用里面的函数
        trace->Input(buffer);

        # 
        fd_radar::Trace::TrackData^ trackdata = gcnew fd_radar::Trace::TrackData;
        //输出  查看函数里变量
        cout <<"方位 = " << trace->ServoAngle << endl;
        int amp = trackdata->Amp;
        int no = trackdata->No;
        float prange = trackdata->PRange;
        cout << "amp = " << amp << "   no = " << no << "   prange = " << prange << endl;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值