Включение MALTAB FIS в непрерывный цикл - PullRequest
0 голосов
/ 01 июля 2018

В настоящее время я использую два микроконтроллера Arduino для считывания двух наборов данных и отправки данных в MATLAB через Bluetooth. В коде MATLAB считывает последовательные данные, отправляет их через серию вложенных циклов «если» для организации данных. После организации сохраненные данные используются в качестве входных данных для нечеткого. У меня проблема с Пушистиком. Когда я пытаюсь использовать сохраненные данные в качестве входных данных (числовые), я получаю сообщение об ошибке, что они пусты, даже если MATLAB отображает данные без проблем.

Вот мой код (игнорируйте переменные 'x' 'y' 'z', они не используются в FIS):

a = Bluetooth('HC-05',1);

b = Bluetooth('IN',1)

a.ReadAsyncMode = 'continuous';

b.ReadAsyncMode = 'continuous';

fopen(a); %data collector A

fopen(b); %data collector B

%A data points

heartRateVarA=0;

temperatureVarA=0;

xVarA=0;

yVarA=0;

zVarA=0;

%B data points

heartRateVarB=0;

temperatureVarB=0;

xVarB=0;

yVarB=0;

zVarB=0;

%A & B loop --- Uses 'fgets' to collect 2 lines of data, one per declared

%variable before parsing into corresponding variable

while (a.Status == 'open')&(b.Status=='open')

for i=1 : 1 : 2

 matchA = fgets(a);    `

 matchB = fgets(b);


 testA=contains(matchA,'Celsius');

 testB = contains(matchB,'Celsius'); 

 if (testA==1)
     temperatureVarA=matchA;
 else
     testA=contains(matchA,'BPM');
     if(testA==1)
         heartRateVarA=matchA;
     else
         testA=contains(matchA,'X:');
         if(testA==1)
             xVarA=matchA;
         else
             testA=contains(matchA,'Y:');
             if(testA==1)
                yVarA=matchA;
             else
                 testA=contains(matchA,'Z:');
                 if(testA==1)
                     zVarA=matchA;
                 end
             end
         end    
     end
 end

 if (testB==1)
     temperatureVarB=matchB;
 else
     testB=contains(matchB,'BPM');
     if(testB==1)
         heartRateVarB=matchB;
     else
         testB=contains(matchB,'X:');
         if(testB==1)
             xVarB=matchB;
         else
             testB=contains(matchB,'Y:');
             if(testB==1)
                yVarB=matchB;
             else
                 testB=contains(matchB,'Z:');
                 if(testB==1)
                     zVarB=matchB;
                 end
             end
         end    
     end
 end

end

    %Display read and parsed in data

    fprintf('Heart Rate A : '); disp(heartRateVarA);

    fprintf('Temperature A : '); disp(temperatureVarA);

    %fprintf('X A : '); disp(xVarA);

    %fprintf('Y A : '); disp(yVarA);

    %fprintf('Z A : '); disp(zVarA);

    fprintf('Heart Rate B : '); disp(heartRateVarB);
    fprintf('Temperature B : '); disp(temperatureVarB);
    %fprintf('X B : '); disp(xVarB);
    %fprintf('Y B : '); disp(yVarB);
    %fprintf('Z B : '); disp(zVarB);

   %FIS eval --- treats stored values of HR and temp variables as inputs
    fis=FuzzyPrototype;
    outputA = evalfis([heartRateVarA temperatureVarA],fis);
    outputB = evalfis([heartRateVarB temperatureVarB],fis);`

    disp(outputA)
    disp(outputB)

    if(a.Status ~= 'open')|(b.Status ~= 'open')
       break;
    end

pause(20);   

end

Я получаю сообщение об ошибке: «Первый аргумент должен иметь столько столбцов, сколько входных переменных и столько строк, сколько независимых наборов входных значений. "

1 Ответ

0 голосов
/ 01 июля 2018

Ошибка была вызвана тем, что входы НЕ были двойными. Включив 'str2double', я мог бы преобразовать входы в double и войти в FIS.

...