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 Tiếng Anh cho người Việtbởi tuyennhanCái thư sai ngay câu chào Dear sir mới đúng Hi chỉ dùng cho người quen , các vấn đề về kỹ thuật nó không trả lời hoặc nói loanh quanh tránh ảnh hưởng đến công ty .
Giup1 người cần không giúp người không cần với lại văn mình vợ người nha đừng quên .-
Channel: Tâm tình dân kỹ thuật
hôm nay, 07:44 -
-
Trả lời cho Tiếng Anh cho người Việtbởi vi van phamCám ơn những lời chúc tốt đẹp của em.
Việc em làm giống như chê sếp dốt, chẳng những không có miếng xôi nào để ăn mà còn chịu nhiều trù dập lên bờ , xuống ruộng.
Hãy tránh vết xe đổ của tui đi. Dành thời gian lo cho gia đình....-
Channel: Tâm tình dân kỹ thuật
hôm nay, 02:00 -
-
Trả lời cho Tiếng Anh cho người Việtbởi nhathung1101Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.
Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.
Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 22:18 -
-
Trả lời cho Tiếng Anh cho người Việtbởi dinhthuong80Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.
Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 14:51 -
-
Trả lời cho Tiếng Anh cho người Việtbởi dinhthuong80Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.
Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 14:39 -
-
Trả lời cho Tiếng Anh cho người Việtbởi dinhthuong80Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.
Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 14:28 -
-
Trả lời cho Tiếng Anh cho người Việtbởi bqvietĐúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
-
Channel: Tâm tình dân kỹ thuật
21-02-2025, 20:26 -
-
Trả lời cho Tiếng Anh cho người Việtbởi mèomướpDạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
-
Channel: Tâm tình dân kỹ thuật
21-02-2025, 12:32 -
-
Trả lời cho Tiếng Anh cho người Việtbởi vi van phamNhững lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).
Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...-
Channel: Tâm tình dân kỹ thuật
20-02-2025, 21:31 -
-
Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )bởi bqvietThiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.20-02-2025, 17:22
Comment