資源簡介
MATLAB實現(xiàn)ARQ重傳,實現(xiàn)時延的加入及重傳次數(shù)的自定義改動,注釋詳盡,對初學(xué)者有一定的幫助。

代碼片段和文件信息
%選擇重傳ARQ
clear
frameNum=100;%幀數(shù)100
frameLength=10;%幀長
frameOrder=0;%幀號
frameOrderBuff=0;%幀號緩存
ACK=[0?0];%ACK的組成為第1位幀號,第2位傳輸有效位,第2位等于1時表示該幀發(fā)送正確,等于0是表示發(fā)送錯誤需要重傳
ACKQueue=zeros(53);%每行代表一組ACK數(shù)據(jù),第1位是數(shù)據(jù)有效位,第23位為ACK數(shù)據(jù);列數(shù)為隊列長度
MaxARQNum=3;%最大重傳次數(shù)
ARQNum=zeros(frameNum2);ARQNum(:1)=1:frameNum;%每一幀實際重傳次數(shù)
frameError=0;%誤幀數(shù)
for?i=1:3%壓入3個空幀表示2個幀傳輸時延
????ACKQueue=QueueIn(ACKQueue[01]);
end
frameQueue=zeros(202+frameLength);%每行代表一組幀數(shù)據(jù)第1位是數(shù)據(jù)有效位第2位為幀號剩下是幀數(shù)據(jù);列數(shù)為隊列長度
while(1)
?%%發(fā)送端
?????[ACKQueueACK]=QueueOut(ACKQueue);
?????frameBuff=QueueData(frameQueue1);%幀號+幀
?????if(ACK(1)==frameBuff(1))
?????????[frameQueueframeBuff]=QueueOut(frameQueue);%讀取緩存隊列頭部數(shù)據(jù),并將頭部數(shù)據(jù)退出隊列
?????end
?????if(ACK(2)==1?&&?frameOrderBuffameNum)?%該幀傳輸正確,發(fā)送下一幀
?????????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]);%將新生成的幀數(shù)據(jù)加入緩存隊列
?????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隊列中的所指示的幀全部發(fā)送正確
?????????????break;?%退出循環(huán)
?????????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)%重傳數(shù)達到最大次數(shù)則不再重傳
????????????frameError=frameError+1;%記為誤幀數(shù)加1
????????????ACK=[frameOrder?1];
????????else
????????????ACK=[frameOrder?0];
????????????ARQNum(frameOrder2)=ARQNum(frameOrder2)+1;
????????end???????????????????
????end
%%將ACK重傳至發(fā)送端
????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
- 上一篇:MATLAB中ARQ程序代碼
- 下一篇:matlab元胞自動機交通網(wǎng)模擬
評論
共有 條評論