Ok, då börjar jag med att förklara raden "data(i,1)=str2double(fscanf((s1)));"
"S1" är serieportsobjektet, i detta objektet finns tex Baudrate:en mm.
"fscanf((s1)" läser av serie porten i ASCI format. Detta konverteras sedan med "str2double" till siffror. Den bara lägger jag siffrorna i data matrisen.
Mitt program i µC ser väldigt förenklat ut så här:
Kod: Markera allt
$regfile = "m8def.DAT"
$crystal = 8000000
$baud = 57600
Config ADC...
Main:
var0=läs(ADC0)
print var0
var1=läs(ADC1)
print var1
waitms 200
Goto Main
Om jag tittar i en vanlig terminal så ser det ut så här:
var0
var1
var0
var1
...
Det är alltså dessa rader jag läser av med
data(i,1)=str2double(fscanf((s1))); %pos1
data(i,2)=str2double(fscanf((s1))); %setpoint
Det är viktigt att både µC och matlab hinner med att skicka och läsa varje rad. Börja med något enkelt tex att skicka 5 värden per sekund från µC. Med en hastighet på tex 19200 Baud.
Kolla sedan i en vanlig RS-232 terminal att texten ser ut som ovan.
Där efter kan du testa med matlab.
Nu har matlab en timeout också så modifiera matlab så den läser in värdena i tex 5s:
for i= 1 :25 %acquisition of 25 points
data(i,1)=str2double(fscanf((s1))); %var0
data(i,2)=str2double(fscanf((s1))); %var1
end
Om matlab drabbas av en time-out eller låser sig, så är det svårt att radera hela S1 objektet. Även om det inte finns i workspace så håller den linjen öppen och reserverad. Om detta händer är det säkrast att starta om matlab. Alternativt att vara säker på att S1 har raderats och att en ny länk kan öppnas på com-porten.
Om bitrate:en blir för stor så att matlab inte hinner med så kan ett tal missas vilket resulterar i att var1 hamnar i data(i,1) och viceversa. Eller så klarar inte matlab läsa alls så time-out:en aktiveras.
Slutligen var fick du felmedelandet i matlab eller från µC?