0

下面的程序是选择性重复协议,用于传输随机生成的帧,有时在传输帧时会出现错误。帧总数、窗口大小和帧长度由用户动态给出。如果窗口大小为 3 且帧数为 7,则协议发送第一个生成的三帧,并在接收到第一三帧后发送接下来的三个生成位,最后剩余的第 7 帧在接收到先前发送的帧后发送。然后在完成传输后,收到确认。如果发送第 2 帧有错误,只有在第 2 帧重传后,才会发送下一组三帧。如果帧长度为 4 ,则每帧将有 5 位(帧长度 + 一个奇偶校验位)

%while(b==1)
clc;
m=input('Enter the total no of frames:');
n=input('Enter the window size:');
t=input('Enter the length of frames:');
disp(sprintf('\n'));
while(m~=0)
if(m<n)
n=m;
end
for i=1:1:n;
d=randint(1,t);
d(t+1)=rem(sum(d),2);
a(i,1:t+1)=d;
disp(sprintf('Transmitting frame %d :',i));
disp(a(i,1:t+1));
end
p=randint(1,1,[1,n]);
q=randint(1,1,[1,t+1]);
a(p,q)=randint(1,1);
for i=1:1:n
fprintf('Received frame %d:',i);
disp(a(i,1:t+1));
end
f=zeros(1,n);
for i=1:1:n
f(i)=rem(sum(a(i,1:t+1)),2);
if(f(i)==1)
p=i;
end
end
if(f==0)
fprintf('ACKNOWLEDGEMENT RECEIVED\n');
else
fprintf('Frame%d is REJECTED\n',p);
disp('RETRANSMITTING....');
a(p,q)=~a(p,q);
for i=p
fprintf('Received frame %d:',i);
disp(a(i,1:t+1));
end
end
m=m-n;
end

该程序的输出

Enter the total no of frames:5
Enter the window size:3
Enter the length of frames:4


Transmitting frame 1 :
     1     1     0     1     1

Transmitting frame 2 :
     1     0     0     1     0

Transmitting frame 3 :
     1     1     0     1     1

Received frame 1:     1     1     0     1     1

Received frame 2:     1     0     0     1     0

Received frame 3:     1     1     1     1     1

Frame3 is REJECTED
RETRANSMITTING....
Received frame 3:     1     1     0     1     1

Transmitting frame 1 :
     0     0     1     1     0

Transmitting frame 2 :
     1     1     0     1     1

Received frame 1:     0     0     1     1     0

Received frame 2:     1     1     0     1     1

ACKNOWLEDGEMENT RECEIVED
>> 

我需要将随机生成的帧更改为用户动态,并且对帧的长度没有限制(想要输入不同长度的帧)

4

1 回答 1

0

据我了解,您希望用户输入每一帧,并且一帧的长度可能与下​​一帧不同。

如果是这种情况,您可以使用以下代码:

clear;
close;
clc;

m=input('Enter the total no of frames:');
n=input('Enter the window size:');
a=-ones(n,1);
max=0;
disp(sprintf('\n'));

while(m~=0)
    if(m<n)
        n=m;
    end

    for i=1:1:n;
        while(1)
            d=input('Enter a frame: ');    %To be input as, for example, [0 1 1 0]
            if((size(d,1)~=1 && size(d,2)~=1) || length(size(d))~=2)
                disp('Invalid input! Frame must be an one dimensional array. Try again.');
                continue;
            else
                break;
            end
        end
        t=length(d);
        if(t>max)
            max=t;
            a_temp=-(ones(n,t+2));
            a_temp(1:size(a,1),1:size(a,2))=a;
            a=a_temp;
        end
        d(t+1)=rem(sum(d),2);
        a(i,1:t+1)=d;
        disp(sprintf('Transmitting frame %d :',i));
        disp(a(i,1:t+1));
    end

    p=[find(a==1);find(a==0)];
    q=ceil(rand()*length(p));
    if(q==0)
        q=1;
    end
    a(q)=randint(1,1);

    for i=1:1:n
        t=find(a(i,:)==-1,1)-2;
        fprintf('Received frame %d:',i);
        disp(a(i,1:t+1));
    end

    f=zeros(1,n);
    for i=1:1:n
        t=find(a(i,:)==-1,1)-2;
        f(i)=rem(sum(a(i,1:t+1)),2);
        if(f(i)==1)
            p=i;
        end
    end

    if(f==0)
        fprintf('ACKNOWLEDGEMENT RECEIVED\n');
    else
        fprintf('Frame%d is REJECTED\n',p);
        disp('RETRANSMITTING....');
        a(q)=~a(q);
        for i=p
            t=find(a(i,:)==-1,1)-2;
            fprintf('Received frame %d:',i);
            disp(a(i,1:t+1));
        end
    end

    m=m-n;
end

编辑

为此,您需要d上一个问题中的 将上一个问题中的 d 替换为其他内容,例如d_indices.

将该行添加j=1;到上一个代码的末尾。

现在将当前代码(不带clear)添加到先前代码的末尾并进行以下更改:

  1. 替换m=input('Enter the total no of frames:');m=length(d_indices)-1;
  2. 替换d=input('Enter a frame: ');
j=j+1;
if(j>length(d_indices)
    break;
end
d=x((d_indices(j-1)+1):d_indices(j));

我还没有尝试过,但你应该很高兴。

于 2013-03-27T04:09:04.857 回答