Thông báo

Collapse
No announcement yet.

Giao thức TCP/IP và Web server với AVR

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Nguyên văn bởi wind-gon Xem bài viết
    Trước đây, mỗi kết nối TCP sẽ thực hiện chỉ 1 request HTTP và 1 response, nghĩa là nếu client request 2 lần thì sẽ cần 2 phiên kết nối TCP. Điều này gây ra nhiều bất cập, ảnh hưởng rất nhiều đến hiệu năng hoạt động của server.
    Hiện nay, giao thức HTTP đã hỗ trợ một phiên kết nối TCP cho phép nhiều HTTP request

    Client không cần phải chờ Server response mới có thể request và ngược lại.
    Hoạt động HTTP đơn giản nhất là GET. Đó là cách để Client lấy một đối tượng hoặc tài nguyên nào đó trên Server. Các trình duyệt sẽ yêu cầu một website từ Server với GET.
    Vâng ạ! Em cảm ơn anh wind-gon. Em xin mạo muội đóng góp ý kiến của mình về câu hỏi của anh bên trên: Em tưởng là nối các thiết bị như cùng chức năng như: PC với PC; PC với mạch Enc28j60 thì mới dùng cap chéo chứ ạ? còn nối từ PC hoặc Enc28j60 đến modem hoặc swich thì dùng cap song song chứ ạ? Em nghĩ như vậy ko biết có đúng không? nếu sai mong các anh chém nhẹ! Hi.

    Comment


    • Nguyên văn bởi nacdanh90 Xem bài viết
      Vâng ạ! Em cảm ơn anh wind-gon. Em xin mạo muội đóng góp ý kiến của mình về câu hỏi của anh bên trên: Em tưởng là nối các thiết bị như cùng chức năng như: PC với PC; PC với mạch Enc28j60 thì mới dùng cap chéo chứ ạ? còn nối từ PC hoặc Enc28j60 đến modem hoặc swich thì dùng cap song song chứ ạ? Em nghĩ như vậy ko biết có đúng không? nếu sai mong các anh chém nhẹ! Hi.
      Theo lý thuyết là vậy .Nhưng bạn xem PC với modem bây giờ nối với nhau bằng dây nào??cáp chéo vẫn ok đó.

      Comment


      • hi`! vâng ạ! chắc kiến thức của em còn hạn chế. Mong bác chém nhẹ! hi. Tại em thấy PC và modem nhà em nối với nhau bằng cáp song song nên vậy!

        Comment


        • Thầy và các anh cho em hỏi. Trong giao thức HTTP, khi hai bên client và server đã kết nối thì sau đó client có thể gửi bao nhiêu request đến server cũng được ạ? Trong một phiên TCP thì có giới hạn là client chỉ được gửi số lần hữu hạn request đến server không ạ? Hay là sau khi tạo kết nối client có thể gửi bao nhiêu request tùy ý miến là lần request tiếp theo vẫn chưa quá khoảng thời gian Keep alive mà hai bên đã thỏa thuận với nhau ạ?

          Comment


          • Mọi người cho em hỏi làm như thế nào để gửi ADC từ board đến PC vậy ạ.

            Comment


            • có chương trình này muốn đưa ra để mọi người cùng bàn luận PIC16f877a + ENC28j60 dùng CCSClick image for larger version

Name:	1.jpg
Views:	1
Size:	58.0 KB
ID:	1362368Click image for larger version

Name:	2.jpg
Views:	1
Size:	53.4 KB
ID:	1362369Click image for larger version

Name:	3.jpg
Views:	1
Size:	31.8 KB
ID:	1362370Click image for larger version

Name:	4.jpg
Views:	1
Size:	41.8 KB
ID:	1362371Click image for larger version

Name:	5.jpg
Views:	1
Size:	38.6 KB
ID:	1362372


              #include "tcpip/stacktsk.c" //include Microchip's TCP/IP stack
              #include "ccshelper.c" //include CCS's PICDEM.net/PICNET helper
              functions
              #include "ccshelperui.c"
              /////***** WEB PAGES STORED INTO PROGRAM MEMORY *****/////
              //The following escape characters are used:
              // %0 - AN0
              // %1 - AN1
              // %2 - BUTTON0
              // %3 - BUTTON1
              // %4 - Current LCD Message
              // %5 - CHECKED if LED1 is ON
              // %6 - CHECKED if LED1 is OFF
              // %7 - CHECKED if LED2 is ON
              // %8 - CHECKED if LED2 is OFF
              // %9 - Temperature (EWL ONLY)
              // %F - Message stack
              //here is this examples / page
              const char HTML_INDEX_PAGE[]=
              "<html><body bgcolor=#FFFFFF text=#000000>
              <br/>
              <h1>CCS HTTP/CGI EXAMPLE</h1>
              <h1>leethanhnc_nhim</h1>
              <p><b><i>%F</i></b></p>
              <form method=post>
              <table border=0>
              <tr><th>LCD:</th><td colspan=4><input type=\"text\" name=\"lcd\"
              size=20 maxlength=16 value=\"%4\"></td></tr>
              <tr><th>LED1:</th><td><input type=\"radio\" name=\"led1\" value=1
              %5></td><td>ON</td>
              <td><input type=\"radio\" name=\"led1\" value=0
              %6></td><td>OFF</td></tr>
              <tr><th>LED2:</th><td><input type=\"radio\" name=\"led2\" value=1
              %7></td><td>ON</td>
              <td><input type=\"radio\" name=\"led2\" value=0
              %8></td><td>OFF</td></tr>
              </table>
              <input type=\"hidden\" name=\"msgStack\" value=\"LCD/LEDs
              changed!\">
              <br/><input type=\"submit\"></form>
              <p><a href=\"/analog\">Analog Readings</a></p>
              </body></html>";
              //<img src=\"http://www.ccsinfo.com/images/CCSlogotiny.gif\">
              const char HTML_ANALOG_PAGE[]=
              "<html><body bgcolor=#ffffff text=#000000>
              <h1>leethanhnc_nhim</h1>
              <h1>PICNET ADC READINGS</h1>
              <p>%0</p>
              <br/>%1
              <p>%2</p>
              <br/>%3
              <p>%9</p>
              <p><a href=\"/\">Change LCD/LEDs</a></p>
              </body></html>";
              /////***** END OF WEB PAGES STORED INTO PROGRAM MEMORY *****/////
              char g_HTTPMessageStack[20]="";
              char g_HTTPLCDMessage[20]="CCS Webserver";
              //this is a callback function to the HTTP stack. see http.c
              //this demo provides to web "pages", an index (/) and an about
              page (/about)
              int32 http_get_page(char *file_str)
              {
              int32 file_loc=0;
              static char index[]="/";
              static char about[]="/analog";
              if (stricmp(file_str,index)==0)
              file_loc=label_address(HTML_INDEX_PAGE);
              else if (stricmp(file_str,about)==0)
              file_loc=label_address(HTML_ANALOG_PAGE);
              return(file_loc);
              }
              //this isn't a required callback, this is an application function
              being
              //used by http_format_char.
              int http_format_char_checked(int8 flag, char *str)
              {
              int len=0;
              if (flag)
              {
              sprintf(str,"checked=\"checked\"");
              len = 7;
              }
              return(len);
              }
              //this is a callback function to the HTTP stack. see http.c
              //The following escape characters are used:
              // %0 - AN0
              // %1 - AN1
              // %2 - BUTTON0
              // %3 - BUTTON1
              // %4 - Current LCD Message
              // %5 - CHECKED if LED1 is ON
              // %6 - CHECKED if LED1 is OFF
              // %7 - CHECKED if LED2 is ON
              // %8 - CHECKED if LED2 is OFF
              // %F - Message stack
              int8 http_format_char(int32 file, char id, char *str, int8
              max_ret) {
              char new_str[25];
              int8 len=0;
              int8 i;
              switch(id) {
              #if defined(ADC_CHAN_0)
              case '0':
              set_adc_channel(ADC_CHAN_0);
              delay_us(100);
              i=read_adc();
              sprintf(new_str,"<B>AN%U = </B>0x%X",ADC_CHAN_0,i);
              len=strlen(new_str);
              break;
              #endif
              #if defined(ADC_CHAN_1)
              case '1':
              set_adc_channel(ADC_CHAN_1);
              delay_us(100);
              i=read_adc();
              sprintf(new_str,"<B>AN%U = </B>0x%X",ADC_CHAN_1,i);
              len=strlen(new_str);
              break;
              #endif
              #if defined(USER_BUTTON1)
              case '2':
              sprintf(new_str,"<B>BTN1 = </B>");
              if (!BUTTON_PRESSED(USER_BUTTON1))
              sprintf(&new_str[14], "UP");
              else
              sprintf(&new_str[14], "DOWN");
              len=strlen(new_str);
              break;
              #endif
              #if defined(USER_BUTTON2)
              case '3':
              sprintf(new_str,"<B>BTN2 = </B>");
              if (!BUTTON_PRESSED(USER_BUTTON2))
              sprintf(&new_str[14], "UP");
              else
              sprintf(&new_str[14], "DOWN");
              len=strlen(new_str);
              break;
              #endif
              case '4':
              strncpy(new_str, g_HTTPLCDMessage, sizeof(new_str));
              new_str[sizeof(new_str)-1] = 0;
              len = strlen(new_str);
              break;
              case '5':
              len = http_format_char_checked(g_LEDState[0], new_str);
              break;
              case '6':
              len = http_format_char_checked(!g_LEDState[0], new_str);
              break;
              case '7':
              len = http_format_char_checked(g_LEDState[1], new_str);
              break;
              case '8':
              len = http_format_char_checked(!g_LEDState[1], new_str);
              break;
              #if STACK_USE_TEMP
              case '9':
              sprintf(new_str, "Temp: %6.2w&ordm F", read_full_temp());
              len=strlen(new_str);
              new_str[len]=0;
              break;
              #endif
              case 'F':
              strncpy(new_str, g_HTTPMessageStack, sizeof(new_str));
              new_str[sizeof(new_str)-1] = 0;
              len = strlen(new_str);
              g_HTTPMessageStack[0] = 0;
              break;
              }
              if (len){
              strncpy(str, new_str, max_ret);
              }else
              *str=0;
              return(len);
              }
              //this is a callback function to the HTTP stack. see http.c
              //in this example it verifies that "pwd" is "master", if it is
              //then it sets led1 and led2 ("led1" and "led2") based on their
              value
              //and changes the lcd screen ("lcd").
              void http_exec_cgi(int32 file, char *key, char *val) {
              static char led1_key[]="led1";
              static char led2_key[]="led2";
              static char lcd_key[]="lcd";
              static char msgStack_key[]="msgStack";
              int8 v;
              // #if defined(USER_LED1)
              if (stricmp(key,led1_key)==0) {
              v=atoi(val);
              g_LEDState[0]=v;
              }
              // #endif
              // #if defined(USER_LED2)
              if (stricmp(key,led2_key)==0) {
              v=atoi(val);
              g_LEDState[1]=v;
              }
              // #endif
              if (stricmp(key, msgStack_key)==0)
              {
              strncpy(g_HTTPMessageStack, val,
              sizeof(g_HTTPMessageStack));
              g_HTTPMessageStack[sizeof(g_HTTPMessageStack)-1] = 0;
              }
              if (stricmp(key,lcd_key)==0) {
              strncpy(g_HTTPLCDMessage, val, sizeof(g_HTTPLCDMessage));
              g_HTTPLCDMessage[sizeof(g_HTTPLCDMessage)-1] = 0;
              #if STACK_USE_PICDEM_LCD
              printf(lcd_putc,"\f%s",val);
              #endif
              }
              }
              void splash(void) {
              #IF STACK_USE_PICDEM_LCD
              printf(lcd_putc,"\fCCS Webserver");
              #ENDIF
              #if STACK_USE_ANNOUNCE
              InitAnnounce(" - EX_ST_WEBSERVER");
              #endif
              #if STACK_USE_SERIAL
              fprintf(USER,"\r\n\r\nCCS ex_st_webserver\r\n");
              ui_settings();
              ui_menu();
              #endif
              }
              void main(void)
              {
              fprintf(USER,"Init...");
              init(); // ccshelpers.c
              printf(lcd_putc,"\nAll Init OK ");
              fprintf(USER,"\nInit OK");
              delay_ms(1000);
              splash();
              while (TRUE) {
              restart_wdt();
              #if STACK_USE_SERIAL
              if (kbhit(USER)) {
              ui_handle();
              }
              #endif
              //every second: refresh current IP, blink LED
              if (second_counter>=1) {
              display_ip_lcd();
              #if defined(USER_LED3)
              output_toggle(USER_LED3);
              #endif
              second_counter=0;
              }
              //just something to test the buttons
              #if STACK_USE_CCS_PICNET
              if (BUTTON_PRESSED(USER_BUTTON1))
              {
              output_low(USER_LED1);
              }
              else
              {
              if (g_LEDState[0])
              output_low(USER_LED1);
              else
              {
              output_high(USER_LED1);
              }
              }
              if (BUTTON_PRESSED(USER_BUTTON2))
              {
              output_low(USER_LED2);
              }
              else
              {
              if (g_LEDState[1])
              output_low(USER_LED2);
              else
              {
              output_high(USER_LED2);
              }
              }
              #elif STACK_USE_CCS_PICENS
              if (g_LEDState[0])
              output_high(USER_LED1);
              else
              {
              output_low(USER_LED1);
              }
              if (g_LEDState[1])
              output_high(USER_LED2);
              else
              {
              output_low(USER_LED2);
              }
              if (BUTTON_PRESSED(USER_BUTTON1)) output_low(USER_LED3);
              #endif
              #if STACK_USE_PPP
              if (ppp_is_connected()) {
              #endif
              StackTask(); //Microchip's TCP/IP stack handler.
              Must be called routinely.
              #if STACK_USE_PPP
              }
              #endif
              }
              }

              Điện tử viễn thông - Hutech

              Comment


              • thêm 1 hinh nữa
                Click image for larger version

Name:	6.jpg
Views:	1
Size:	23.1 KB
ID:	1362373

                Điện tử viễn thông - Hutech

                Comment


                • co ai xem dum minh chuong trinh minh sai cho nao khong. thanksClick image for larger version

Name:	Noname.jpg
Views:	1
Size:	87.0 KB
ID:	1362394

                  chuongtrinh viet tren AVR studio.rar

                  Điện tử viễn thông - Hutech

                  Comment


                  • mình dùng card nạp stk500 isp/hv của thiên minh mà sao ko dc, bình thường quen sài trên codevisionAVR rồi nên giờ chuyển qua AVR studio chưa quen mong mọi người giúp đỡ

                    Điện tử viễn thông - Hutech

                    Comment


                    • Hình như hồi trước em gặp lỗi này rồi! Nếu như chưa tìm ra cách sửa anh thử gỡ winavr ra cài lại xem có được ko?

                      Sao firmware của anh trong ntAVRnet.h lại có hàm main ạ? em thấy trong ntAVRnet.c cũng có. TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW1) cũng bị lặp 2 lần.
                      Last edited by nacdanh90; 04-06-2012, 16:39.

                      Comment


                      • uhm mình thấy rồi thanks bạn nha. mà mình tháo ra cài avr studio rồi mà vẫn bị vậy ko biết tại sao nữa
                        Nguyên văn bởi nacdanh90 Xem bài viết
                        Hình như hồi trước em gặp lỗi này rồi! Nếu như chưa tìm ra cách sửa anh thử gỡ winavr ra cài lại xem có được ko?

                        Sao firmware của anh trong ntAVRnet.h lại có hàm main ạ? em thấy trong ntAVRnet.c cũng có. TIMER_INTERRUPT_HANDLER(SIG_OVERFLOW1) cũng bị lặp 2 lần.

                        Điện tử viễn thông - Hutech

                        Comment


                        • nhờ bạn debug chương trình mình xem dc ko sao làm hoài ko debug dc bạn ơi chán quáClick image for larger version

Name:	DSC01423.jpg
Views:	1
Size:	88.0 KB
ID:	1362419Click image for larger version

Name:	DSC01424.jpg
Views:	1
Size:	84.5 KB
ID:	1362420Click image for larger version

Name:	DSC01425.jpg
Views:	1
Size:	80.7 KB
ID:	1362421
                          bị lỗi khác nữa hixhixx
                          Click image for larger version

Name:	Noname1.jpg
Views:	1
Size:	67.3 KB
ID:	1362422
                          chuongtrinh viet tren AVR studio.rar

                          Điện tử viễn thông - Hutech

                          Comment


                          • à có lẽ do mình chưa cài WinAVR

                            Điện tử viễn thông - Hutech

                            Comment


                            • Em build bài của anh cứ bị lỗi Build failed... No build tools defined. Em ko biết tại sao. Các project khác em build vẫn ngon nên chắc ko phải tại winavr!

                              Comment


                              • Các anh cho em hỏi tại sao mạch của em khi lắp thêm 8 role từ để điều khiển 8 thiết bị lúc bật tắt các role cùng một lúc mạch hay bị chạy sai, thậm chí treo, khởi động lại. Em đã lắp thêm diod vào role, lắp nguồn cho role riêng nhưng thỉnh thoảng vẫn còn hiện tượng đó.

                                Comment

                                Về tác giả

                                Collapse

                                nttam79 Tìm hiểu thêm về nttam79

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X