我需要将雷达的数据包通过UDP通信接回来,然后用c++调用c# 的dll库来实现雷达数据处理,
c++ udp通信网上资料很多,由于我是新手,完全不了解c++和c#,所以我的大部分时间都是在解决c++ 字符类型到c# 的类型转换。
通过这个试验学到了:
调用c# dll动态链接库时
1. 刚开始调用的时候看着网上的步骤来的,但是我的有时候会报 托管字符 这种错误。后来经过别人的指点了解到 CLI::
cli::array^ buffer = gcnew cli::array (1400);
2.学会创建array
cli::array^ buffer = gcnew cli::array (1400);
3.udp通信时接回来的数据都是char类型的
recvfrom(sockRec, recvBuf, 1400, 0, (SOCKADDR*)&addrSen, &len);
而c# 需要的是array
我通过查资料只找到了,循环赋值的这种方法,还需要查找有没有更好的办法。
for (int i = 0; i < 1400; i++)
{
buffer[i] = recvBuf[i];
}
全程序
#include#include #include #include #pragma comment(lib,"WS2_32.lib") # 把路径写全 #using "D:vsConsoleApplication1xandllfd_radar.dll" using namespace fd_radar; using namespace std; using namespace System; int main() { # c#的需要用到的字符串 string parms = " FD5 06000 "; # 转换了一下格式类型 String^ managedString = gcnew String(parms.c_str()); # 创建类型为array类型的 长度为1400 的数组 cli::array ^ buffer = gcnew cli::array (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!nn"); 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("%sn", recvBuf); // c++ char类型转为 c# array 类型 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; } }



