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

  • Nguyên văn bởi iamtomriddle Xem bài viết
    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á.
    Bạn nhầm rồi:
    biến char : 1 byte
    biến int : 2 byte
    biến long : 4 byte

    HTONS(0x0800) sẽ cho kết quả 0x0008 (= ((0x0800<<8) | (0x0800>>8)) = (0x0000 | 0x0008) = 0x0008: đây là macro đổi thứ tự 2 byte của 1 số 2 byte thôi)

    Comment


    • Nguyên văn bởi nttam79 Xem bài viết
      Bạn nhầm rồi:
      biến char : 1 byte
      biến int : 2 byte
      biến long : 4 byte

      HTONS(0x0800) sẽ cho kết quả 0x0008 (= ((0x0800<<8) | (0x0800>>8)) = (0x0000 | 0x0008) = 0x0008: đây là macro đổi thứ tự 2 byte của 1 số 2 byte thôi)
      à, em hiểu rôi. do em dùng trình dich ccs nên khi khai báo int nó hiểu là 1 byte, khi chuyên sang bên này phải đôi thành int16 hay với kiểu long thì đổi thành int32 hay la long long. em còn chỗ này bị vướng mắc nữa là
      struct tcpSession{
      unsigned int desPort; //Port on the remote host
      unsigned int srcPort; //Port on the local host
      unsigned long desIP; //IP address of the remote host
      unsigned long seqNumber; //Sequence number
      unsigned long ackNumber; //Acknowlegement number
      unsigned char sesState; //Current state of TCP session
      unsigned int srcWin;
      unsigned int desWin;
      unsigned long lastRxAck; //Last Received Ack
      unsigned char nextAck;
      unsigned char timeOut; //Session time out
      void(*appDataIn)(unsigned char* dataBuffer,unsigned int dataLen,struct tcpSession *pSession);
      unsigned char appID; //Upper layer application ID
      unsigned char appState; //Upper layer application state
      };
      hàm này khai báo trong ccs không hiểu void(*appDataIn)(unsigned char* dataBuffer,unsigned int dataLen,struct tcpSession *pSession);
      em chuyển mãi ko được, anh giải thích cho em hàm khai báo này với ạ.
      Last edited by iamtomriddle; 07-05-2013, 22:18.

      Comment


      • Nguyên văn bởi iamtomriddle Xem bài viết
        à, em hiểu rôi. do em dùng trình dich ccs nên khi khai báo int nó hiểu là 1 byte, khi chuyên sang bên này phải đôi thành int16 hay với kiểu long thì đổi thành int32 hay la long long. em còn chỗ này bị vướng mắc nữa là
        struct tcpSession{
        unsigned int desPort; //Port on the remote host
        unsigned int srcPort; //Port on the local host
        unsigned long desIP; //IP address of the remote host
        unsigned long seqNumber; //Sequence number
        unsigned long ackNumber; //Acknowlegement number
        unsigned char sesState; //Current state of TCP session
        unsigned int srcWin;
        unsigned int desWin;
        unsigned long lastRxAck; //Last Received Ack
        unsigned char nextAck;
        unsigned char timeOut; //Session time out
        void(*appDataIn)(unsigned char* dataBuffer,unsigned int dataLen,struct tcpSession *pSession);
        unsigned char appID; //Upper layer application ID
        unsigned char appState; //Upper layer application state
        };
        hàm này khai báo trong ccs không hiểu void(*appDataIn)(unsigned char* dataBuffer,unsigned int dataLen,struct tcpSession *pSession);
        em chuyển mãi ko được, anh giải thích cho em hàm khai báo này với ạ.
        void(*appDataIn)(unsigned char* dataBuffer,unsigned int dataLen,struct tcpSession *pSession) là một biến con trỏ, trỏ đến 1 hàm (function) nằm trong bộ nhớ flash, chứ không phải trỏ đến biến, trong AVR studio cho phép khai báo biến con trỏ như vậy.

        Comment


        • thầy ơi cho em hỏi

          1.em tính điều khiển 1 hệ thống qua websever, tuy nhiên nếu em ko có dây Lan để kéo vào port RJ45 đó thì có cách sử dụng mạng wifi ko
          nếu quá rắc rối thì có thể mua thiết bị chuyển đổi (từ wifi qua dây) như vậy ko
          (Đại ý là có cách nào sử dụng wifi mà ko phải Lan đc ko ^^)

          2.Em ping đc rồi, nhưng mà avrstudio báo
          Program Memory Usage : 4932 bytes 15.1 % Full
          Data Memory Usage : 899 bytes 43.9 % Full
          chiếm mất gần 1/2 SRam rồi, thì có ảnh hưởng gì tới lúc truyền frame Ethernet ko
          Last edited by cowboy_188; 13-05-2013, 05:19.

          Comment


          • Sản phẩm mới ra lò! SAM4195 - YouTube ^^ . . . hi vọng nó thêm chút động lực để các pác trong topic cố gắng tìm hiểu!
            À, cho em hỏi, chơi luôn cái "camera quan sát (loại có địa chỉ IP luôn)" thì làm thế nào ta? Chắc là cho cái con ATmega32 qua một bên quá ta! ^^
            À, cái nữa em thắc mắc, chuyển qua 3G thì chắc là khác hẳn luôn bên này hả ta? Vì nghe đâu có liên quan đến GSM . . .^^

            Comment


            • Nguyên văn bởi ga_kon Xem bài viết
              Sản phẩm mới ra lò! SAM4195 - YouTube ^^ . . . hi vọng nó thêm chút động lực để các pác trong topic cố gắng tìm hiểu!
              À, cho em hỏi, chơi luôn cái "camera quan sát (loại có địa chỉ IP luôn)" thì làm thế nào ta? Chắc là cho cái con ATmega32 qua một bên quá ta! ^^
              À, cái nữa em thắc mắc, chuyển qua 3G thì chắc là khác hẳn luôn bên này hả ta? Vì nghe đâu có liên quan đến GSM . . .^^
              hay đấy, mình sắp xong rồi, khi nào có gì mình sẽ hỏi bạn

              Còn 1 vấn đề này thấy nhiều người gặp phải mà ko biết ai giải quyết chưa. Lúc đầu ping mạch bình thường, nhưng sau đó khi lướt web trên lap hay pc thì ping rất khó, thường đợi 1 thời gian ping lại mới được. như là ic ethernet bị đứng vậy.
              Mình có Debug thử và thấy mỗi khi có 1 frame (có type là IP, nó nhảy qua Ipprocess rồi được đưa về dạng giao thức UDP/IP. Tuy nhiên khi check trường bootp.opcode thì ko có dạng reply hay request, tạm gọi là unkown) đến thì làm cho ic bị đứng và ko nhận frame được nữa, chờ đủ vài giây cho nó tự khởi động lại mới ping dc.
              Sau đó mình có thử thêm ethInit(); vào sau đk if lúc check dạng opcode của UDP thì ok, ping tốt.
              if((packet->bootp.opcode != BOOTP_OP_BOOTREPLY) || (packet->bootp.transid != DhcpTransactID)){
              ethInit();return;}
              Cái mình thắc mắc là tại sao 1 packet dạng giao thức UDP (nhưng ko phải replay hay request) lại làm đơ cả ic :-j
              Last edited by cowboy_188; 17-05-2013, 18:43.

              Comment



              • Reading Switches and Analog Inputs using Ajax
                Ai muốn thì phát triển lên nhé, mình nản quá

                Comment


                • nhìn bạn ga_kon có cái mô hình đẹp quá, , dạo này việc nhiều quá vẫn chưa có thời gian làm tiếp đề tài nữa, mới chỉ đang dừng lại tắt mở đèn trong bếp với đèn phòng, tranh thủ lúc đang ôm laptop làm biếng đi bật công tắc
                  công nhận đề tài này hot quá hot, quá nhiều ý tưởng để phát triển, hy vọng càng ngày càng nhiều bạn tham gia tranh luận cho đề tài thêm phong phú. Click image for larger version

Name:	Noname.jpg
Views:	1
Size:	76.5 KB
ID:	1379089
                  hình layout cho bạn nào muốn dùng IC điều khiển bóng đèn 220AC

                  Điện tử viễn thông - Hutech

                  Comment


                  • Ai cho e hỏi cách chuyển sang ATmega128 dùng thạch anh ngoài 7.3728M mình có cần khai báo F_CPU lại thành 7.3728 ko. và cái thạch anh này có ảnh hưởng gì đến usart ko vậy??? và hàm SIGNAL(SIG_UART0_TRANS), SIGNAL(SIG_UART0_RECV) 2 hàm này có tác dụng gì vậy?? Mong dc giúp đỡ

                    Comment


                    • Nguyên văn bởi stevenboy Xem bài viết
                      Ai cho e hỏi cách chuyển sang ATmega128 dùng thạch anh ngoài 7.3728M mình có cần khai báo F_CPU lại thành 7.3728 ko. và cái thạch anh này có ảnh hưởng gì đến usart ko vậy??? và hàm SIGNAL(SIG_UART0_TRANS), SIGNAL(SIG_UART0_RECV) 2 hàm này có tác dụng gì vậy?? Mong dc giúp đỡ
                      Có chứ, Baud nó phụ thuộc vào tần số thạch anh mà. UART ở đây thầy dùng để dubug lỗi. Nếu bạn làm thành công thì có thể bỏ luôn nó.

                      Comment


                      • làm trên con 32 ok rồi h fai bắt chuyển wa 128 sửa lại hoài mà vẫn chay nữa. hix hix. khi chuyển từ 32 sang 128 mình chỉ cần thay đổi chân của giao tiếp SPI, uart, với timer, thôi đúng ko vậy Yamailuk. có thể giúp mình dc ko

                        Comment


                        • uhm, với lại sửa mấy cái define của ENC nữa thì phải cái này hỏi a chikichita đó . Do mình làm báo cáo xong rồi nên k up lên 128 mặc dù còn rất nhiều ý tưởng

                          Comment


                          • Có ai bị như mình không? Lúc đầu mạch chạy rất ổn định nhưng để 1 thời gian là không truy cập vô được, phải reset lại mới truy cập được.

                            Comment


                            • Có pác nào cho em xin cái mạch nguyên lí Relay được không ạ? Loại relay 5V ấy! Tình hình là định chuyển toàn bộ thiết bị trong nhà qua Internet hết nhưng rối cái là nhà xài modem BCOM-5530 2/2 . . .không biết cách NAT . . .^^!!! Có pác nào làm vụ này rồi không ta?

                              Comment


                              • không nên sài role bạn ah, dùng triac điều khiển điện AC thì hay hơn, còn vụ modem thì mình chưa sài loại này nên ko biết như thế nào nhưng hầu hết modem đều có cấu hình NAT như nhau, và điều cần chú ý là do mình sài mạng là địa chỉ IP động nên cần một dịch vụ hỗ trỡ để có thể kết nối qua internet, hiện nay dịch vụ miễn phí thì mình thấy no-ip là hợp nhất, nhưng muốn sử dụng no-ip bạn cần 1 trong 2 điều kiện:
                                1) phải có máy tính chạy 24/24 để chạy phần mềm DUC của no-ip để nó cập nhật IP động vào 1 tên miền do bạn chỉ định cho bạn, mỗi lần muốn truy cập chỉ cần vào link đó là được.
                                2) dùng modem hỗ trợ sẵn no-ip, vào modem và cấu hình nó là ok khỏi cần phải dùng máy tính. hiện mình chỉ biết có loại rẻ nhất của TP-link 8817 - 8840 loại mới là có hỗ trợ no-ip, còn max hơn nữa thì draytek.
                                Nguyên văn bởi ga_kon Xem bài viết
                                Có pác nào cho em xin cái mạch nguyên lí Relay được không ạ? Loại relay 5V ấy! Tình hình là định chuyển toàn bộ thiết bị trong nhà qua Internet hết nhưng rối cái là nhà xài modem BCOM-5530 2/2 . . .không biết cách NAT . . .^^!!! Có pác nào làm vụ này rồi không ta?

                                Điện tử viễn thông - Hutech

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X