Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda com Comunicação Ethernet


HenriqueT

Pergunta

Olá a todos ,

É o seguinte , meu conhecimento em C é um pouco básico. Programo microcontroladores e fiz uma comunicação pela porta serial RS232 entre o PC e o microcontrolador.

O programa Terminal para a comunicação eu mesmo criei em C , (console aplication mesmo , digito no teclado e ele envia a string / recebe ) usando o CodeBlocks + MinGW. O programa no uC também já fiz. Está tudo funcionando nos conformes .. Mas , a questão agora é : Os pcs aqui em casa estão em rede ( roteador ) e o meu desejo é conseguir comunicar com o microcontrolador por outro computador que não seja o que ele está conectado fisicamente. Tipo assim:

Digito comandos no PC1 , ele envia esses comandos pela porta Ethernet e comunica com o PC2 ( passando pelo roteador ) o PC2 recebe as strings e envia para o microcontrolador que está ligado na sua porta serial. ( O programa de enviar pela serial já está pronto , mas queria que ao invés dele receber as strings pelo teclado apenas , recebesse elas pela Ethernet ! e que um programa em outro PC as enviasse para a LAN). Mas não tenho a minima idéa de como :/ É possivel isso , apenas com conhecimentos simples de C ? alguém poderia me ajudar? Obs , uso windows Xp no micro em que está a serial e 7 nos demais da casa.

Obrigado !

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Boa tarde!

Eu já fiz vários programas que trabalham com rede. Não é tão difícil não! :)

Eu tenho códigos que rodam no Linux e Windows.

Segue abaixo um exemplo que eu fiz no linux, Não sei se vai funcionar no windows também. Eu acho que não!

Nesse programa você passa na linha de comando o computador que vai receber a mensagem, a porta que ele está escutando e uma string de texto a ser transmitida.

#include <stdio.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

int ihm_connect(char *host, unsigned int port)
{
        struct  hostent  *ptrh;  /* pointer to a host table entry       */
        struct  protoent *ptrp;  /* pointer to a protocol table entry   */
        struct  sockaddr_in sad; /* structure to hold an IP address     */
        int     sd;              /* socket descriptor                   */

        memset((char *)&sad,0,sizeof(sad)); /* clear sockaddr structure */
        sad.sin_family = AF_INET;         /* set family to Internet     */

        /* Check command-line argument for protocol port and extract    */
        /* port number if one is specified.  Otherwise, use the default */
        /* port value given by constant PROTOPORT                       */

        if (port > 0)                   /* test for legal value         */
                sad.sin_port = htons(port);
        else {                          /* print error message and exit */
                fprintf(stderr,"Bad port number %d\n",port);
                return -1;
        }

        /* Convert host name to equivalent IP address and copy to sad. */

        ptrh = gethostbyname(host);
        if ( ((char *)ptrh) == NULL ) {
                fprintf(stderr,"Invalid host: %s\n", host);
                return -1;
        }
        memcpy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length);

        /* Map TCP transport protocol name to protocol number. */

        if ( ((ptrp = getprotobyname("tcp"))) == NULL) {
                fprintf(stderr, "Cannot map \"tcp\" to protocol number");
                return -1;
        }

        /* Create a socket. */

        sd = socket(AF_INET, SOCK_STREAM, ptrp->p_proto);
        if (sd < 0) {
                fprintf(stderr, "Socket creation failed\n");
                return -1;
        }

        /* Connect the socket to the specified server. */

        if (connect(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) {
                fprintf(stderr,"Connect failed\n");
                return -1;
        }

        return sd;
}

int main(int argc, char *argv[])
{
  int ret = 0;
  unsigned int size, sent;

  int tcp_socket = -1;

  if(argc != 4) {
    printf("Sintaxe:\n\t%s <servidor> <porta> <texto>\n", argv[0]);
    return 1;
  }

  // Conecta ao servidor e configura o socket para o modo que não bloqueia
  tcp_socket = ihm_connect(argv[1], atoi(argv[2]));

  if(tcp_socket > 0) {
    size = strlen(argv[3]);
    sent = send(tcp_socket, argv[3], size, 0);

    if(sent != size) {
      printf("Erro durante transmissao!\n");
    }
  } else {
    printf("Erro durante conexao!\n");
  }

  return 0;
}
Segue abaixo um trecho de código de um outro programa que eu fiz. Ele é para windows, eu fiz no visual studio, não sei se usando o mingw vai funcionar tudo.
MODBUS_HANDLER_TX(Modbus_TCP_Tx)
{
    SOCKET ConnectSocket = INVALID_SOCKET;
    struct addrinfo *result = NULL, *ptr = NULL, hints;

    int iResult;
    char strIP[20];

    sprintf(strIP, "%d.%d.%d.%d", Prog.ip[0], Prog.ip[1], Prog.ip[2], Prog.ip[3]);

    ZeroMemory( &hints, sizeof(hints) );
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    // Resolve the server address and port
    iResult = getaddrinfo(strIP, "502", &hints, &result);
    if (iResult != 0) {
        Error("getaddrinfo failed: %d", iResult);
        return 0;
    }

    // Attempt to connect to the first address returned by
    // the call to getaddrinfo
    ptr=result;

    // Create a SOCKET for connecting to server
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);

    if (ConnectSocket == INVALID_SOCKET) {
        Error("Error at socket(): %ld", WSAGetLastError());
        freeaddrinfo(result);
        return 0;
    }

    // Connect to server.
    iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
    if (iResult == SOCKET_ERROR) {
        closesocket(ConnectSocket);
        ConnectSocket = INVALID_SOCKET;
    }

    // Should really try the next address returned by getaddrinfo
    // if the connect call failed
    // But for this simple example we just free the resources
    // returned by getaddrinfo and print an error message

    freeaddrinfo(result);

    if (ConnectSocket == INVALID_SOCKET) {
        Error("Unable to connect to server!");
        return 0;
    }

    // Send an initial buffer
    iResult = send(ConnectSocket, (const char *)data, size, 0);
    if (iResult == SOCKET_ERROR) {
        Error("send failed: %d", WSAGetLastError());
        closesocket(ConnectSocket);
        return 0;
    }

    // shutdown the connection for sending since no more data will be sent
    // the client can still use the ConnectSocket for receiving data
    iResult = shutdown(ConnectSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) {
        Error("shutdown failed: %d", WSAGetLastError());
        closesocket(ConnectSocket);
        return 0;
    }

    iResult = recv(ConnectSocket, (char *)data, MODBUS_BUFFER_SIZE, 0);
    if (iResult == 0)
        Error("Connection closed");
    else if(iResult < 0) {
        iResult = 0;
        Error("recv failed: %d", WSAGetLastError());
    }

    // cleanup
    closesocket(ConnectSocket);

    return iResult;
}

Tem esse site que explica bem detalhadamente como funciona a rede no linux: http://www.linuxhowtos.org/C_C++/socket.htm

Acho que isso já dá para você começar...

Se tiver alguma outra dúvida é só falar!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...