2011-09-15 5 views
5

मैं ईथरनेट शील्ड के साथ एक Arduino Uno का उपयोग कर रहा हूं।Arduino (Uno) ईथरनेट क्लाइंट कनेक्शन कई क्लाइंट प्रिंटों के बाद विफल रहता है

कई HTTP अनुरोध भेजने के बाद, client.println (...), क्लाइंट कनेक्ट होने पर विफल होने लगते हैं। विफलता का समय यादृच्छिक प्रतीत होता है, और लूप से अनुक्रम रीडआउट ~ 1000 और ~ 7000 के बीच कहीं भी भिन्न हो सकता है।

त्रुटि बह निकला ईथरनेट संचारित बफर से कोई लेना देना (this advice के बाद)

यहाँ कोड है कि विफल हो रहा है है नहीं है:

#include <Ethernet.h> 
#include <SPI.h> 

// Network constants 
byte mac[] = {0x00, 0x23, 0xdf, 0x82, 0xd4, 0x01}; 
byte ip[] = {/*REDACTED*/}; 
byte server[] = {/*REDACTED*/}; 
int port = /*REDACTED*/; 
Client client(server, port); 

// State 
int sequence; 

void setup(){ 
    Ethernet.begin(mac, ip); 
    Serial.begin(9600); 
    sequence = 0; 

    delay(1000); 
} 

void loop(){ 
    httpPut("/topic/:test/publish?sessionId=SESenanhygrp"); 
    Serial.println(sequence++); 
} 

void httpPut(char* url){ 
    if (!client.connect()) { 
     Serial.println("EXCEPTION: during HTTP PUT. Could not connect"); 
     return; 
    } 

    client.print("PUT"); 
    client.print(" "); 
    client.print(url); 
    client.println(" HTTP/1.0"); 
    client.println(); 

    while(!client.available()){ 
     delay(1); 
    } 

    while(client.available()) { 
     char c = client.read(); 
     Serial.print(c); 
    } 

    while(client.connected()){ 
     Serial.println("Waiting for server to disconnect"); 
    } 

    client.stop(); 
} 

त्रुटि निम्नलिखित खंड में होता है

if (!client.connect()) { 
    Serial.println("EXCEPTION: during HTTP PUT. Could not connect"); 
    return; 
} 
+0

उस बिंदु पर जब ग्राहक कनेक्ट करने में विफल रहता है, तो मैं दो चीजें करता हूं: (1) किसी भी सबूत के लिए सर्वर लॉग जांचें असफल कनेक्शन अनुरोध प्राप्त करने वाले सर्वर का; (2) सर्वर पर 'नेटस्टैट' का उपयोग यह सुनिश्चित करने के लिए करें कि पिछले कनेक्शन बंद कर दिए गए हैं या नहीं हैं। – NPE

+0

उपरोक्त के अलावा, 3) मैं जांचता हूं कि स्टैक बह रहा है या नहीं। 4) क्या स्मृति मेमोरी है जो हजारों चक्रों के बाद होती है। – Jeff

+0

सर्वर लॉग ने किसी भी समस्या का संकेत नहीं दिया है। Arduinos का उपयोग करते समय मेमोरी हमेशा एक समस्या है, लेकिन उपर्युक्त कोड काफी 'स्मृति सुरक्षित' होना चाहिए – ChrisSSocha

उत्तर

0

v22 में Arduino ईथरनेट लाइब्रेरी में एक बग है (जैसा कि Linux/Windows V0022/1.0 Ethernet problem SOLVED में चर्चा की गई है)।

मेरे लिए समाधान Ethernet2 लाइब्रेरी (पीटर द्वारा tinker.it) का उपयोग करना था। कोड को मामूली झुकाव की आवश्यकता थी, लेकिन अब सबकुछ ठीक काम कर रहा है। मैंने बिना किसी समस्या के भेजे 40000+ से अधिक HTTP संदेश प्राप्त करने में कामयाब रहे हैं। (कभी-कभी एकल संदेश नहीं भेजे जा सकते हैं, लेकिन यह त्रुटि दर 4% से कम है।)

0

मैं संदेशों के बीच समय 10x बढ़ाकर संचार दर धीमा कर दूंगा। फिर यदि आपको 1000 और 7000 संदेशों के बीच कोई त्रुटि नहीं मिलती है, तो इसका शायद यह अर्थ होगा कि आप अपने छोटे Arduino के लिए बहुत तेज़ी से बात कर रहे हैं और इसके बफर को एक अतिप्रवाह हो जाता है जो दुर्भाग्यवश संचार पुस्तकालय से पुनर्प्राप्त नहीं हो सकता है। मैं प्रत्येक संदेश के बाद धारावाहिक बंदरगाह पर एक बफर में Arduino मुक्त बाइट्स की निगरानी भी करता हूं। आप इस व्यवहार के लिए पीसी से जितनी जल्दी हो सके संदेश भेजकर परीक्षण कर सकते हैं, और देख सकते हैं कि यह थोड़ी देर बाद आपके Arduino को जमा कर देगा या नहीं। यदि ऐसा होता है, तो आप संदेश को इनकार करने पर विचार कर सकते हैं जब तक कि बफर कुछ सीमा से ऊपर न हो।

संबंधित मुद्दे