Hello, I am trying to send 2 vectors from MATLAB and store them into arrays on the arduino. Afterwords I perform the inner product of the vectors and use Serial print to get the answer back into MATLAB. I was able to do this, but I can't do it unless I include "pause(1)" in MATLAB. I'd like to get rid of pause(1) from my code, but if I don't use it then my code doesn't work. What in the Arduino is stopping me from getting rid of it?
Arduino code:
//This program takes in 2 vectors from matlab and does the inner product of 2 vectors
//and prints the results to the Serial port to be read by matlab again.
//The program reads in the Serial data from MATLAB and puts it into arrays, and then the calculations are done.
int flag = 0; //checks if a 0 has been entered at the end of a string
int flag2 = 1; // Checks if we are done getting data for the arrays.
int flag3 = 0; // Checks to clear memory space
int length; //keeps track of the place within the array
void setup()
{
Serial.begin(9600);
}
void loop()
{
float array1[100];
float array2[100];
float ibyte = 0;
if(flag3 == 0){//This sets all of the data in the memory locations within the arrays to 0.
erasememory(array1,array2);}
if(Serial.available()>0 && (flag2 == 0))
{
// Serial.flush();
ibyte=Serial.parseFloat();
if ((ibyte == 0) && (flag == 1)){
// Serial.println("No more numbers");
flag2 = 1;}
if ((ibyte == 0) && (flag == 0)){
// Serial.println("Changing to Array2");
flag = 1;
length = 0;}
if(flag == 0 && (ibyte != 0)){
array1[length] = ibyte;
length = length + 1;}
if(flag == 1 && (ibyte != 0)){
array2[length] = ibyte;
length = length + 1;}
// delay(800);
Serial.println(ibyte); //I'd like to remove this, so that way the only serial data being sent back
//to MATLAB is the answer found later
}
if(flag2 == 1) //This essentially gets the
{//Arraycheck(array1,array2); This is old and has been replaced, ignore it ,or don't. Im not a cop.
SetLCD(array1,array2);//This prints out the math done with the vectors
flag2 = 0;//This resets flags and length so that the arduino can keep running new vectors.
flag = 0;
length = 0;}
}
void Arraycheck(float* array1, float* array2)
{s
}
void erasememory(float* array1, float* array2)
{
int i;
for(i=0; i<100; i++)
{
array1[i] = 0;
array2[i] = 0;
}
flag3 = 1;
}
void SetLCD(float* array1, float* array2)
{
//I am lazy and have no made the LCD part and probably wont.
Serial.println(math(array1,array2));
}
float math (float array1[], float array2[])
{
int i;
float sum = 0;
for(i = 0; i < 100; i++)
{
sum = array1[i]*array2[i] +sum;
}
return sum;
}
Matlab code:
%Before running the program make a variable "s" that is
%ttyS101 may be set in the terminal by
%"sudo ln -s /dev/ttyACM0 /dev/ttyS101"
%"s = serial('/dev/ttyS101', 'BaudRate', 9600);" (for linux folks otherwise
%use COM# for windows)
%fopen(s);
% However, check which port the arduino is connected to it might be ACM1
% or a different port.
fopen(s);
%array1 = [1.05, 1.23, 1.66, -1.43, 2, 0];
%array2 = [-2.21, -.8, 2.08, 1.20, 3, 0];
array1 = [1, 2, 0];
array2 = [6, 7, 0];
length1 = numel(array1);
length2 = numel(array2);
%if the arrays aren't the same size or the arrays dont end
%in 0 then they return an error
if (length1) ~= (length2)
disp('Arrays are not the same size')
return
end
if (array1(length1) ~= 0)
disp('Array1 doesnt end in 0')
return
end
if (array2(length2) ~= 0)
disp('Array2 doesnt end in 0')
return
end
TRASH = fscanf(s, '%c')
disp('Program has started')
for i = 1:length1
fprintf(s,'%.2f',array1(i));
pause(1);
fscanf(s, '%c')
end
for i = 1:length2
fprintf(s,'%.2f',array2(i));
pause(1);
fscanf(s, '%c')
end
y = fscanf(s,'%c')
CorrectAnswer = array1*transpose(array2)
fclose(s);