i tried pulling my data from arduino port but got error. I am a novice
    4 views (last 30 days)
  
       Show older comments
    
serialPort = 'COM5';
baudrate = 115200;
s = serialport(serialPort,baudrate);
pause(4);
numsamples = 1000;
data = zeros(numsamples,4);
for i = 1:numsamples
    line = readline(s);
    values = sscanf(line, '%d,%d,%d,%d');
    if numel(values) == 3
        data(i,:) = values';
    end
    pause(0.1)
end
time = data(:,1);
figure;
plot(time, data(:,2), 'r',time, data(:,3), 'b',time, data(:,4), 'g');
xlabel('Time(s)');
ylabel('Acceleration (m/s^2)');
legend('X','Y','Z');
title('ESP_now receiver data');
Error in untitled2 (line 13)
    values = sscanf(line, '%d,%d,%d,%d');
5 Comments
  Cris LaPierre
    
      
 on 14 Apr 2023
				Sorry, I was getting distracted by the red error text appearing because you were trying to run your code here. That would be expected as hardware is not supported in the 'Run Code' feature in Answers, and is not the error you were referring to. I have removed the output from your code to remove the confusion.
Answers (1)
  Walter Roberson
      
      
 on 14 Apr 2023
        
      Moved: Walter Roberson
      
      
 on 14 Apr 2023
  
          line = readline(s); % Read a line from the serial port
    values = textscan(line, '%d,%d,%d'); % Parse the line using textscan
readline(s) is returning a line that does not start with whitespace and then  '-' followed by digits, or '+' followed by digits, or digits, or '-.' followed by digits, or '+.' followed by digits, or '.' followed by digits. That is, the line is either empty or is entirely whitespace or starts with something that cannot be a number.
In the case that it started with a number but then did not have a comma after the number, or had a comma followed by something that is not a number, then values{1} would contain the first number but values{2} would be empty
You should be doing something like
    line = readline(s); % Read a line from the serial port
    values = cell2mat(textscan(line, '%d,%d,%d')); % Parse the line using textscan
    if numel(values) == 3
        data(i,:) = values;
    end
The difference between this and what you are doing is that you are checking numel() on the cell array returned by textscan(), but textscan() always returns a cell array with as many elements as there are active % formats in the format description, with the cell array entries potentially being empty.
19 Comments
  Walter Roberson
      
      
 on 14 Apr 2023
				
      Edited: Walter Roberson
      
      
 on 14 Apr 2023
  
			Your code loops numSamples = 100; times, gathering data each time, and does not display anything until afterwards. It will not stream. You would need to display the data inside the loop.
% Define serial port and open the connection
serialPort = 'COM13'; % Replace with your Arduino's serial port
baudrate = 115200;
s = serialport(serialPort, baudrate);
configureTerminator(s,"CR")
pause(2); % Give the connection some time to be established
% Read accelerometer data from the Arduino
numSamples = 10000; % Number of samples to read
data = zeros(numSamples, 3); % Preallocate a matrix to store the data
countsPerG = 256; % For a range of +/-2g
g = 9.81; % Gravitational acceleration
dt = 0.1;
max_retries = 25;
pause_time = 0.1;   % Adjust the delay if necessary
hX = animatedline('Color', 'r', 'displayname', 'X');
hold on
hY = animatedLine('Color', 'g', 'displayname', 'Y');
hZ = animatedLine('Color', 'b', 'displayname', 'Z');
legend show
xlabel('Time (s)');
ylabel('Acceleration (m/s^2)');
title('ADXL345 Accelerometer Data');
hold off
for i = 0:numSamples-1
    gotline = false;
    for trycount = 1 : max_retries
        pause(pause_time);
        line = readline(s); % Read a line from the serial port
        %result of readline() sometimes shows up as double([])
        %but char([]) is empty char and strtrim '' is fine empty char
        %so we do not need to specifically test for []
        line = strtrim(char(line));
        if isempty(line); continue; end
        values = cell2mat(textscan(line, '%f,%f,%f')); % Parse the line using textscan
        if numel(values) == 3
            gotline = true;
            break;
        end
    end
    if ~gotline
        error('failed to get valid line in %d tries', max_retries);
    end
    data(i+1,:) = values / countsPerG * g;
    addpoints(hX, dt*i, data(i+1,1));
    addpoints(hY, dt*i, data(i+1,2));
    addpoints(hZ, dt*i, data(i+1,3));
    drawnow limitrate
end
% Close the serial port connection
clear s;
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!