• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-02
  • 语言: Matlab
  • 标签: MATLAB  ARQ  重传  

资源简介

MATLAB实现ARQ重传,实现时延的加入及重传次数的自定义改动,注释详尽,对初学者有一定的帮助。

资源截图

代码片段和文件信息

%选择重传ARQ
clear
frameNum=100;%帧数100
frameLength=10;%帧长
frameOrder=0;%帧号
frameOrderBuff=0;%帧号缓存
ACK=[0 0];%ACK的组成为第1位帧号,第2位传输有效位,第2位等于1时表示该帧发送正确,等于0是表示发送错误需要重传
ACKQueue=zeros(53);%每行代表一组ACK数据,第1位是数据有效位,第23位为ACK数据;列数为队列长度
MaxARQNum=3;%最大重传次数
ARQNum=zeros(frameNum2);ARQNum(:1)=1:frameNum;%每一帧实际重传次数
frameError=0;%误帧数

for i=1:3%压入3个空帧表示2个帧传输时延
    ACKQueue=QueueIn(ACKQueue[01]);
end
frameQueue=zeros(202+frameLength);%每行代表一组帧数据第1位是数据有效位第2位为帧号剩下是帧数据;列数为队列长度


while(1)
 %%发送端
     [ACKQueueACK]=QueueOut(ACKQueue);
     frameBuff=QueueData(frameQueue1);%帧号+帧
     if(ACK(1)==frameBuff(1))
         [frameQueueframeBuff]=QueueOut(frameQueue);%读取缓存队列头部数据,并将头部数据退出队列
     end
     if(ACK(2)==1 && frameOrderBuffameNum) %该帧传输正确,发送下一帧
         frameOrder=frameOrderBuff+1;
         frameOrderBuff=frameOrder;
         %TrSeq=[1 0 1 0 1 1 1 0 0 1];  
         TrSeq=round(rand(12000));
         frameQueue=QueueIn(frameQueue[frameOrder TrSeq]);%将新生成的帧数据加入缓存队列
     elseif(ACK(2)==0)%该帧传输错误,重传该帧
         frameOrder=frameBuff(1);
         TrSeq=frameBuff(2:end);
         frameQueue=QueueIn(frameQueueframeBuff);%将该帧重新加入缓存队列
     elseif(ACK(2)==1 && frameOrderBuff==frameNum)
         ACKDeep=QueueDeep(ACKQueue);
         if ACKDeep==sum(ACKQueue(:3)) %ACK队列中的所指示的帧全部发送正确
             break; %退出循环
         else
             while(1)
                 [ACKQueueACK]=QueueOut(ACKQueue);
                 [frameQueueframeBuff]=QueueOut(frameQueue);
                 if ACK(2)==0  %寻找ACK队列中传错的那一帧的信息
                     break;
                 end
             end
             TrSeq=frameBuff(2:end);
             frameQueue=QueueIn(frameQueueframeBuff);%将该帧重新加入缓存队列
         end         
     end
%%信道简易模型
    ReSeq=TrSeq;
    ReSeq(1)=randi([0 1]11);
%%接收端
    if(isequal(ReSeqTrSeq))
        ACK=[frameOrder 1];
    else
        if(ARQNum(frameOrder2)==MaxARQNum)%重传数达到最大次数则不再重传
            frameError=frameError+1;%记为误帧数加1
            ACK=[frameOrder 1];
        else
            ACK=[frameOrder 0];
            ARQNum(frameOrder2)=ARQNum(frameOrder2)+1;
        end                   
    end
%%将ACK重传至发送端
    ACKQueue=QueueIn(ACKQueueACK);
end






 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       2560  2018-03-10 21:46  ARQ压入时延\ARQ.m

     文件        281  2014-09-09 16:45  ARQ压入时延\QueueClear.m

     文件        296  2014-09-09 11:21  ARQ压入时延\QueueData.m

     文件        343  2014-09-08 23:45  ARQ压入时延\QueueDeep.m

     文件        516  2014-09-09 00:02  ARQ压入时延\QueueIn.m

     文件        497  2014-09-09 00:10  ARQ压入时延\QueueOut.m

     文件       1954  2018-03-09 13:43  ARQ压入时延\transmit.m

     目录          0  2018-03-10 20:27  ARQ压入时延

----------- ---------  ---------- -----  ----

                 6447                    8


评论

共有 条评论