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
-
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 đó.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
-
bởi lvhnHãng nào tùy thích thôi bác! bây giờ các hãng đều hỗ trợ xem qua máy tính hay điện thoại đều được. Gắn Trước tiên mua về cắm nguồn set ip hết xong hãy lắp lên, cam poe chỉ cần 4 lõi là hoạt động bình thường nên 1 dây kéo cho 2 cam vẫn ok
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 15:49 -
-
Trả lời cho Tìm bạn thân quen cũ.bởi lvhnNhớ không nhầm thì lúc còn đi học có gặp chú 1 lần cf bãi xe Nguyễn Kim, giờ quán cf đó nghỉ bán rồi
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 15:44 -
-
Trả lời cho Thắc mắc pin 21v ?bởi lvhnCon số đấy biểu thị gần đúng thôi, cái đồng hồ đó có đảm bảo chính xác hay không? pin có cục lên 4v4 vẫn bình thường. Cái gì cũng có sai số trong phạm vi không quá lớn thì không ảnh hưởng gì đâu, bàn ngay ngón ngắn ngón dài mà
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 15:32 -
-
Trả lời cho Amply bị rò DC 22 voltbởi lvhnThay mấy con transisto nhỏ đầu vào, thường vi sai lỗi hay bị. Khám tổng quát chân các linh kiện xem có bị rỉ sét nhiều không?
-
Channel: Điện thanh
Hôm qua, 15:24 -
-
bởi dinhthuong92Mạch này hiệu suất ra led đạt khoảng 90.7% tại 12V in, 40W out.
-
Channel: Nguồn!
27-07-2026, 10:15 -
-
bởi dinhthuong92Có lẽ nguồn viết bài này chỉ mang tính định tính để nói rằng cần thay đổi tổng trở tải để có Pmax chứ trình bày chưa chi tiết và thấu đáo một cách định lượng. Công thức tổng quát phải có mặt L mới được, và nói là "tổng...
-
Channel: Nguồn!
27-07-2026, 10:09 -
-
Trả lời cho [Chia sẻ] Tổng hợp các công ty AI Việt Nam đang làm gì thật sự — Từ voicebot, computer vision đến AI agentsbởi nguyendinhvanCàng ngày, CNTT càng trở nên lôi thôi , rách việc.
Cái AI và Ge... trên trình duyệt chỉ tổ làm vướng mắt, mất thì gian.
Tôi toàm phải mất cộng tắt nó đi.-
Channel: Xu hướng, nhu cầu và thị trường
25-07-2026, 14:59 -
-
bởi trung30000Em có con amply 12 sò D 718 và e688 , biến áp 15A, 30v 0 30 v, một kênh thì hoạt động bình thường, kênh còn lại nổ bụp bụp, sột sột, đèn tín hiệu nhảy lên vạch max, khoảng 4 đến 5 giây, sau đó đèn tín hiệu trả về mức không, Em thấy như...
-
Channel: Điện thanh
24-07-2026, 13:50 -
-
Trả lời cho Tìm hiểu máy hàn lăn (Rolling Welding)bởi hoang_3ibác cần thì liên hệ Em: mayhanhaivuong.com (0903238399)...
-
Channel: Điện tử công nghiệp
24-07-2026, 10:58 -
-
Trả lời cho Công thức tính định luật kirchhoffbởi abcnewmemberGiải bằng hệ phương trình bật nhất 3 ẩn.
...
-
Channel: Hỗ trợ học tập
23-07-2026, 14:52 -

Comment