2012-02-27 3 views
1

J'ai un PIC32 ethernet evaluation board et j'essaye de l'obtenir pour envoyer un simple paquet UDP.Kit Ethernet PIC32 et UDP

Voici mon code à ce jour:

/* 
* This macro uniquely defines this file as the main entry point. 
* There should only be one such definition in the entire project, 
* and this file must define the AppConfig variable as described below. 
*/ 
#define THIS_IS_STACK_APPLICATION 

// Include all headers for any enabled TCPIP Stack functions 
#include "TCPIP Stack/TCPIP.h" 
#include "TCPIPConfig.h" 

#include <plib.h> 
#include <p32xxxx.h> 

// Declare AppConfig structure and some other supporting stack variables 
APP_CONFIG AppConfig; 
BYTE AN0String[8]; 

int main() 
{ 
    static enum 
    { 
     SM_OPEN, 
     SM_BROADCAST, 
    } smState = SM_OPEN; 
    typedef BYTE UDPSocket; 
    UDP_SOCKET s; 
    NODE_INFO myRemoteNode; 

    myRemoteNode.IPAddr.v[0]=169; 
    myRemoteNode.IPAddr.v[1]=254; 
    myRemoteNode.IPAddr.v[2]=2; 
    myRemoteNode.IPAddr.v[3]=2; 
    myRemoteNode.MACAddr.v[0]=0x01; 
    myRemoteNode.MACAddr.v[1]=0xA0; 
    myRemoteNode.MACAddr.v[2]=0xF0; 
    myRemoteNode.MACAddr.v[3]=0x7B; 
    myRemoteNode.MACAddr.v[4]=0xE5; 
    myRemoteNode.MACAddr.v[5]=0x45; 

    TRISD = 0xff00; // tri-state register for the LED ports 

    // Initialize UDP 
    UDPInit(); 

    while(1) 
    { 
     switch(smState) 
     { 
      case SM_OPEN: 

       // Talk to a remote DHCP server. 
       s = UDPOpen(68, &myRemoteNode, 67); 

       if (s == INVALID_UDP_SOCKET) 
       { 
        PORTD = 0x01; // Switch on the red LED on PIC32 ethernet starter kit to indicate an error 
        // Socket is not available 
        // Return error. 
       } 
       else 
        // Broadcast DHCP Broadcast message. 
        smState = SM_BROADCAST; 
       break; 

      case SM_BROADCAST: 

       PORTD = 0x02; // Switch on the yellow LED to indicate the connection 

       if (UDPIsPutReady(s)) 
       { 
        // Turn on yellow and green LED to indicate UDP is put ready 
        PORTD = 0x06; 

        // Socket is ready to transmit. Transmit the data... 
        // Note that there is DHCPSocket parameter in UDPPut. 
        // This UDPPut call will use active socket 
        // as set by UDPIsPutReady() - that is DHCPSocket. 
        UDPPut(0x55); 

        // Now transmit it. 
        UDPFlush(); 
       } 
       UDPClose(s);     
       break; 
     } 
    } 
} 

Quand je compile et exécute le code dans MPLAB IDE, il semble que le conseil envoie deux paquets, puis plus rien. J'ai branché la carte directement à un ordinateur portable exécutant Wireshark, mais Wireshark n'a pas pu détecter les paquets reçus.

J'ai réussi à obtenir la carte pour exécuter la démo du serveur http, qui utilise TCP, donc je sais que ce n'est pas un problème matériel.

Répondre

0

Cette question doit vraiment être dans l'échange de pile électronique ou forums mc. Je pense que le problème est que les 2 premières secondes après l'initialisation que les paquets n'atteignent jamais ou dépassent le phy. Je ne sais pas pourquoi, mais j'ai traversé ça récemment. Je pense que votre code est correct, même si j'utiliserais UDPOpenEx, en supposant que vous ayez des librairies d'applications Microchip assez récentes. Essayez d'attendre quelques secondes ou renvoyez-le. Si vous vous connectez en tant qu'IP au lieu de NODE_INFO, cela fonctionnera et fonctionnera probablement, parce que l'arp devra d'abord résoudre.