新聞中心

        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=='

        主站蜘蛛池模板: 张家口市| 竹山县| 南雄市| 沁源县| 永川市| 北辰区| 手机| 乐亭县| 申扎县| 普兰县| 台州市| 北辰区| 湘乡市| 饶河县| 日土县| 砀山县| 梁河县| 准格尔旗| 富顺县| 菏泽市| 上林县| 乐东| 寿阳县| 启东市| 璧山县| 延长县| 抚远县| 安达市| 永修县| 东阿县| 岳阳县| 福州市| 南漳县| 全椒县| 孝感市| 平陆县| 大厂| 灵宝市| 建阳市| 临潭县| 陕西省|