2011-09-15 22 views
5

Tôi đang sử dụng Arduino Uno với Ethernet Shield.Kết nối máy khách Ethernet (Uno) không thành công sau khi nhiều máy khách in

Sau khi gửi nhiều yêu cầu HTTP, client.println (...), khách hàng bắt đầu không thành công khi kết nối. Thời gian để thất bại dường như là ngẫu nhiên, và đọc chuỗi từ vòng lặp có thể thay đổi bất cứ nơi nào giữa ~ 1000 và ~ 7000.

Các lỗi không phải là để làm với Ethernet Transmit Buffer tràn (Sau this advice)

Đây là mã được không:

#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(); 
} 

Lỗi này xảy ra trong phân khúc sau

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

Tại thời điểm khách hàng không kết nối được, tôi sẽ làm hai việc: (1) kiểm tra nhật ký máy chủ để tìm bất kỳ bằng chứng nào của máy chủ nhận được yêu cầu kết nối không thành công; (2) sử dụng 'netstat' trên máy chủ để xác định liệu các kết nối trước đó đã bị đóng hay đang kéo dài. – NPE

+0

Ngoài việc ở trên, 3) Tôi sẽ kiểm tra xem ngăn xếp có tràn không. 4) Có rò rỉ bộ nhớ xảy ra sau hàng nghìn chu kỳ. – Jeff

+0

Nhật ký máy chủ không cho biết bất kỳ sự cố nào. Bộ nhớ luôn là một vấn đề khi sử dụng Arduinos, nhưng đoạn mã trên phải khá 'an toàn bộ nhớ' – ChrisSSocha

Trả lời

0

Có lỗi trong thư viện Ethernet Ethernet trong v22 (như được thảo luận trong Linux/Windows V0022/1.0 Ethernet problem SOLVED).

Giải pháp cho tôi là sử dụng thư viện Ethernet2 (bởi Peter từ tinker.it). Đoạn mã này cần được sửa đổi nhỏ, nhưng mọi thứ dường như vẫn hoạt động tốt. Tôi đã quản lý để nhận hơn 40000 tin nhắn HTTP được gửi mà không gặp bất kỳ sự cố nào. (Đôi khi không thể gửi tin nhắn đơn, nhưng tỷ lệ lỗi này nhỏ hơn 4%.)

0

Tôi sẽ làm chậm tốc độ truyền thông bằng cách tăng thời gian 10x giữa các tin nhắn. Sau đó, nếu bạn không nhận được một lỗi giữa 1000 và 7000 tin nhắn, nó có thể có nghĩa là bạn đang nói quá nhanh với Arduino nhỏ của bạn và nó đệm được một tràn mà thư viện truyền thông tiếc là không thể phục hồi từ. Tôi cũng sẽ theo dõi Arduino miễn phí byte trong một bộ đệm trên cổng nối tiếp sau mỗi tin nhắn. Bạn cũng có thể thử nghiệm cho hành vi này bằng cách gửi tin nhắn nhanh như bạn có thể từ máy tính, và xem nếu điều đó sẽ đóng băng Arduino của bạn sau một thời gian. Nếu có, bạn có thể xem xét từ chối thông báo cho đến khi bộ đệm vượt quá giới hạn.