我需要将雷达的数据包通过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;
}
}