2012-04-19 41 views
12

Tôi đang làm việc với giao tiếp socket trong Arduino và tôi cần khối try/catch để xử lý thích hợp, các bạn gợi ý điều gì? Tìm kiếm của tôi trên internet không thành công.khối try/catch trong Arduino

chỉnh sửa:

Mã Tôi đang làm việc với sử dụng mô-đun WiFly tương tác với một ứng dụng di động, Tôi đang xây dựng một module robot với một số kiểm soát đối với ứng dụng điện thoại di động sử dụng Android. Mọi thứ hoạt động tốt, nhưng đôi khi ổ cắm bị ngắt kết nối, vì vậy tôi cần thêm xử lý cho các trường hợp như vậy, một thứ tương tự như khối try/catch, nhưng tôi không tìm thấy khối tương tự cho Arduino.

Mã của tôi:

void loop() { 
    Client client = server.available(); 
    if (client) { 
     while (client.connected()) { 
      if (client.available()) { 
       // Serial.print("client connected \n"); 
       char c = client.read(); 

       if(c == 'L') 
        turnLeft(); 
       if(c == 'R') 
        turnRight(); 
       if(c == 'F') 
        goForward(); 
       if(c == 'B') 
        goBackward(); 
       if(c == 'S') 
        Stop(); 

       Serial.print(c); 
      } 
     } 

     // give the web browser time to receive the data 
     delay(100); 
     client.stop(); 
    } 
} 
+0

Bạn cần phải cung cấp cho chúng tôi một số thông tin ... Cũng giống như những gì bạn đã cố gắng, những gì bạn đã tìm thấy ... –

+0

Tôi vừa cập nhật câu hỏi – NZal

Trả lời

17

Các Arduino reference is không niêm yết try catch (để biết chi tiết về việc tại sao xem, ví dụ, related answer này). Và tôi cho rằng, việc thực hiện cố gắng nắm bắt trên một bộ điều khiển µ có thể là loại khó/không thể.

Thử bắt bằng hầu hết các ngôn ngữ là một hoạt động khá tốn kém: Ngăn xếp chương trình được sao chép một lần cho khối thử và cho mỗi khối catch. Trong trường hợp thử đi sai, ngăn xếp khối thử sẽ bị loại bỏ và một trong các ngăn chặn khối catch sẽ được thực thi.
Tôi không phải là chuyên gia về kiến ​​trúc cpu, nhưng tôi có thể tưởng tượng, điều này cần nhiều trao đổi bộ nhớ và các hoạt động tương tự - rất khó đạt được với một bộ điều khiển µ đơn giản.

chỉnh sửa
Nó có giá trị để tìm cách C-Programmers do patterns similar to try/catch

+0

Hãy xem câu trả lời này: http://stackoverflow.com/a/10586093/22470 – powtac

9

Arduino doesn't support exception handling. Tuy nhiên, bạn không cần phải sử dụng xử lý ngoại lệ để làm cho mã của bạn mạnh mẽ. Bằng cách kiểm tra các giá trị trả về của các hàm có thể thất bại, bạn có thể đạt được cùng một kết thúc.

Kể từ khi client.connected() được chọn mỗi lần vòng lặp và vì client.available() sẽ trả về 0 nếu không kết nối với lỗi duy nhất có thể chưa được xử lý là số tiền trả lại từ client.read().

Bạn có thể khắc phục điều này, ví dụ, bằng cách thay đổi dòng:

char c = client.read(); 

tới:

int i = client.read(); 
if (i == -1) { 
    break; 
} 
char c = (char) i; 
+0

cảm ơn rất nhiều! điều này đã được khai sáng! – NZal

+0

: (lỗi xử lý đó không có sẵn ... thay thế "kiểm tra giá trị trả lại mạnh mẽ" được đề cập là đáng ngờ. Nhiều chức năng như Serial.print cho ít hoặc không có thông tin liệu chúng có thực thi thành công hay không. vẫn còn bị mắc kẹt làm thế nào để con số để tránh skech của tôi từ crashing bằng cách chạy ra khỏi ram vì Serial.print không phải là lấy đi dữ liệu của nó! – humanityANDpeace

+0

Chạy ra khỏi SRAM là một vấn đề tôi đã gặp phải một số lần và bạn phải, có Thường không có cách nào tốt để kiểm tra điều này theo chương trình.Thông thường, các triệu chứng rõ ràng nhất của điều này là đầu ra nối tiếp bị hỏng Nếu bạn chỉ muốn hiểu được cách phác thảo của bạn đang sử dụng bộ nhớ, bạn có thể kiểm tra số lượng SRAM có sẵn bằng thư viện MemoryFree (cách đơn giản nhất là sao chép mã MemoryFree.cpp từ http://playground.arduino.cc/Code/AvailableMemory vào bản phác thảo của bạn và gọi 'freeMemory()'). –