Nguyên văn bởi wind-gon
Xem bài viết
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
-
-
Nguyên văn bởi nacdanh90 Xem bài viếtVâ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
-
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
-
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 CCS
#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º 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
-
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ếtHì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á
bị lỗi khác nữa hixhixx
chuongtrinh viet tren AVR studio.rar
Điện tử viễn thông - Hutech
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
Bài viết mới nhất
Collapse
-
Trả lời cho Mua anten ở đâu?bởi tmcodonAnten bạn thu nguồn sóng nào vậy? Nếu xem truyền hình thì giờ k làm đc anten nữa rồi
-
Channel: Ăng ten và truyền sóng
Hôm qua, 15:34 -
-
Trả lời cho Mạch nguồn đôi dùng 7812 và 7912bởi tmcodonThank bác nhá. Tìm mãi mới thấy. Giờ vọc đã xem sao...
-
Channel: Hỗ trợ học tập
Hôm qua, 10:39 -
-
bởi tungdqEm cần tìm sơ đồ mạch một số Main máy tính đời cao như Asrock B560M-HDV, các cao nhân chỉ giúp với. Thank!
-
Channel: Các mạch điện ứng dụng
15-11-2024, 08:27 -
-
Trả lời cho Kiểm tra biến ápbởi lamvu0677nhân tiện cho mình hỏi thêm về cái phần test hipot (cao áp),là để kiểm tra độ bền cách điện giưa các cuộn dây,mà thấy thông số test thường ở mức 4kvac,vậy nếu mấy con fail đó xài bình thường vẫn dduocj phải không ạ,vì điện mình làm gì lên tới mức đó
-
Channel: Điện tử dành cho người mới bắt đầu
10-11-2024, 08:52 -
-
Trả lời cho Kiểm tra biến ápbởi lamvu0677máy đo số vòng thì cty có ,mà nó to quá,tưởng có máy nào gọn gọn bỏ túi được thì tiện hơn,vì đi lại nhiều...
-
Channel: Điện tử dành cho người mới bắt đầu
10-11-2024, 08:47 -
-
bởi tmcodonMình thấy diễn đàn có chuyên mục quảng cáo rồi mà. Bạn đóng góp để mở luồng riêng
-
Channel: Hướng dẫn sử dụng diễn đàn
09-11-2024, 13:36 -
-
bởi Nicole08Xin chào mọi người, tôi đã sử dụng Flashforge Inventor 2 được gần 5 năm và rất hài lòng với nó, nhưng tuần trước đã xảy ra sự cố. Có vẻ như động cơ bước đưa sợi in vào đầu nóng đã bị hỏng. Mọi thứ khác có vẻ ổn trên máy...
-
Channel: Điện tử dành cho người mới bắt đầu
09-11-2024, 12:55 -
Comment