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 Hỏi xin sơ đồ tivi các loạibởi Trân thànhCần các Bạn giúp sơ đồ Lcd Samsung UA40JU6400 và UA43ku6500k. Xin cảm ơn!...
-
Channel: Điện tử truyền hình
Hôm qua, 16:07 -
-
Trả lời cho Hỏi xin sơ đồ tivi các loạibởi Trân thànhCần các Bạn giúp sơ đồ Lcd Samsung UA40JU6400 và UA43ku6500k. Xin cảm ơn!...
-
Channel: Điện tử truyền hình
Hôm qua, 16:01 -
-
bởi chinhnguyen9Hoạt động của thế hệ mạch cân bằng trước đây dựa trên nguyên lý so áp giữa 2 string liền kề. Hoạt động cân bằng chỉ kích hoạt khi sự chênh lệch vượt ngưỡng 100mV và ngưng hoạt động khi mức chênh lệch giảm xuống còn 30mV. Bản...
-
Channel: Điện tử dành cho người mới bắt đầu
27-04-2024, 05:07 -
-
bởi chinhnguyen9Xem hình minh họa có phần thuyết minh bên trong tiện việc quan sát và đọc thuyết minh. Khi G1 high dòng điện chạy theo các đường màu đen khi G2 high dòng điện chạy theo các đường màu nâu đỏ.
Bổ sung một tính chất củng cố cho tên gọi tụ bay: Trong mạch đề cập chỉ...-
Channel: Điện tử dành cho người mới bắt đầu
26-04-2024, 21:02 -
-
bởi chinhnguyen9Sản phẩm này ghi version 2.0 01-2024 MADE IN CHINA nhưng không thấy thương hiệu hình 1
Do 8 chân G của 8 mosfet được đấu song song thành 2 nhóm nên có cùng biên độ xung kích 12V. Nhưng Q1 và Q2 nằm cuối dãy, chân S cùa chúng có điện áp DC cao đến...-
Channel: Điện tử dành cho người mới bắt đầu
26-04-2024, 20:37 -
-
bởi xuanthiettivi em bị mất remote lỡ vào chế độ usb giờ không chọn lại source được. ai có file nạp cho em xin với ạ. Model 32HD957T2
-
Channel: Điện tử truyền hình
26-04-2024, 10:53 -
-
Trả lời cho Giải thích nôm na từ "tụ bay"bởi chinhnguyen9Đa tạ lời cảm ơn của bạn. Mến!
-
Channel: Hướng dẫn sử dụng diễn đàn
26-04-2024, 05:06 -
-
Trả lời cho Xin tư vấn về mạch cầu H cho inverter 1000wbởi thebinhzChắc là không được đâu bạn ơi
Quán ăn Vĩnh Yên-
Channel: Điện tử công suất
25-04-2024, 21:56 -
-
Trả lời cho Giải thích nôm na từ "tụ bay"bởi thebinhzCảm ơn bạn nhiều nha
Nhà hàng Vĩnh Yên-
Channel: Hướng dẫn sử dụng diễn đàn
25-04-2024, 21:50 -
-
bởi chinhnguyen9Vai viết này đã được chuyển sang chuyên mục phù hợp....
-
Channel: Hướng dẫn sử dụng diễn đàn
25-04-2024, 08:29 -
Comment