Nguyên văn bởi Sangstbk
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
-
Hi, cám ơn anh, em đang chuẩn hóa lại chút nữa, xong xuôi em sẽ post lên để mọi người cùng chia sẻ
Có 1 vấn đề em thấy rất lạ là khi em dùng hàm IPSend
void ipSend(unsigned long dstIp, unsigned char protocol, unsigned int len, unsigned char* ipData)
{
struct ntEthHeader* ethHeader;
struct ntIPHeader* ipHeader;
ipHeader = (struct ntIPHeader*)(ipData - IP_HEADER_LEN);
ethHeader = (struct ntEthHeader*)(ipData - IP_HEADER_LEN - ETH_HEADER_LEN);
len += IP_HEADER_LEN;
ipHeader->desIPAddr = HTONL(dstIp);
ipHeader->srcIPAddr = HTONL(IpMyConfig.ip);
ipHeader->Protocol = protocol;
ipHeader->Len = HTONS(len);
ipHeader->verHdrLen = 0x45;
ipHeader->ToS = 0;
ipHeader->IDNumber = 0;
ipHeader->Offset = 0;
ipHeader->TTL = IP_TIME_TO_LIVE;
ipHeader->Checksum = 0;
ipHeader->Checksum = ipChecksum((unsigned char*)ipHeader, IP_HEADER_LEN);
if( (dstIp & IpMyConfig.netmask) == (IpMyConfig.ip & IpMyConfig.netmask) )
{
arpIpOut((unsigned char*)ethHeader,0); // local send
}
else
{
arpIpOut((unsigned char*)ethHeader,IpMyConfig.gateway); // gateway send
}
len += ETH_HEADER_LEN;
//#ifdef IP_DEBUG
uart_putstr("Sending IP packet\r\nAddr: ");
ipPrintAddr(dstIp);
uart_putstr("\n\rMAC: ");
ethPrintAddr(&(ethHeader->desAddr));
uart_putstr("\n\r");
//#endif
ethSendFrame(len, (unsigned char*)ethHeader);
}
Em khai báo 1 biến unsigned long desAddress và truyền tham số vào hàm
Tuy nhiên, khi em desAddress này lên trước và sau 2 lệnh:
ipHeader->desIPAddr = HTONL(dstIp);
ipHeader->srcIPAddr = HTONL(IpMyConfig.ip);
thì giá trị lại đảo cho
(VD: Bên trên: 192.168.1.11 thì put bên dưới lại là 11.1.168.192)
Nhưng khi em ko dùng truyền tham số vào dstIp mà em sử dụng trực tiếp biến desAddress thì không xảy ra lỗi ấy
Em sử dụng cách thứ 2 để không gặp lỗi ấy, cứ 5s em gọi hàm ipSend 1 lần và truyền đi. Tuy nhiên em dùng phần mềm Network monitor ở IP nhận thì không thấy dữ liệu truyền tới. Trong khi từ máy nhận ping đến vẫn reply bình thường. Em chưa biết cần thêm trường hay gì vào để bên nhận có thể nhận được. Mọi người giúp em với ạ. Xong cái này là hoàn thiện em sẽ post lên anh em cùng chia sẻ ạ
Comment
-
Nguyên văn bởi nttam79 Xem bài viếtTrong code của project trên thì không có code ghép data lớp ứng dụng lại, mà chỉ có code chia data ra. Vì trong project trên, AVR đóng vai trò HTTP server, nó gửi dữ liệu đi thì nhiều (nội dung website) nhưng nhận dữ liệu thì ít (chỉ nhận các bản tin HTTP request, gồm HTTPGet và HTTPPost).
Tuy nhien việc ghép data lại cũng dễ thôi, em có thể tự viết phần này, dựa vào dữ liệu trong một phiên kết nối TCP và số sequence.
Trong trường hợp em dùng UDP thì trong dữ liệu của em phải có đánh số thứ tự dữ liệu (do em tự qui định) vì trong giao thức UDP không có đánh số thứ tự các segment dữ liệu, nên thông thường ta phải dựa vào thông tin của giao thức lớp ứng dụng để ghép dữ liệu lại (RTP là một ví dụ).
Chúc em thành công.
Em cảm ơn thầy ạ.
Comment
-
Nguyên văn bởi nttam79 Xem bài viếtTôi cũng có làm về FPGA trên chip của Xilinx với ngôn ngữ VHDL và Verilog, nếu cần em cứ hỏi
Comment
-
Em đang định chuyển sang viết cho PIC bằng CCS từ code mà anh Tâm hướng dẫn, nhưng có một số chỗ thì chưa biết chuyển thế nào:
- Cách lưu mảng dữ liệu vào flash ROM của PIC (so với AVR):
Code:prog_char enc28j60_config[44] PROGMEM = { ETXSTL, LO8(TXSTART_INIT), //start lo ETXSTH, HI8(TXSTART_INIT), //start hi ETXNDL, LO8(TXSTOP_INIT ), //end lo ETXNDH, HI8(TXSTOP_INIT ), //end hi ERXSTL, LO8(RXSTART_INIT), //start lo ERXSTH, HI8(RXSTART_INIT), //start hi ERXNDL, LO8(RXSTOP_INIT ), //end lo ERXNDH, HI8(RXSTOP_INIT ), //end hi MACON2, 0x00, MACON1, (MACON1_MARXEN | MACON1_RXPAUS | MACON1_TXPAUS), MACON3, ( MACON3_PADCFG0 | MACON3_TXCRCEN | MACON3_FRMLNEN), MAMXFLL, LO8(1518), MAMXFLH, HI8(1518), MABBIPG, 0x12, //half duplex MAIPGL, 0x12, MAIPGH, 0x0C, //half duplex MAADR5, ENC28J60_MAC0, MAADR4, ENC28J60_MAC1, MAADR3, ENC28J60_MAC2, MAADR2, ENC28J60_MAC3, MAADR1, ENC28J60_MAC4, MAADR0, ENC28J60_MAC5 };
Code:void TCPCreateSession(unsigned int16 sourcePort, prog_void* appService);
Comment
-
Nguyên văn bởi chikichita Xem bài viếthixhix đang làm thêm phần điều khiển từ xa bằng RF mà ko biết phải làm thế nào cả, lên mạng tìm hiểu mua về cặp PT2262-PT2272 làm testboard cũng pó tay, ra nhật tảo mua cặp thu phát về xem mà thảm sầu vô biên, mạch toàn linh kiện dán không nhìn thấy mạch thế nào để tìm hiểu cả. Pótay.com rồi
2262-2272.zip
Comment
-
Thầy ơi, có chỗ này em không hiểu, xin thầy giải đáp cho em:
Em đang viết 1 giao thức chạy qua UDP, em thấy có 1 vấn đề là khi nhận được 1 bản tin và phải đáp ứng lại 1 bản tin thì bản tin nhận đc đang nằm trên buffer và bản tin đáp ứng phải đc viết nháp ở 1 vùng nhớ khác rồi copy về vùng nhớ bắt đầu bởi ethGetBuffer() + ETH_HEADER_LEN + IP_HEADER_LEN + 8. Mà RAM của ATmega32 khá nhỏ => phải viết trên ROM, nhưng ROM là bộ nhớ chỉ đọc, vậy viết nháp nó như thế nào ạ?
Mà sao em vẫn dùng hàm strcat() với chuỗi prog_char mà không báo lỗi ạ?
Xin thầy giúp em với.
Em cám ơn thầy ạ.
Comment
-
thanks bạn nhiều, bạn có thể gửi lại file capture đầy đủ ko vì chỉ mỗi file này mở ko lên dc , mấy ngày qua bận nhiều dự án cho công ty quá hết đi sóc trăng, đồng nai, rồi lại gia lai, làm mình không có thời gian làm tiếp nữa, hihi, chắc cuối tuần này sẽ cố gắng hoàn thành phần điều khiển từ xa cho cái mạch mình thêm sinh động.
Nguyên văn bởi mhl167 Xem bài viếtĐây là schematic mạch RF dùng cặp PT 2262-2272. Mình gửi cho mọi người làm để cùng phát triển topic này.
[ATTACH]50446[/ATTACH]Last edited by chikichita; 22-08-2012, 17:15.
Điện tử viễn thông - Hutech
Comment
-
Hồi đó mình vẽ bằng Eagle nên không mở được bằng Orcad. Mạch RF này mình làm đã chạy nhưng bạn nên thay đổi giá trị tụ pi và số vòng cuộn dây để được khoảng cách xa nhất nhé.
Mình cũng đang xem code của bạn và anh Tâm mà thấy hơi khó vì mình không rành phần giao thức mạng internet. Nên có gì bạn hướng dẫn giúp nhé.
Comment
-
Các anh ơi, cho em hỏi vài điều:
1) Trong hàm httpHeaderGetField(), thầy Tâm tính headerLen = (rqst->header) - (rqst->body) - 4;
Em nghĩ kết quả của nó là số âm. Vậy sao vẫn dùng được ạ?
2) Biến lưu trong Program Memory (kiểu prog_char) thì dùng hàm nào để thay đổi giá trị của nó ạ? Em đọc thư viện pgmspace.h với user_manual mà không thấy nói gì đến. Liệu nó có thể thay đổi đựoc không ạ? Hay là thay đổi nó hoàn toàn giống với biến trong SRAM? Em dùng ATmega32.
Xin các anh chỉ giáo. Tks
Comment
-
Nguyên văn bởi Sangstbk Xem bài viếtCó 1 vấn đề em thấy rất lạ là khi em dùng hàm IPSend
Em khai báo 1 biến unsigned long desAddress và truyền tham số vào hàm
Tuy nhiên, khi em desAddress này lên trước và sau 2 lệnh:
ipHeader->desIPAddr = HTONL(dstIp);
ipHeader->srcIPAddr = HTONL(IpMyConfig.ip);
thì giá trị lại đảo cho
(VD: Bên trên: 192.168.1.11 thì put bên dưới lại là 11.1.168.192)
Nhưng khi em ko dùng truyền tham số vào dstIp mà em sử dụng trực tiếp biến desAddress thì không xảy ra lỗi ấy
Vấn đề em gặp chắc liên quan đến chỗ này. nhưng chắc em phải post code cả 2 trường hợp lên thì mới giải thích được, vì đoc mô tả vẫn chưa hiểu rõ lắm.
Comment
-
Nguyên văn bởi joystick Xem bài viếtAnh Tâm đã làm trên fpga rùi ag? e đang tính làm trên board của xillinx. cho e hỏi là lập trình nó trên fpga thì cũng tương tự như trên vi điều khiển phải ko anh, nghĩa là tương ứng với các source file thì ta thiết kế một module trên đó. E không biết thế có đúng ko?
Nguyên văn bởi joystick Xem bài viếtEm đang định chuyển sang viết cho PIC bằng CCS từ code mà anh Tâm hướng dẫn, nhưng có một số chỗ thì chưa biết chuyển thế nào:
- Cách lưu mảng dữ liệu vào flash ROM của PIC (so với AVR):
- Cách truyền tham số con trỏ hàm :
Code:void TCPCreateSession(unsigned int16 sourcePort, prog_void* appService);
Với PIC anh thường dùng MPLAB với c18, c30,... chứ không dùng CCS, nên không chắc lắm.
Comment
-
Nguyên văn bởi dhp11591 Xem bài viếtCác anh ơi, cho em hỏi vài điều:
1) Trong hàm httpHeaderGetField(), thầy Tâm tính headerLen = (rqst->header) - (rqst->body) - 4;
Em nghĩ kết quả của nó là số âm. Vậy sao vẫn dùng được ạ?
2) Biến lưu trong Program Memory (kiểu prog_char) thì dùng hàm nào để thay đổi giá trị của nó ạ? Em đọc thư viện pgmspace.h với user_manual mà không thấy nói gì đến. Liệu nó có thể thay đổi đựoc không ạ? Hay là thay đổi nó hoàn toàn giống với biến trong SRAM? Em dùng ATmega32.
Xin các anh chỉ giáo. Tks
Vẫn được vì headerLen khai báo là unsigned và chỉ dùng để giới hạn số byte tìm kiếm, chỉ có là phải tìm lâu hơn thôi.
2-Biến lưu trong Program Memory về nguyên tắc là không thay đổi được (thực ra trong AVR vẫn có thể dùng lệnh ghi flash để thay đổi nó). Nếu đã muốn thay đổi thì không nên khai báo thuộc Program Memory.
Comment
-
Nguyên văn bởi dhp11591 Xem bài viếtThầy ơi, có chỗ này em không hiểu, xin thầy giải đáp cho em:
Em đang viết 1 giao thức chạy qua UDP, em thấy có 1 vấn đề là khi nhận được 1 bản tin và phải đáp ứng lại 1 bản tin thì bản tin nhận đc đang nằm trên buffer và bản tin đáp ứng phải đc viết nháp ở 1 vùng nhớ khác rồi copy về vùng nhớ bắt đầu bởi ethGetBuffer() + ETH_HEADER_LEN + IP_HEADER_LEN + 8. Mà RAM của ATmega32 khá nhỏ => phải viết trên ROM, nhưng ROM là bộ nhớ chỉ đọc, vậy viết nháp nó như thế nào ạ?
Mà sao em vẫn dùng hàm strcat() với chuỗi prog_char mà không báo lỗi ạ?
Xin thầy giúp em với.
Em cám ơn thầy ạ.
Comment
-
Em cảm ơn thầy ạ.
Em cũng vừa viết lại theo cách đó. Em đang viết SIP, viêt 9 lần rồi mà chưa thành công hẳn hoi.
Mà em cũng chưa hiểu, nếu lưu data vào PROGMEM thì làm sao cập nhật được ạ? Ý em là khi khai báo 1 mảng (1 vùng nhớ) cho 1 bộ đệm lưu những thứ cần thiết, thì phải khởi tạo luôn cho nó. Mà đã khởi tạo rồi thì không cập nhật được ạ. Em dịch, nó cứ báo lỗi read-only
Cuối cùng, em đành ngậm ngùi lưu qua EEPROM, chấp nhận cái giới hạn 100.000 lần ghi/xóa của nó để có cái đề mô
Vậy là đến giai đoạn bật wireshark bắt gói nghiền ngẫm như chuyên gia, có điều em nghiền 1 hồi mà vẫn chưa ngẫm ra tại sao bản tin của em lại có chỗ bị bôi vàng chóe????
Có phải do trong các URL, em viết thừa port 5060 của nó không ạ? Nhũng chỗ nào nên viết, nhưng chỗ nào không đựoc viết, xin thầy chỉ bảo cho em.
Hix, nếu post của em làm loãng 2pic, xin thầy và các anh thông cảm. Xin MOD đừng động đến
//-----------------------------------------
//Hóa ra header của SIP cũng kết thúc bằng 1 dòng trống, em không có cái đấy, wireshark nó chỉ cho mà lúc nãy không chịu đọcLast edited by dhp11591; 24-08-2012, 18:25.
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Vâng, xin được nói lời cảm ơn vì bác đã bỏ chút thời gian rảnh rỗi quí báu vào đây xem thử và nhiệt tình cho ý kiến.
Đã trót vào và thấy sai rồi thì bác mạnh dạn, ngại gì không chỉ ra giúp cái nốt sai ấy để tác giả sửa...-
Channel: Tâm tình dân kỹ thuật
hôm nay, 16:46 -
-
bởi nhathung1101Wrong translate! I don't care!
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 17:52 -
-
Trả lời cho Kiểm tra biến ápbởi nhathung1101Tôi viết bài này để anh em hiểu:
Cái loại Cty không có thiết bị chuyên dùng thì chỉ sang Tề Lỗ (Vĩnh Phúc) hoặc Văn Môn (Hưng Yên).
Vớ vẩn đừng trình bày....-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 17:42 -
-
Trả lời cho Kiểm tra biến ápbởi nhathung1101Ở trên Tề Lỗ (Vĩnh Phúc) có dịch vụ này mà. Họ cắt đôi ra rồi đếm. Hoặc tách ra rồi cân.
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 17:37 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi nhathung1101Lão lại bảo thủ. Giờ giới trẻ chơi 4/5 cơ.
Nó pha tạp thành "đít cô cha" còn gọi sang chảnh là Ca bóp hay Cu bóp gì đó hay đít ...
ha ha... Già rồi không thưởng nổi.
Chứ làm gì còn thời chúng ta chứ!
...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 17:27 -
-
Trả lời cho Máy ảnh máy tính xách tay không hoạt độngbởi pia2k1Mang quán quán sửa ngta xem cho bạn ạ...
-
Channel: Camera và xử lý ảnh
Hôm qua, 13:45 -
-
Trả lời cho Kiểm tra biến ápbởi bqvietNgười tàu bán máy này sang VN nhiều phết, ví dụ hàng của hãng GainKaiTa gì đó đủ loại từ đơn giản tới phức tạp
http://en.gkt.com.cn/
Kiểu 3259 cũ chẳng hạn, nhiều tính năng mà vẫn tương đối nhỏ gọn.-
Channel: Điện tử dành cho người mới bắt đầu
13-05-2024, 00:15 -
-
bởi lamvu0677Chào mọi người, e làm trong cty về biến áp , toàn mấy con nhỏ nhỏ, làm sao để mình có thể kiểm tra nhanh số vòng dây của mỗi cuộn , đầu vào đầu ra của dây, có thiết bị gì nhỏ gọn hỗ trợ việc này không ạ , xin cảm ơn...
-
Channel: Điện tử dành cho người mới bắt đầu
12-05-2024, 07:15 -
Comment