Nguyên văn bởi lu_lu
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
-
Chào anh!! em thấy bài viết về enthernet của anh rất hay! em cũng đang làm giao tiếp enthernet từ module enc624j600 nó là loại mới, với vi điều khiển msp430g2553 con này chỉ có 512byte ram thôi, vì em thấy con pic16f887 có 368byte ram thôi mà có thể giao tiếp được với enthernet, nhưng bài viết của anh bảo là cần ram 2kb để truyền frame, em chỉ cần truyền theo byte thôi vì dữ liệu không có nhiều, mỗi lần truyền chỉ có 8byte dữ liệu thôi, không biết enthernet có hỗ trợ truyền từng byte như uart lên máy tíng không anh? em nghĩ cách thức giao tiếp cũng tương tự 28j60 thôi. nhưng mới tìm hiểu em không rành nhiều lắm, em muốn được hướng dẫn từ anh. em giao tiếp với enthernet cũng qua spi.
Đề tài của em đang làm cũng tương đối lớn, là một hệ thống bao gồm vi điều khiển đọc dữ liệu từ thẻ rfid rồi gửi thông tin thẻ lên máy tính, từ đó máy tính sẽ lấy dữ liệu từ vi điều khiển gửi lên và so sánh với cơ sở dữ liệu trên máy tính kiểm tra xem có tồn tại hay không và gửi lại một lệnh để thông báo cho vi điều khiển biết để vi điều khiển hiển thị thông báo lên lcd. nhưng hiện tại em không biết hàm send byte dữ liệu và hàm nhận byte dữ liệu từ vi điều khiển như thế nào? đồng thời trên máy tính ta sẽ nhận bye dữ liệu đó như thế nào? anh có thể hỗ trợ cho em về những vấn đề trên không? em thấy bà viết của anh rất hay và anh là một người rất am tường về chuẩn enthernet. mong anh giúp đỡ em vấn đề này! em cảm ơn anh!
Nguyên văn bởi nttam79 Xem bài viếtĐoạn trên là do các bạn khác phát triển đấy nhé, ko phải từ code gốc. Tuy nhiên có thể trả lời vấn đề của bạn như vầy:
1-
Như vậy là trước tìm ký tự '%', sau đó tìm ký tự 'L' và 'D' của chuỗi "%LDx" (x=1,2,3,4)Code:if(tmpChr == '%') ... if((pgm_read_byte(progdata + srcDataIdx) == 'L') && (pgm_read_byte(progdata + srcDataIdx + 1) == 'D'))
tmpVar = pgm_read_byte(progdata + srcDataIdx + 2) - 0x30;
Vậy tmpVar = 1 nếu là "%LD1", ...
2-Chỗ này bạn coi qua ngôn ngữ HTML là hiểu liền, giải thích ngắn gọn thì như vầy:
<input type="checkbox" name="Led5" value="ON" checked/> là một ô checkbox (không có chữ kèm theo), với trạng thái được check.
<input type="checkbox" name="Led5" value="ON"/> là một ô checkbox , với trạng thái không check.
<p align="left">chuỗi</p> là một dòng canh lề trái, có nội dung là chuỗi.
Vậy thì <p align="left"><input type="checkbox" name="Led5" value="ON"/>LED 3</p> là 1 dòng trên đó có 1 ô check, bên phải là chữ LED 3.
Có vậy thôi, đó là cách các trang web được hiển thị, nếu muốn bạn có thể right-click trên trang web và chọn view source để xem code HTML.Last edited by muahoanang31; 07-04-2013, 02:12.
Comment
-
Do lâu nay thấy thầy ít vào hỗ trợ, mình cũng nghiên cứu luồng này và cũng làm thành công nên mạn phép trả lời bạn như sau:Nguyên văn bởi muahoanang31 Xem bài viếtnhưng hiện tại em không biết hàm send byte dữ liệu và hàm nhận byte dữ liệu từ vi điều khiển như thế nào? đồng thời trên máy tính ta sẽ nhận bye dữ liệu đó như thế nào? anh có thể hỗ trợ cho em về những vấn đề trên không? em thấy bà viết của anh rất hay và anh là một người rất am tường về chuẩn enthernet. mong anh giúp đỡ em vấn đề này! em cảm ơn anh!
+ Hoàn toàn được, bạn có thể sử dụng giao thức udp hoặc tcp đều được. Trong project thầy viết tới tầng 4 của giao thức tcp/ip, còn để truyền dữ liệu như yêu cầu của bạn chỉ cần tầng 3 là đủ rồi.
+ Trên máy tính bạn viết một chương trình nhận dữ liệu dùng C# hoặc java (Tùy vào trình lập trình của bạn) nếu để học tập bạn có thể sử dụng phần mềm sau Hercules v3.2.4.
Comment
-
cảm ơn anh! như vậy là vi điều khiển có 512byte ram vẫn giao tiếp được phải không?
và cho em hỏi thêm khi nhận và truyền trên máy tính ta sẽ làm như thế nào? trong C# có hỗ trợ hàm nhận và truyền qua enthernet không? em chỉ thấy hỗ trợ hàm nhận và truyền qua COM, nếu có anh có thể giới thiệu hàm đó không? em cảm ơn!
Nguyên văn bởi yamailuk Xem bài viếtDo lâu nay thấy thầy ít vào hỗ trợ, mình cũng nghiên cứu luồng này và cũng làm thành công nên mạn phép trả lời bạn như sau:
+ Hoàn toàn được, bạn có thể sử dụng giao thức udp hoặc tcp đều được. Trong project thầy viết tới tầng 4 của giao thức tcp/ip, còn để truyền dữ liệu như yêu cầu của bạn chỉ cần tầng 3 là đủ rồi.
+ Trên máy tính bạn viết một chương trình nhận dữ liệu dùng C# hoặc java (Tùy vào trình lập trình của bạn) nếu để học tập bạn có thể sử dụng phần mềm sau Hercules v3.2.4.
Comment
-
Bạn tham khảo qua mấy link này nhé:Nguyên văn bởi muahoanang31 Xem bài viếtcảm ơn anh! như vậy là vi điều khiển có 512byte ram vẫn giao tiếp được phải không?
và cho em hỏi thêm khi nhận và truyền trên máy tính ta sẽ làm như thế nào? trong C# có hỗ trợ hàm nhận và truyền qua enthernet không? em chỉ thấy hỗ trợ hàm nhận và truyền qua COM, nếu có anh có thể giới thiệu hàm đó không? em cảm ơn!
TCP:
http://loiuit.wordpress.com/2011/05/...E1%BB%9Bi-tcp/
C# Việt Nam - Kiến thức - Lập trình Socket giao tiếp TCP client/server
C# Việt Nam - Kiến thức - Gửi và nhận DataTable qua Socket trong C#
UDP:
Aptech Computer Education - Vietnam | Giao tiếp bằng UDP - Lập trình
LapTrinhMang(Socket)C#.pdf
Comment
-
Em cảm ơn anh rất nhiều! Nếu mình chỉ giao tiếp truyền nhận dữ liệu từ vi điều khiển lên máy tính và từ máy tính xuống vi điều khiển qua enthernet thì mình cần khai báo những gì?
em đọc code rối quá! nó khai báo nhiều thứ quá! mong anh chỉ giúp!
Có ai tìm hiểu board enthernet ENC624J600 chưa?
Comment
-
Bạn xem lưu đồ dữ liệu vào ra của giao thức ở trang 1 nhé !Nguyên văn bởi muahoanang31 Xem bài viếtEm cảm ơn anh rất nhiều! Nếu mình chỉ giao tiếp truyền nhận dữ liệu từ vi điều khiển lên máy tính và từ máy tính xuống vi điều khiển qua enthernet thì mình cần khai báo những gì?
em đọc code rối quá! nó khai báo nhiều thứ quá! mong anh chỉ giúp!
Có ai tìm hiểu board enthernet ENC624J600 chưa?
Nếu ở hà nội bạn có thể sang pnlab theo mình giá ở đó là rẻ nhất, hoàn toàn chấp nhận được. Vì enc là 60k rj45 25k rồi
ENC28J60 module | PNLab Technologies
Comment
-
em có con enc624j600 rồi nên phải nghiên cứu trên nó!!
Nguyên văn bởi yamailuk Xem bài viếtBạn xem lưu đồ dữ liệu vào ra của giao thức ở trang 1 nhé !
Nếu ở hà nội bạn có thể sang pnlab theo mình giá ở đó là rẻ nhất, hoàn toàn chấp nhận được. Vì enc là 60k rj45 25k rồi
ENC28J60 module | PNLab Technologies
Comment
-
Dạo này công việc bận rộn nên ít vào diễn đàn.Nguyên văn bởi manhdktd Xem bài viếtAnh Tâm có thể nói qua về việc chuyển hình ảnh lấy từ camera hoặc thẻ nhớ rồi cho lên giao diện web được không ạ? Hay cứ nhất thiết phải dùng thẻ <img> của HTML?
Em vẫn khó hình dung cái này quá!
Hình ảnh đưa lên giao diện web, nếu là ảnh tĩnh thì đương nhiên cách tốt nhất là dùng thẻ <img> trừ khi là nhúng video hay flash thì mới dùng các thẻ như <object>, <video>, <embed>, ...
Tuy nhiên khi dùng thẻ <img> thì hình ảnh được sử dụng trong thẻ có thể lưu trên chính vi điều khiển hoặc trên một host khác. Nếu lưu trên chính VĐK, bạn cần chuyển nội dung file ảnh sang mã hex rồi khai báo như là 1 const. Và trong phần xử lý giao thức HTTP phải viết thêm một phần để send nội dung file ảnh cho client khi nhận được HTTP request đến file ảnh này (sau khi client load nội dung html, nó sẽ tiếp tục request các item có trong đó theo url được cho trong thẻ).
Nếu lưu ở host khác, đơn giản ta chỉ cần up ảnh lên một image host nào đó, copy url bỏ vào trong thẻ <img> của code html, cũng giống như các post ảnh lên diễn đàn.
Cách thứ 1 sẽ tốn bộ nhớ flash rom để lưu file ảnh, mà dung lượng ROM của Atmega32 trong project này sử dụng gần hết, nên cách 2 được chọn.
Comment
-
Những vấn đề bạn hỏi, bạn yamailuk đã trả lời giúp khá đầy đủ rồi, ở đây chỉ giải thích thêm một ít cho rõ thôi.Nguyên văn bởi muahoanang31 Xem bài viếtChào anh!! em thấy bài viết về enthernet của anh rất hay! em cũng đang làm giao tiếp enthernet từ module enc624j600 nó là loại mới, với vi điều khiển msp430g2553 con này chỉ có 512byte ram thôi, vì em thấy con pic16f887 có 368byte ram thôi mà có thể giao tiếp được với enthernet, nhưng bài viết của anh bảo là cần ram 2kb để truyền frame, em chỉ cần truyền theo byte thôi vì dữ liệu không có nhiều, mỗi lần truyền chỉ có 8byte dữ liệu thôi, không biết enthernet có hỗ trợ truyền từng byte như uart lên máy tíng không anh? em nghĩ cách thức giao tiếp cũng tương tự 28j60 thôi. nhưng mới tìm hiểu em không rành nhiều lắm, em muốn được hướng dẫn từ anh. em giao tiếp với enthernet cũng qua spi.
Đề tài của em đang làm cũng tương đối lớn, là một hệ thống bao gồm vi điều khiển đọc dữ liệu từ thẻ rfid rồi gửi thông tin thẻ lên máy tính, từ đó máy tính sẽ lấy dữ liệu từ vi điều khiển gửi lên và so sánh với cơ sở dữ liệu trên máy tính kiểm tra xem có tồn tại hay không và gửi lại một lệnh để thông báo cho vi điều khiển biết để vi điều khiển hiển thị thông báo lên lcd. nhưng hiện tại em không biết hàm send byte dữ liệu và hàm nhận byte dữ liệu từ vi điều khiển như thế nào? đồng thời trên máy tính ta sẽ nhận bye dữ liệu đó như thế nào? anh có thể hỗ trợ cho em về những vấn đề trên không? em thấy bà viết của anh rất hay và anh là một người rất am tường về chuẩn enthernet. mong anh giúp đỡ em vấn đề này! em cảm ơn anh!
Sở dĩ bảo cần 2kb ram để xử lý frame là vì trong tiêu chuẩn của TCP/IP và ethernet, kích thước dữ liệu tối đa cho 1 frame ethernet là 1500byte. Tất nhiên ta có thể gửi ngắn hơn, nhưng nếu bộ nhớ không đủ, trong trường hợp mạch vi điều khiển nhận được một frame có kích thước lớn từ máy tính gửi đến thì nó sẽ không xử lý được.
Trong giao thức TCP, có cho phép các bên báo kích thước gói tối đa mà mình nhận được cho bên kia (MSS), như vậy có thể sử dụng cơ chế này để tránh việc nhận được gói tin quá lớn.
Có thể gửi dữ liệu trong gói TCP/UDP với kích thước nhỏ tùy ý (thậm chí chiều dài dữ liệu có thể = 0) tuy nhiên cần lưu ý là dù kích thước dữ liệu nhỏ đến đâu thì 1 frame gửi đi vẫn phải có đủ header TCP/UDP và header IP, như vậy kích thước data cho 1 frame ethernet tối thiểu cũng bằng kích thước header IP+TCP hay IP+UDP.
Như vậy bạn vẫn hoàn toàn có thể giao tiếp ethernet được với kích thước ram nhỏ.
Còn một cách nữa cho phép xử lý được các frame ethernet với kích thước payload lớn (lên đến 1500byte) với vi điều khiển có ram nhỏ mà trong project này không đề cập đến: đó là xử lý các frame ethernet gửi và nhận ngay trên buffer của IC giao tiếp ethernet mà không copy về ram của VĐK để xử lý. Như vậy ta không bị giới hạn bởi kích thước ram nữa. Tuy nhiên để làm việc này cần thực hiện truy xuất trực tiếp vào buffer của IC ethernet qua SPI, dẫn đến phức tạp hơn 1 chút trong lập trình và thời gian xử lý có thể lâu hơn.
Cho ứng dụng RFID, tôi đề xuất dùng UDP với giao thức UDP to COM (giao thức cổng COM ảo trên UDP) là phù hợp nhất, cũng dễ xử lý trên PC nữa.
Comment
-
Cảm ơn thầy! em đã hiểu được phần enthernet dưới vi điều khiển rồi, nhưng thầy có thể nối thêm về dùng UDP với giao thức UDP to COM (giao thức cổng COM ảo trên UDP) được không? để xử lý trên PC, phần này em vẫn chưa hiểu.
Nguyên văn bởi nttam79 Xem bài viếtNhững vấn đề bạn hỏi, bạn yamailuk đã trả lời giúp khá đầy đủ rồi, ở đây chỉ giải thích thêm một ít cho rõ thôi.
Sở dĩ bảo cần 2kb ram để xử lý frame là vì trong tiêu chuẩn của TCP/IP và ethernet, kích thước dữ liệu tối đa cho 1 frame ethernet là 1500byte. Tất nhiên ta có thể gửi ngắn hơn, nhưng nếu bộ nhớ không đủ, trong trường hợp mạch vi điều khiển nhận được một frame có kích thước lớn từ máy tính gửi đến thì nó sẽ không xử lý được.
Trong giao thức TCP, có cho phép các bên báo kích thước gói tối đa mà mình nhận được cho bên kia (MSS), như vậy có thể sử dụng cơ chế này để tránh việc nhận được gói tin quá lớn.
Có thể gửi dữ liệu trong gói TCP/UDP với kích thước nhỏ tùy ý (thậm chí chiều dài dữ liệu có thể = 0) tuy nhiên cần lưu ý là dù kích thước dữ liệu nhỏ đến đâu thì 1 frame gửi đi vẫn phải có đủ header TCP/UDP và header IP, như vậy kích thước data cho 1 frame ethernet tối thiểu cũng bằng kích thước header IP+TCP hay IP+UDP.
Như vậy bạn vẫn hoàn toàn có thể giao tiếp ethernet được với kích thước ram nhỏ.
Còn một cách nữa cho phép xử lý được các frame ethernet với kích thước payload lớn (lên đến 1500byte) với vi điều khiển có ram nhỏ mà trong project này không đề cập đến: đó là xử lý các frame ethernet gửi và nhận ngay trên buffer của IC giao tiếp ethernet mà không copy về ram của VĐK để xử lý. Như vậy ta không bị giới hạn bởi kích thước ram nữa. Tuy nhiên để làm việc này cần thực hiện truy xuất trực tiếp vào buffer của IC ethernet qua SPI, dẫn đến phức tạp hơn 1 chút trong lập trình và thời gian xử lý có thể lâu hơn.
Cho ứng dụng RFID, tôi đề xuất dùng UDP với giao thức UDP to COM (giao thức cổng COM ảo trên UDP) là phù hợp nhất, cũng dễ xử lý trên PC nữa.
Comment
-
Các anh cho em hỏi //--------------------------------------------------------------------------------------
//Ethernet header
// Gom 14 byte:
// 06 byte dia chi dich
// 06 byte dia chi nguon
// 02 byte type (cho biet frame ethernet mang ben trong loai du lieu gi)
#define ETH_HEADER_LEN 14
struct ntEthHeader
{
struct ntEthAddr desAddr;
struct ntEthAddr srcAddr;
unsigned int type;
};
type la kiểu 2 byte sao lại khai báo chỉ là biến int chỉ có 1 byte. ví dụ với gói IP khi lấy dữ liệu vào thì biến type sẽ phải là 0x0800 mà biến type chi có 1 byte mà đó lại là byte thứ 13 nên sẽ là 0x08;
và dòng này
#define HTONS(s) ((s<<8) | (s>>8)) //danh cho bien 2 byte
theo em hiểu thì HTONS(0x0800) sẽ là 0x08000008 mà là kiểu 16bit nên sẽ là 0x0008;
vay khi so sánh thì type vẫn băng HOTN(0x0800); em có thử in lên cổng com biến type thì đúng là nó chỉ là 0x08;
em có làm theo kiểu
struct ntEthHeader
{
struct ntEthAddr desAddr;
struct ntEthAddr srcAddr;
unsigned int typeH;
unsigned int typeL;
};
so sánh và in typeH<<8 + typeL =0x0800;
các cấu trúc sau cũng thế, biến long 2byte int 1byte
//Cau truc ARP header
struct ntARPHeader
{
unsigned int hwType;
unsigned int protocol;
unsigned char hwLen;
unsigned char protoLen;
unsigned int opcode;
struct ntEthAddr shwaddr;
unsigned long sipaddr;
struct ntEthAddr dhwaddr;
unsigned long dipaddr;
};
+ Hardware type (2 bytes): cho biết loại địa chỉ phần cứng, đối với địa chỉ MAC của giao thức ethernet thì giá trị này được qui định là "0x0001".
+ Protocol type (2 bytes): cho biết loại địa chỉ giao thức lớp trên, đối với địa chỉ IP, giá trị này được qui định là “0x0800”.
+ HLEN (1 byte): cho biết chiều dài của địa chỉ vật lý (địa chỉ MAC).
+ PLEN (1 byte): cho biết chiều dài của địa chỉ giao thức (địa chỉ IP)
+ Operation (2 bytes): cho biết hoạt động đang thực hiện trong gói tin này (request hay reply).
+ Sender H/W (hardware address, 6 bytes): địa chỉ vật lý của phía gửi.
+ Sender IP (4 bytes): địa chỉ IP của phía gửi.
+ Target H/W (6 bytes): địa chỉ vật lý của phía nhận, nếu chưa biết thì sẽ là chứa toàn 0.
+ Target IP (4 bytes): địa chỉ IP của phía nhận.
mà sử dụng được cho 2byte và 4 byte. Em đang thắc mắc phần này mong thầy và các bạn gỡ rối ạ. Em đang chuyển code này sang pic mà thấy gặp nhiều khó khăn quá.Last edited by iamtomriddle; 07-05-2013, 12:45.
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 dinhthuong92Dạ, cảm ơn bác đã nghe qua và có lời khích lệ cháu ạ.
Thật lòng cháu không dám nhận hai danh hiệu Kỹ sư và Nhạc sĩ đâu ạ, vì phải thật hiểu sâu nắm vững cơ, chứ thực lực cháu đây chỉ là biết chút ít thôi à. Về phần...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 11:58 -
-
Trả lời cho Có mạch sạc nlmt nào có mppt không các bácbởi bqvietĐơn giản thì có trải nghiệm này
http://www.dientuvietnam.net/forums/...ch%C3%AA%CC%81
Chỉ phần cứng,...-
Channel: Điện tử công suất
27-01-2026, 21:32 -
-
Trả lời cho Có mạch sạc nlmt nào có mppt không các bácbởi Nexus 6Pphức tạp quá, nếu mà có mạch làm sẵn thì ngon, e dùng 2 tấm pv loại 18v 55w thôi bác
-
Channel: Điện tử công suất
26-01-2026, 08:52 -
-
Trả lời cho Có mạch sạc nlmt nào có mppt không các bácbởi Nexus 6Pcảm ơn bác nhiều nha, để e nghiên cứu
-
Channel: Điện tử công suất
26-01-2026, 07:38 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi vi van phamkỹ sư nhạc sĩ dinhthuong dạo này lên tay nghề khá quá.
-
Channel: Tâm tình dân kỹ thuật
25-01-2026, 21:29 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Hát Mừng Sinh Nhật, sáng tác: HĐT, hòa âm-thể hiện: AI
-
Channel: Tâm tình dân kỹ thuật
24-01-2026, 22:13 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Chào bác, gần Tết công việc bác bận lắm phải không?
Vâng mọi người đều thế cả.
Em mới trả phí cho nó 1 tháng, nhờ nó hát thử ấy ạ. Tiếc vì em đã dốt nhạc lí lại lười học nên sáng tác thì vụng về mà hát demo...-
Channel: Tâm tình dân kỹ thuật
24-01-2026, 21:53 -
-
Trả lời cho Có mạch sạc nlmt nào có mppt không các bácbởi bqvietCảm thấy cứng tay thì làm theo hướng dẫn khá chi tiết ở trang sau
https://www.instructables.com/DIY-1k...ge-Controller/-
Channel: Điện tử công suất
23-01-2026, 16:50 -
-
bởi Nexus 6PNhư tiêu đề, các bác giới thiệu e mạch sạc nlmt mppt có chức năng chỉnh dòng với, tấm PV của em 18V 55W, dùng để sạc cho khối pin sắt 3.2V 45A (sắp tới sẽ thay bằng ắc quy 12V)
e cảm ơn-
Channel: Điện tử công suất
23-01-2026, 11:23 -
-
bởi mylinhattNếu bạn đang tìm một dòng máy phay đứng CNC vận hành ổn định, gia công tinh chuẩn và tối ưu năng suất, thì Kitamura là lựa chọn rất đáng cân nhắc. Dòng máy này có kết cấu trục chính theo phương thẳng đứng, bàn máy nằm ngang và vận hành tự động thông qua điều khiển bằng máy tính...
-
Channel: Điều khiển - Tự động hóa
23-01-2026, 11:02 -

Comment