связь между C ++ и Simulink через UDP - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь разрешить моей программе c ++ взаимодействовать с моделью simulink через udp, и, в частности, планируется, что данные будут передаваться из c ++ в simulink и обрабатываться с использованием некоторых моделей simulink, а затем результат будет возвращен обратно.на C ++ для дальнейшего программирования, и передача данных будет осуществляться через UDP (UDP сокет для C ++ и UDP блок отправки / получения в реальном времени для Simulink).И это будет повторяться несколько раз.

Я построил цикл while, в котором c ++ продолжает читать данные из txt-файла и отправляет их на simulink через udp, что хорошо работает, данные умножаются на 2 и отправляются обратно в c ++, но в c ++не может получить правильные данные, которые были отправлены с Simulink.Данные, полученные во время каждого цикла, равны «0».Но если данные, которые я отправлял, были константами, функция приема в c ++ также работает нормально.

</p>

<code>ifstream file_x("x1.txt");
ifstream file_y("y1.txt");
ifstream file_z("z1.txt");

double x;
double y;
double z;

int main() 
{ 
    //Local Varaiable definition
    cout<<"\t\t--------------------UDP Server----------------"<<endl;
    cout<<endl;

    WSADATA WinsockData;
    int     iWsaStartup;
    int     iWsaCleanup;

    SOCKET  UDPSocketServer1;
    SOCKET  UDPSocketClient3;
    struct  sockaddr_in UDPClient1;
    struct  sockaddr_in UDPServer3;

    char    Buffer1[200];
    char    Buffer3[200];

    int     iBufferLen1 = 200+1;
    int     iBufferLen3 = 200+1;

    int         iBind3;
    int     iReceiveFrom;
    int     iSendTo;

    int     iUDPClientLen1  = sizeof(UDPClient1);
    int     iUDPClientLen2  = sizeof(UDPClient2);
    int     iUDPServerLen3  = sizeof(UDPServer3);
    int     iCloseSocket1;
    int     iCloseSocket3;

    //STEP-1: initialization of Winsock
    iWsaStartup = WSAStartup(MAKEWORD(2,2), &WinsockData);
    if (iWsaStartup != 0)
    {
        cout<<"WSAStartUp Fun Failed!"<<endl;
    }
    else
    {
        cout<<"WSAStartUp Success"<<endl;
    }

    //STEP-2: Fill the UDPClient(SOCKET ADDRESS) Structure
    UDPClient1.sin_family      = AF_INET;
    UDPClient1.sin_addr.s_addr = inet_addr("127.0.0.1");
    UDPClient1.sin_port        = htons(8001);

    UDPServer3.sin_family      = AF_INET;
    UDPServer3.sin_addr.s_addr = inet_addr("127.0.0.3");
    UDPServer3.sin_port        = htons(8003);

    //STEP-3: Socket Creation
    UDPSocketServer1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (UDPSocketServer1 == INVALID_SOCKET)
    {
        cout<<"Socket1 Creation Failed & Error No ->"<<WSAGetLastError()<<endl;
    }
    else
    {
        cout<<"Socket1 Creation Success"<<endl;
    }

    UDPSocketClient3 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (UDPSocketClient3 == INVALID_SOCKET)
    {
        cout<<"Socket3 reation Failed = "<<WSAGetLastError()<<endl;
    }
    else
    {
        cout<<"Socket3 Creation Success"<<endl;
    }

    //STEP-4: Bind the server
    iBind3 = bind(UDPSocketClient3, (SOCKADDR*)&UDPServer3, sizeof(UDPServer3));
    if (iBind3 == SOCKET_ERROR)
    {
        cout<<"Binding Failed & Error No ->"<<WSAGetLastError()<<endl;
    }

    //STEP-4-1: SendTo Fun send data to client  
    while (!file_x.eof())
    {
        file_x     >> x;
        file_y     >> y;
        file_z     >> z;

        sprintf_s(Buffer1,200,"%0.2f\r\n %0.2f\r\n %0.2f\r\n",x,y,z);

        iSendTo = sendto(UDPSocketServer1, Buffer1, iBufferLen1, MSG_DONTROUTE, (SOCKADDR*)&UDPClient1, sizeof(UDPClient1));
        if (iSendTo == SOCKET_ERROR)
        {
            cout<<"Sending Data Failed & Error No ->"<<WSAGetLastError()<<endl;
        }
        else
        {
            cout<<"Sending Data Success"<<endl;
        }

        iReceiveFrom = recvfrom(UDPSocketClient3, Buffer3, iBufferLen3, MSG_PEEK, (SOCKADDR*)&UDPServer3, &iUDPServerLen3);
        if (iReceiveFrom == SOCKET_ERROR)
        {
            cout<<"Receiving failed & Error No ->"<<WSAGetLastError()<<endl;
        }
        else
        {
            cout<<"Receiving Success"<<endl;
            cout<<"Receive Data ->"<<Buffer3<<endl;
        }       

    }


    //STEP-6: CloseSocket Function
    iCloseSocket1 = closesocket(UDPSocketServer1);
    if (iCloseSocket1 == SOCKET_ERROR)
    {
        cout<<"Socket1 Closing failed & Error No ->"<<WSAGetLastError()<<endl;
    }
    else
    {
        cout<<"Socket1 Closing Success"<<endl;
    }

    iCloseSocket3 = closesocket(UDPSocketClient3);
    if (iCloseSocket3 == SOCKET_ERROR)
    {
        cout<<"Socket3 Closing failed & Error No ->"<<WSAGetLastError()<<endl;
    }
    else
    {
        cout<<"Socket3 Closing Success"<<endl;
    }
    //STEP-7: WSACleanUp Fun for Terminating from DLL
    iWsaCleanup = WSACleanup();
    if (iWsaCleanup == SOCKET_ERROR)
    {
        cout<<"WSA Cleanup Success"<<endl;
    }
    else
    {
        cout<<"WSA Cleanup Success"<<endl;
    }

    system("pause");
    return 0;
} 
</code>

1 Ответ

0 голосов
/ 25 июня 2019

Я обнаружил, что флаг в функции recvfrom имеет значение в этой проблеме, которую можно сослаться на ее документ, и я изменил MSG_PEEK на 0, и, учитывая мое приложение, я использовал другой проект только для получения данных, отправленных с simulink, ипроблема была решена.

...