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

  • chikichita
    replied
    hihi loay hoay mai cuối cùng cũng xong thầy ơi, hơi rắc rối một chút nhưng chạy cũng tạm ổn, em cám ơn thầy nhiều

    while(srcDataIdx < dataLen){
    i = 0;
    while(i<MAX_SEGMENT_SIZE){
    tmpChr = pgm_read_byte(progdata + srcDataIdx++);
    if(tmpChr == '%'){ //Truong hop ung voi dieu khien relay ("%RLx) hay gia tri AD ("%ADx")
    if( (i + 9) > MAX_SEGMENT_SIZE){ //Neu khong con du cho trong tren buffer
    srcDataIdx--;
    break;
    }
    //Tiep tuc neu du cho trong tren buffer
    tmpVar = pgm_read_byte(progdata + srcDataIdx + 3) - 0x30;
    if((pgm_read_byte(progdata + srcDataIdx) == 'R') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'L')&&(pgm_read_byte(progdata + srcDataIdx + 2) == '1'))
    {
    //if(GetRelayState(tmpVar))
    if(R1 == 1)
    {//checked
    dataBuffer[i++] = ' ';dataBuffer[i++] = 'c';dataBuffer[i++] = 'h';dataBuffer[i++] = 'e';
    dataBuffer[i++] = 'c';dataBuffer[i++] = 'k';dataBuffer[i++] = 'e';dataBuffer[i++] = 'd';dataBuffer[i++] = ' ';
    srcDataIdx += 5;
    }
    else
    {
    dataBuffer[i++] = ' ';dataBuffer[i++] = 'c';dataBuffer[i++] = 'h';dataBuffer[i++] = 'e';
    dataBuffer[i++] = 'c';dataBuffer[i++] = 'k';dataBuffer[i++] = 'e';dataBuffer[i++] = 'w';dataBuffer[i++] = ' ';
    srcDataIdx += 5;
    }
    }
    if((pgm_read_byte(progdata + srcDataIdx) == 'R') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'L')&&(pgm_read_byte(progdata + srcDataIdx + 2) == '2'))
    {
    //if(GetRelayState(tmpVar))
    if(R2 == 1)
    {//checked
    dataBuffer[i++] = ' ';dataBuffer[i++] = 'c';dataBuffer[i++] = 'h';dataBuffer[i++] = 'e';
    dataBuffer[i++] = 'c';dataBuffer[i++] = 'k';dataBuffer[i++] = 'e';dataBuffer[i++] = 'd';dataBuffer[i++] = ' ';
    srcDataIdx += 5;
    }
    else
    {
    dataBuffer[i++] = ' ';dataBuffer[i++] = 'c';dataBuffer[i++] = 'h';dataBuffer[i++] = 'e';
    dataBuffer[i++] = 'c';dataBuffer[i++] = 'k';dataBuffer[i++] = 'e';dataBuffer[i++] = 'w';dataBuffer[i++] = ' ';
    srcDataIdx += 5;
    }
    }

    //else if((pgm_read_byte(progdata + srcDataIdx) == 'A') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'D')){
    //tmpStr = (unsigned char*)uInt2StrLen(LM35_TYP_DECODE(GetADC(tmpVar)), 3);//(unsigned char*)uByte2Str(GetAD(tmpChr));
    //tmpVar = 0;
    //dataBuffer[i++] = tmpStr[tmpVar++];
    //dataBuffer[i++] = tmpStr[tmpVar++];
    //dataBuffer[i++] = '.';
    //dataBuffer[i++] = tmpStr[tmpVar++];
    //while(tmpStr[tmpChr] != 0){
    // dataBuffer[i++] = tmpStr[tmpChr++];
    //}
    //srcDataIdx += 4;
    //}

    Leave a comment:


  • chikichita
    replied
    thầy ơi hướng dẫn dùm em ép giá trị đó vô Ram được không ạ

    ví dụ như khi em viết chô wedpage thì em thêm "%RL1 checkew" rồi khi kiểm tra có check thì mình chỉ cần ép chữ "d" thế vào chỗ "w" được không thầy

    Leave a comment:


  • chikichita
    replied
    hihi chương trình em viết kiểu gì mà chiếm hết 98,8% bộ nhớ rồi, không ep thêm được nữa

    Leave a comment:


  • chikichita
    replied
    thầy có thể cho em xin đoạn đó được không ạ để em sửa lại theo chương trình của em xem thử,

    Leave a comment:


  • chikichita
    replied
    thầy ơi sao em vao thì bị mất Relay 01, nhưng sao nó không check

    while(srcDataIdx < dataLen){
    i = 0;
    while(i<MAX_SEGMENT_SIZE){
    tmpChr = pgm_read_byte(progdata + srcDataIdx++);
    if(tmpChr == '%'){ //Truong hop ung voi dieu khien relay ("%RLx) hay gia tri AD ("%ADx")
    if( (i + 9) > MAX_SEGMENT_SIZE){ //Neu khong con du cho trong tren buffer
    srcDataIdx--;
    break;
    }
    //Tiep tuc neu du cho trong tren buffer
    tmpVar = pgm_read_byte(progdata + srcDataIdx + 3) - 0x30;
    if((pgm_read_byte(progdata + srcDataIdx) == 'R') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'L')&&(pgm_read_byte(progdata + srcDataIdx + 2) == '1'))
    {
    //if(GetRelayState(tmpVar))
    {//checked
    dataBuffer[i++] = ' ';dataBuffer[i++] = 'c';dataBuffer[i++] = 'h';dataBuffer[i++] = 'e';
    dataBuffer[i++] = 'c';dataBuffer[i++] = 'k';dataBuffer[i++] = 'e';dataBuffer[i++] = 'd';
    }
    srcDataIdx += 8;
    }
    else
    {// Neu truong hop khac:
    dataBuffer[i++] = tmpChr;
    }
    }
    else{
    dataBuffer[i++] = tmpChr; //Copy data to tcp data buffer
    }
    if(srcDataIdx==dataLen){
    break;
    }
    }

    Leave a comment:


  • nttam79
    replied
    Nguyên văn bởi chikichita Xem bài viết
    thầy ơi hàm GetRelayState(tmpVar) là hàm lấy giá trị RL1, RL2 ah thầy, vậy mình phải viết hàm này

    tức là nếu là %RL1 thi có phải hàm GetRelayState(tmpVar) trả về tương ứng số 1
    Đúng rồi, hàm đó tôi không post lên đây vì mọi người điều khiển relay hay gì đó theo cách của mình. Miễn là cập nhật theo trạng thái thực tế của relay 1 thôi.

    Leave a comment:


  • chikichita
    replied
    thầy ơi hàm GetRelayState(tmpVar) là hàm lấy giá trị RL1, RL2 ah thầy, vậy mình phải viết hàm này

    tức là nếu là %RL1 thi có phải hàm GetRelayState(tmpVar) trả về tương ứng số 1

    Leave a comment:


  • chikichita
    replied
    dạ vâng em cám ơn thầy nhiều. Ngày mai bảo vệ đồ án rồi giờ thầy lên đúng là nắng hạn gặp mưa rào. Cám ơn thầy nhiều, chúc thầy nhiều sức khỏe. Mấy bữa này ngày đi làm ban đêm về làm đồ án mất ngủ đều đều, mệt mỏi quá thầy ơi.
    Mà thầy có biết loại modem nào hỗ trợ no-ip không thầy em tính làm một cái về lắp ở nhà để tiện điều khiển mà giờ kiếm thì chỉ có modem hỗ trợ dnydns.org thôi,
    Nguyên văn bởi nttam79 Xem bài viết
    Câu trả lời cho em đã có ở trên.

    Leave a comment:


  • nttam79
    replied
    Nguyên văn bởi vuxuansyhut Xem bài viết
    Chào thày Tâm và các bác. Lâu rồi không quay lại luồng này,giờ đọc thấy mấy chỗ khó hiểu quá. Xin thày và bác chỉ giúp.
    1 - Ở trong lưu đồ nói về phần giao thức TCP, nếu server đang ở trạng thái TCP_STATE_LISTEN, nếu nó nhận được SYN nó sẽ chuyển sang trạng thái TCP_STATE_SYN_RECEIVED và gửi trả ack=seq(client)+1, trong giai đoạn trao đổi dữ liệu TCP_STATE_ESTABLISHED thì ack=seq(client), các bác giúp em xem khi nào thì giá tri ack=seq(client)+1, khi nào thì ack=seq(client).
    2 -trên lưu đồ có chú thích "Receive ACK of FIN" làm sao xác đinh được ACK đó là cho FIN trong giai đoạn 1 bên kết thúc trao đổi dữ liệu còn bên kia vẫn còn
    3 -Tại sao tcpSessionTable[i].srcWin = 8192 mà không phải giá trị khác hay giá trị NETSTACK_BUFFERSIZE bằng bao nhiêu. Em vẫn chưa xác định được
    4 - Nếu có giá trị tcpSessionTable[i].srcWin = 8192 rồi thì có nghĩa là mỗi khi client nhận được 8192 byte thì mới reply xác nhận cho sever biết, em hiểu như vậy không biết có đúng không. Nếu như vậy thì việc kiểm tra sô byte nhận được và reply là do client tính toán và gửi, nhưng trong giao thức HTTP gói tin sẽ đực chia nhỏ thành các đoạn có độ dài MSS byte. Theo cách nghĩ của em thì MSS byte này nếu không là ước của srcWin thì khi client trả lời sẽ lệch thông số với sever gửi. Trên code của thày Tâm viết cho sever cũng không thấy có đoạn xử lý này.
    Mong mọi người giải thích giúp em.
    1-Giá trị ACK luôn là số seq của bản tin tiếp theo mà nó mong muốn được nhận:
    - Ví dụ: client nhận được 1 bản tin có seq = 1234, có chiều dài dữ liệu 1 byte (ví dụ bản tin SYN) thì nó sẽ trả lời với ACK là 1235.
    - Nếu nhận được 1 bản tin có seq là 6322, chứa dữ liệu gồm 1000 byte (từ byte thứ 6322 - 7321) thì nó sẽ xác nhận với ACK là 7322.
    Ở đây có 1 lưu ý quan trọng dễ mắc sai khi lập trình (mình vướng cái này phải debug mãi mới được). Đó là có 1 số bản tin đặc biết (ví dụ SYN) mặc dù không chứa 1 byte dữ liệu nào trong phần body, nhưng cũng được xem là có chiều dài dữ liệu bằng 1 (do đó seq và ack phải tăng lên).
    2-Ack đó có giá trị trường Ack phù hợp với giá trị của trường Seq của bản tin chứa cờ FIN.
    3-SrcWin trên do người lập trình chọn thôi, tùy thuộc tài nguyên, cách xử lý,...
    4-Đúng ra ý nghĩa của window trong tcp là client không được để số dữ liệu nhận được vượt quá chiều dài cửa sổ mà không xác nhận. Vì phía gửi sẽ lưu backup dữ liệu đã gửi trong buffer có chiều dài bằng cửa sổ này. Nếu buffer đầy, tức là khoảng cách từ ack cuối cùng nó nhận được đến byte cuối cùng mà nó vừa gửi bằng chiều dài của sổ, thì nó sẽ dừng lại không gửi tiếp, nếu sau timeout mà không có ack, nó sẽ gửi lại dữ liệu (từ ack cuối cùng).
    Như vậy không nhất thiết phía nhận phải đợi nhận đủ một đoạn dữ liệu bằng chiều dài window mới xác nhận ack, mà chỉ cần đảm bảo là phải xác nhận ack trước khi buffer phía gửi đầy (trước khi đạt tới chiều dài của cửa số, để quá trình gửi dữ liệu không bị gián đoạn). Do đó mới có khái niệm cửa sổ trượt trong TCP.
    Vậy thì chiều dài dữ liệu trong gói tin có là ước số của window hay không không quan trọng.

    Leave a comment:


  • nttam79
    replied
    Nguyên văn bởi chikichita Xem bài viết
    em bị vướng ngay đoạn này nè thầy,
    [ATTACH=CONFIG]48663[/ATTACH]

    ở đây có đoạn hàm
    HTTPSend(Page1,sizeof(Page1)-1,pSession,1);
    gửi wed lên thì trước đó mình có phải lưu những checkbox đó vào trong RAM không hay là làm sao để chèn checkbox được ạ thầy em loay hoay mãi ở đoạn này mà không biết giải quyết thế nào cả.

    có khi em thay dòng này HTTPSend(Page1,sizeof(Page1)-1,pSession,1); bằng HTTPSend(HTTP_REQUEST_POST,sizeof(HTTP_REQUEST_POS T)-1,pSession,1) thì nó lên tùm lum hihi hài vãi chưởng luôn thầy, đúng là gà thiệt,
    Câu trả lời cho em đã có ở trên.

    Leave a comment:


  • nttam79
    replied
    II-Điều khiển relay khi nhận được HTTP post (người dùng nhấn nút Submit trên trang web):
    Cái này ta phải sửa trong hàm HTTPDataIn(), ở phần xử lý bản tin HTTP POST
    Ví dụ:
    Code:
    //--------------------------------------------------------------------------------------
    //Ham xu ly mot goi thuoc giao thuc HTP nhan duoc
    void httpDataIn(unsigned char *buffer,unsigned int bufferLen,struct tcpSession *pSession)
    {
    	unsigned char i;
    	unsigned char *tmpstr;
    	unsigned char tmpRelaySts;
    	//struct httpRequest rqst;
    	//Tim xem cophien HTTP service da co cho phien TCP nay khong
    	for(i=0; i < MAX_HTTP_SESSION; i++){
    		if((httpSessionTable[i].status != HTTP_STATUS_IDLE) && (httpSessionTable[i].pTCPSession == pSession))
    			break;
    	}
    	if(i == MAX_HTTP_SESSION){
    		//Tim 1 phien trong
    		for(i=0; i < MAX_HTTP_SESSION; i++){
    			if(httpSessionTable[i].status == HTTP_STATUS_IDLE){
    				httpSessionTable[i].pTCPSession = pSession;
    				break;
    			}
    		}
    	}
    	if(httpSessionTable[i].status == HTTP_STATUS_IDLE){
    	//If this is a new HTTP request
    		//Check for request method
    		httpGetRequest(buffer,bufferLen,&(httpSessionTable[i].rqst));
    		//TCPPackedSend(pSession,(TCP_ACK_FLAG),0,buffer);
    		if(httpSessionTable[i].rqst.method == HTTP_REQUEST_UNKNOWN){
    		//if invalid request, just cancel
    			httpSessionTable[i].status = HTTP_STATUS_IDLE;
    			return;
    		}else{
    		//Set HTTP session to HEADER_RECEIVED (for next process)
    			httpSessionTable[i].status = HTTP_STATUS_HEADER_RECEIVED;
    		}
    	}
    	//If got header
    	if(httpSessionTable[i].status == HTTP_STATUS_HEADER_RECEIVED){
    		//Check for auth string
    		if(httpSessionTable[i].auth != 1){
    			tmpstr = httpHeaderGetField(Auth_prog,&(httpSessionTable[i].rqst));
    			if(findstrdatamem(http_auth_password,tmpstr,httpSessionTable[i].rqst.body-tmpstr) != -1){
    				#ifdef HTTP_DEBUG
    				printf("Auth OK\n\r");
    				printfStr(http_auth_password);
    				printf("Input\n\r");
    				printfStr(tmpstr);
    				#endif
    				httpSessionTable[i].auth = 1;
    			//If not valid auth
    			}else{
    				#ifdef HTTP_DEBUG
    				printf("Auth fail\n\r");
    				printf("Auth string:");
    				printfStr(http_auth_password);
    				printf("\n\r");
    				printf("Received string:");
    				printfStrLen(tmpstr,0,20);
    				#endif
    				HTTPSend(http_header3,sizeof(http_header3)-1,pSession,0);
    				HTTPSend(Page0,sizeof(Page0)-1,pSession,1);
    				httpSessionTable[i].status = HTTP_STATUS_IDLE;
    				return;
    			}
    		}
    		//Process for each method
    		//If GET method
    		if(httpSessionTable[i].rqst.method == HTTP_REQUEST_GET){
    			#ifdef HTTP_DEBUG
    			printf("GET HEADER:\n\r");
    			printfStrLen(httpSessionTable[i].rqst.header,0
    					,(httpSessionTable[i].rqst.body - httpSessionTable[i].rqst.header) + httpSessionTable[i].rqst.bodyLen);
    			#endif
    			//If GET the main website
    			if((httpSessionTable[i].rqst.requestURI[0] == '/') && (httpSessionTable[i].rqst.requestURI[1] == ' ')){
    				HTTPSend(http_header1,sizeof(http_header1)-1,pSession,0);
    				HTTPSend(Page1,sizeof(Page1)-1,pSession,1);
    				httpSessionTable[i].status = HTTP_STATUS_IDLE;
    			//If error
    			}else{
    				HTTPSend(http_error_notimp,sizeof(http_error_notimp),pSession,1);
    				httpSessionTable[i].status = HTTP_STATUS_IDLE;
    			}
    			return;
    		//If POST method
    		}else if(httpSessionTable[i].rqst.method == HTTP_REQUEST_POST){
    			//Update POS data
    			if(findstr(PSTR("SUB=Submit"),buffer,bufferLen) != -1){
    				tmpRelaySts = 0x00;
    				if((findstr(PSTR("RELAY1=ON"),buffer,bufferLen)) != -1){
    					//SetRelayState(1,1);
    					tmpRelaySts += 1;
    					#ifdef HTTP_DEBUG
    					printf("Relay 1 on\r\n");
    					#endif
    				}else{
    					//SetRelayState(1,0);
    					//tmpRelaySts += 2;
    					#ifdef HTTP_DEBUG
    					printf("Relay 1 off\r\n");
    					#endif
    				}
    				if((findstr(PSTR("RELAY2=ON"),buffer,bufferLen)) != -1){
    					//SetRelayState(2,1);
    					tmpRelaySts += 2;
    					#ifdef HTTP_DEBUG
    					printf("Relay 2 on\r\n");
    					#endif
    				}else{
    					//SetRelayState(2,0);
    					//tmpRelaySts += 8;
    					#ifdef HTTP_DEBUG
    					printf("Relay 2 off\r\n");
    					#endif
    				}
    				if((findstr(PSTR("RELAY3=ON"),buffer,bufferLen)) != -1){
    					//SetRelayState(3,1);
    					tmpRelaySts += 4;
    					#ifdef HTTP_DEBUG
    					printf("Relay 3 on\r\n");
    					#endif
    				}else{
    					//SetRelayState(3,0);
    					#ifdef HTTP_DEBUG
    					printf("Relay 3 off\r\n");
    					#endif
    				}
    				if((findstr(PSTR("RELAY4=ON"),buffer,bufferLen)) != -1){
    					//SetRelayState(4,1);
    					tmpRelaySts += 8;
    					#ifdef HTTP_DEBUG
    					printf("Relay 4 on\r\n");
    					#endif
    				}else{
    					//SetRelayState(4,0);
    					#ifdef HTTP_DEBUG
    					printf("Relay 4 off\r\n");
    					#endif
    				}
    				UpdateCtrlSts(tmpRelaySts);
    				//Send HTTP data
    				HTTPSend(http_header1,sizeof(http_header1)-1,pSession,0);
    				HTTPSend(Page1,sizeof(Page1)-1,pSession,1);
    				httpSessionTable[i].status = HTTP_STATUS_IDLE;
    				return;
    			}else if(findstr(PSTR("APPLY=Apply"),buffer,bufferLen) != -1){
    				HTTPSend(http_header1,sizeof(http_header1)-1,pSession,0);
    				HTTPSend(Page1,sizeof(Page1)-1,pSession,1);
    				httpSessionTable[i].status = HTTP_STATUS_IDLE;
    			}else{
    				HTTPSend("",0,pSession,0);
    			}
    		}
    	}
    }
    //--------------------------------------------------------------------------------------
    Giải thích:
    - Khin người dùng nhấn Submit, client sẽ gửi 1 bản tin HTTPPost, request chính trang web đó, nhưng trong mesage body có chứa thông tin lấy từ form trên trang web (trạng thái các ôn check mà người dùng đã thay đổi).
    - Ví dụ, trên trang web (trong webpage.h) ta đã khai báo các ô check như sau:

    <p align="left"><input type="checkbox" name="RELAY1" value="ON"%RL1>Relay 01</p>
    <p align="left"><input type="checkbox" name="RELAY2" value="ON"%RL2>Relay 02</p>
    <p align="left"><input type="checkbox" name="RELAY3" value="ON"%RL3>Relay 03</p>
    <p align="left"><input type="checkbox" name="RELAY4" value="ON"%RL4>Relay 04</p>
    Đối với relay 1, khai báo như vậy tức là tên đối tượng là RELAY1 (name="RELAY1"), giá trị nhận được khi nó được check là ON (value="ON")
    Như vậy giả sử các check box 1 và 3 được check, 2 và 4 bỏ trống, thì khi nhấn Submit, thông tin sau sẽ được gửi đi:
    RELAY1=ON
    RELAY3=ON
    Còn điều khiển relay thế nào là do các bạn thôi. Ở trong ví dụ trên mình lưu trạng thái các relay trong biến tmpRelaySts, sau đó mới gọi hàm UpdateCtrlSts(tmpRelaySts) để thực thi các trạng thái đó.
    Chúc các bạn thành công. Xin lỗi vì đã để mọi người đợi quá lâu.

    Leave a comment:


  • nttam79
    replied
    Nguyên văn bởi wind-gon Xem bài viết
    Mừng quá anh đã trở lại. Công việc của anh thế nào,có bận rộn,áp lực như trước mà anh nói không?
    Ah,Anh có thể nói rõ hơn phần này giúp em với???Em loay hoay mãi không sửa được.
    Hiện tại em đã làm xong đầy đủ phần mạch điều khiển được các thiết bị quạt,đèn(1 chiều + xoay chiều),cảm biến chống trộm,và lập trình hẹn thời gian.
    Công việc vẫn vậy, có khi còn bận rộn hơn, chán quá, làm hoài không hết, việc ở đâu cứ ùn ùn kéo tới.
    Nói chung cách làm như sau:
    I-Cập nhật trạng thái các relay và giá trị sensor cho Web:
    Mọi người để ý là trong nội dung trang web, ở chỗ giá trị của relay và sensor mình để 1 keyword tương ứng, đó là: %RL1, %RL2, %RL3, %RL4 và %AD0, %AD1.
    Chỗ này chính là chỗ cần thay thế các giá trị tương ứng trước khi gửi nội dung xuống cho client.
    Vậy trong hàm HTTPSend() (hàm gửi nội dung web xuống client) cần sửa lại để cập nhập các thông tin này. Ví dụ như sau:
    Code:
    void	HTTPSend(const prog_char progdata[],unsigned int dataLen,struct tcpSession *pSession, unsigned char endData)
    {
    	unsigned int i;
    	unsigned int srcDataIdx = 0;
    	unsigned char* dataBuffer;
    	unsigned char Flags;
    	unsigned char tmpChr,tmpVar;
    	unsigned char* tmpStr;
    	Flags = TCP_PSH_FLAG;
    	dataBuffer = ethGetBuffer() + ETH_HEADER_LEN + IP_HEADER_LEN + TCP_HEADER_LEN;
    	if(dataLen == 0){
    		Flags |= TCP_ACK_FLAG;
    		if(endData){
    			if(srcDataIdx == dataLen){
    				Flags |= TCP_FIN_FLAG;
    				pSession->sesState = TCP_STATE_FIN_WAIT1;
    			}
    		}
    		TCPPackedSend(pSession,Flags,0,dataBuffer);
    	}
    	while(srcDataIdx < dataLen){
    		i = 0;
    		while(i<MAX_SEGMENT_SIZE){
    			tmpChr = pgm_read_byte(progdata + srcDataIdx++);
    			if(tmpChr == '%'){	//Truong hop ung voi dieu khien relay ("%RLx) hay gia tri AD ("%ADx")
    				if( (i + 9) > MAX_SEGMENT_SIZE){	//Neu khong con du cho trong tren buffer
    					srcDataIdx--;
    					break;
    				}
    				//Tiep tuc neu du cho trong tren buffer
    				tmpVar = pgm_read_byte(progdata + srcDataIdx + 3) - 0x30;
    				if((pgm_read_byte(progdata + srcDataIdx) == 'R') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'L')){
    					if(GetRelayState(tmpVar)){//checked
    						dataBuffer[i++] = ' ';dataBuffer[i++] = 'c';dataBuffer[i++] = 'h';dataBuffer[i++] = 'e';
    						dataBuffer[i++] = 'c';dataBuffer[i++] = 'k';dataBuffer[i++] = 'e';dataBuffer[i++] = 'd';
    					}
    					srcDataIdx += 4;
    				}else if((pgm_read_byte(progdata + srcDataIdx) == 'A') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'D')){
    					tmpStr = (unsigned char*)uInt2StrLen(LM35_TYP_DECODE(GetADC(tmpVar)),3);//(unsigned char*)uByte2Str(GetAD(tmpChr));
    					tmpVar = 0;
    					dataBuffer[i++] = tmpStr[tmpVar++];
    					dataBuffer[i++] = tmpStr[tmpVar++];
    					dataBuffer[i++] = '.';
    					dataBuffer[i++] = tmpStr[tmpVar++];
    					//while(tmpStr[tmpChr] != 0){
    					//	dataBuffer[i++] = tmpStr[tmpChr++];
    					//}
    					srcDataIdx += 4;
    				}else{// Neu truong hop khac:
    					dataBuffer[i++] = tmpChr;
    				}
    			}
    			else{
    				dataBuffer[i++] = tmpChr;	//Copy data to tcp data buffer
    			}
    			if(srcDataIdx==dataLen){
    				break;
    			}
    		}
    		Flags |= TCP_ACK_FLAG;
    		if(endData){
    			if(srcDataIdx == dataLen){
    				Flags |= TCP_FIN_FLAG;
    				pSession->sesState = TCP_STATE_FIN_WAIT1;
    			}
    		}
    		TCPPackedSend(pSession,Flags,i,dataBuffer);
    		//delay_ms(100);
    		#ifdef NETSTACK_DEBUG
    		printf("Sent %d byte\r\n",srcDataIdx);
    		#endif
    	}
    }
    //--------------------------------------------------------------------------------------
    Các bạn thấy khá đơn giản, khi tìm thấy ký tự %, nếu tiếp theo là RL1 (%RL1) thì ta thay trạng thái của Relay 1 vào: nếu Relay 1 đang đóng thì giá trị đó là "checked", nếu Relay 1 đang nhả, thì để trống (hay "unchecked").
    Tương tự, nếu ký tự tiếp theo là AD0 (%AD0) thì ta thay giá trị tương ứng đọc từ ADC vào.
    Chú ý khi thay các giá trị tương ứng ta phải tăng biến đếm (srcDataIdx) lên tương ứng với chiều dài mà ta thêm vào.

    Leave a comment:


  • wind-gon
    replied
    Nguyên văn bởi nttam79 Xem bài viết
    Để cập nhật nút check và thực thi các điều khiển được submit trên web, phải viết thêm phần này vào trong hàm xử lý http request.
    Mừng quá anh đã trở lại. Công việc của anh thế nào,có bận rộn,áp lực như trước mà anh nói không?
    Ah,Anh có thể nói rõ hơn phần này giúp em với???Em loay hoay mãi không sửa được.
    Hiện tại em đã làm xong đầy đủ phần mạch điều khiển được các thiết bị quạt,đèn(1 chiều + xoay chiều),cảm biến chống trộm,và lập trình hẹn thời gian.

    Leave a comment:


  • chikichita
    replied
    ah tiện thể mọi người có biết loại modem nào có hỗ trợ no-ip không, mình có mua mấy loại rồi mà không có cái nào hỗ trợ cả, được cái của viettel thì chỉ hỗ trợ dnydns.org với TZo thôi mà loại này phải trả phí, lên mạng tìm chỉ có draytek thôi
    hixhix chán quá, mua hết 3 loại modem của viettel, VNPT, Heiwei mà ko trúng cái nào.

    Leave a comment:


  • chikichita
    replied
    em bị vướng ngay đoạn này nè thầy,
    Click image for larger version

Name:	as.jpg
Views:	1
Size:	128.5 KB
ID:	1364095

    ở đây có đoạn hàm
    HTTPSend(Page1,sizeof(Page1)-1,pSession,1);
    gửi wed lên thì trước đó mình có phải lưu những checkbox đó vào trong RAM không hay là làm sao để chèn checkbox được ạ thầy em loay hoay mãi ở đoạn này mà không biết giải quyết thế nào cả.

    có khi em thay dòng này HTTPSend(Page1,sizeof(Page1)-1,pSession,1); bằng HTTPSend(HTTP_REQUEST_POST,sizeof(HTTP_REQUEST_POS T)-1,pSession,1) thì nó lên tùm lum hihi hài vãi chưởng luôn thầy, đúng là gà thiệt,
    Last edited by chikichita; 20-07-2012, 02:07.

    Leave a comment:

Về tác giả

Collapse

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

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

Collapse

  • Andrea14
    Vấn đề về tốc độ quay
    bởi Andrea14
    Chào mọi người,

    Tôi muốn mô phỏng sự thay đổi các mùa bằng cách từ từ nghiêng một quả địa cầu 16 inch bằng một động cơ bước nhỏ. Một động cơ bước khác sẽ quay quả địa cầu theo thời gian thực. Hệ thống truyền động...
    hôm nay, 12:42
  • bqviet
    Trả lời cho Đấu tắt điện cho máy tính bảng
    bởi bqviet
    Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
    06-12-2025, 17:17
  • nguyendinhvan
    Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
    bởi nguyendinhvan
    Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
    05-12-2025, 19:59
  • afrendly
    Trả lời cho Đấu tắt điện cho máy tính bảng
    bởi afrendly
    Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
    04-12-2025, 01:27
Đang tải...
X