新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機簡單Ping的實現

        51單片機簡單Ping的實現

        作者: 時間:2012-10-12 來源:網絡 收藏

        Echo(*輸入包緩沖區首址pBUF) //收到應答后回顯
        {
        //打印ping響應,因為51定時器較慢,time參數省略(time是本機與對方主機往返一次所用時間)。
        PrintStr("tReply from IP=");
        PrintStr(輸入包之源IP地址);
        PrintStr(": bytes=32");
        PrintStr(" TTL=");
        PrintByte(輸入包之TTL);
        PrintStr("");

        //處理Buf的記錄
        for(i=0;iMaxLenBuf;i++){
        if(PingBuf[i].status==1){
        if(PingBuf[i].ip==pBUF.ipframe.ip){
        PingBuf[i].status=2; //已發出且應答
        break;
        }
        }
        }
        }

        PingCycle() //定時操作,放在1秒循環任務中
        {
        for(;;){
        taskDelay(1秒);
        for(i=0;iMaxLenPingBuf;i++){
        switch(PingBuf[i].status)
        case 0: //空閑
        break;

        {
        case 1: //已發出但無應答

        //打印超時信息
        PrintStr("tRequest timed out.(");
        PrintStr(PingBuf[i].ip);
        PrintStr(")");

        case 2: //已發出且應答

        //狀態變遷
        PingBuf[i].times=PingBuf[i].times-1;
        if(PingBuf[i].times==0)
        PingBuf[i].status=0;
        else{

        case 4: //第一次準備發(用于同步1秒時鐘)

        //查ARP緩存
        if(ARP緩存有對應項){

        //直接發送ICMP包至TxQFIFO緩存
        OSQSend(QID,*pBUF);

        PingBuf[i].status=1; //已發出但無應答
        }
        else PingBuf[i].status=3; //等ARP
        }
        break;
        }
        case 3: //等ARP
        {
        //查ARP緩存
        if(ARP緩存有對應項){
        //直接發送ICMP包至TxQFIFO緩存
        OSQSend(QID,*pBUF);
        }
        PingBuf[i].status=1; //已發出但無應答
        }
        default: //其他狀態,錯誤
        PingBuf[i].status=0;
        }
        }
        }

        void PingCommand(WORDTABLE *WordTable)//PING命令處理
        {
        if(WordTable->Num==1)
        PrintStr("Please input IP address!");
        else{
        if(IPadrToHEX(WordTable->wt[1].Str,ping_ip_address)==0){
        PrintStr("IP address error!");return;
        }
        else
        PingRequest(ping_ip_address);
        }
        }

        INT16U CheckSum(INT16U *buf,INT16U length) //校驗和計算
        {
        INT16U len;
        INT32U sum;

        len=length>>1;
        for(sum=0;len>0;len--)
        sum+=*buf++;
        if(length1)
        sum+=(*buf0xFF00);
        sum=(sum>>16)+(sum0xFFFF);
        sum+=(sum>>16);

        return(~sum);
        }

        union ip_address_type{ //ip地址數據結構
        unsigned long dwords;
        unsigned int words[2];
        unsigned char bytes[4];
        };

        bit IPadrToHEX(unsigned char *Str,union ip_address_type *ip) //IP字符串轉換到IP地址值
        {
        unsigned char i,j,ch,x;

        ch=*Str++;

        for(j=0;j3;j++){
        x=0;
        for(i=0;i4;i++){
        if(ch=='.') {ch=*Str++;break;}
        else if(i==3) return 0;
        else if(ch0ch>9) return 0;
        else
        x=10*x+(ch-'0');
        ch=*Str++;
        }
        ip->bytes[j]=x;
        }

        x=0;
        for(i=0;i4;i++){
        if(ch=='

        主站蜘蛛池模板: 屏东市| 永昌县| 永丰县| 佛学| 鄂伦春自治旗| 红原县| 陈巴尔虎旗| 通州市| 大姚县| 西乌珠穆沁旗| 图片| 孙吴县| 从江县| 哈尔滨市| 大悟县| 德阳市| 大连市| 公主岭市| 海阳市| 沂源县| 大悟县| 偃师市| 金乡县| 北海市| 滕州市| 东源县| 肥东县| 友谊县| 临洮县| 广饶县| 兴安盟| 富顺县| 章丘市| 望都县| 西昌市| 长汀县| 东兰县| 青龙| 阳曲县| 河池市| 保山市|