2017-06-26 1 views
-1

Je travaille sur un code pour communiquer deux arduinos, l'un avec un blindage ethernet et l'autre avec un module ethernet ENC28J60. Je ne suis pas un débutant en arduino ni un sage/expert pour le moment. Mais je suis un complet - et moins qu'un novice dans la communication UDP.UDP port arduino incrément après envoi de paquet

Voici la question: mon code fonctionne bien, il envoie et reçoit des paquets UDP de l'un à l'autre et vice versa. Mais après l'envoi de chaque paquet, il incrémente la valeur "Udp.remotePort" (celle vue du côté "udp-reader"). Il commence à partir de 1024 jusqu'à ~ 32000 (et recommence après avoir atteint la valeur la plus élevée). J'ai fait des recherches sur UDP et je comprends que les premiers 0-1023 sont réservés aux services spécifiques p.e. 80 http, 21 ftp. Mais je pense qu'il ne devrait pas être incrémenté après chaque envoi. Ou devrait-il?

Je ne colle pas le code car comme je l'ai dit, ça marche. Je voudrais juste savoir ce qui pourrait être faux de votre expérience.

La phrase que je utilise pour écrire les paquets est:

udp.beginPacket(IPAddress([ip address]), [port no]); 

Les bibliothèques que je utilise:

UIPEthernet.h https://github.com/UIPEthernet/UIPEthernet for ENC28J60 

Ethernet.h pour bouclier ethernet

EDIT: Ce est le code de l'expéditeur UDP (ENC28J60). Fondamentalement est le code d'exemple de la bibliothèque comme je l'ai dit, il fonctionne correctement en termes de communication. J'ai seulement changé les adresses IP: 192.168.1.50 qui est l'expéditeur UDP et 192.168.1.51 qui est la destination UDP.

#include <UIPEthernet.h> 

EthernetUDP udp; 
unsigned long next; 

void setup() { 

    Serial.begin(115200); 

    uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05}; 

    Ethernet.begin(mac,IPAddress(192,168,1,51)); 
// Also i used: Ethernet.begin(mac,IPAddress(192,168,1,51), 5000); 
// with the same result 

    next = millis()+2000; 
} 

void loop() { 

    int success; 
    int len = 0; 

    if (((signed long)(millis()-next))>0) 
    { 
     do 
     { 
      success = udp.beginPacket(IPAddress(192,168,1,50),5000); 
      Serial.print("beginPacket: "); 
      Serial.println(success ? "success" : "failed"); 
      //beginPacket fails if remote ethaddr is unknown. In this case an 
      //arp-request is send out first and beginPacket succeeds as soon 
      //the arp-response is received. 
     } 
     while (!success && ((signed long)(millis()-next))<0); 
     if (!success) 
     goto stop; 

     success = udp.write("hello world&from&arduino"); 

     Serial.print("bytes written: "); 
     Serial.println(success); 

     success = udp.endPacket(); 

     Serial.print("endPacket: "); 
     Serial.println(success ? "success" : "failed"); 

     do 
     { 
      //check for new udp-packet: 
      success = udp.parsePacket(); 
     } 
     while (!success && ((signed long)(millis()-next))<0); 
     if (!success) 
     goto stop; 

     Serial.print("received: '"); 
     do 
     { 
      int c = udp.read(); 
      Serial.write(c); 
      len++; 
     } 
     while ((success = udp.available())>0); 
     Serial.print("', "); 
     Serial.print(len); 
     Serial.println(" bytes"); 

     //finish reading this packet: 
     udp.flush(); 

     stop: 
     udp.stop(); 
     next = millis()+2000; 
    } 
} 

EDIT 2: Voici une capture d'essais avec SocketTest listening on port 5000, and after a packet received, the next one arrives with the remote port incremented on 1 each time

+1

Si le code fonctionne 100% OK, vous n'avez pas de question. Si vous avez une question, vous devez poster le code. – EJP

+0

OK, j'ai posté le code. – charly989

Répondre

1

Vous devez être en train de créer un nouveau socket UDP par datagramme envoyé. Ne fais pas ça. Utilisez le même pour la vie de l'application.

+0

Je ne sais pas comment éviter cela, ce que je fais mal? – charly989

+0

@ charly989, rouvrez-vous un fichier chaque fois que vous y écrivez pendant votre vie d'application? Non, ce serait bête et lent. Ouvrez le socket lors de la configuration de votre application, utilisez-le pendant la boucle d'application et fermez-le lorsque l'application est terminée. –

+0

OK, bonne analogie je comprends votre point (et je vais l'appliquer). Cependant je ne sais toujours pas pourquoi dans ce code particulier le port s'incrémente sur 1 après chaque paquet envoyé. Veuillez vérifier l'img téléchargé. (EDIT 2). – charly989