Hi all,
I am able to read data from FPGA to Nios processor, then transmit this data to Uart component created in Qsys using direct register method (IORD_ALTERA_AVALON_UART_STATUS (UART_BASE);
IOWR_ALTERA_AVALON_UART_TXDATA(UART_BASE, txdata);etc).
Then, I was trying to access serial port data sent from uart in Altera Nios II to plot graph real time in Matlab. I was using this code from Matlab central (
http://uk.mathworks.com/matlabcentra...om-serial-port) with minor modification as pasted below:
When I run this code I keep getting the following error. What should I do ?
??? In an assignment A(I) = B, the number of elements in B and
I must be the same.
Error in ==> real_time_data_serial at 80
voltage(count) = fscanf(s,'%f');
I found a few solutions on the web, what I have tried:
1. add pause in .m file so that it has enough time to read the data before the next cycle of data
2. add enough delay at C code where I transmit data to uart
3. make sure the uart has the same setting as comport such as comport number, baud rate, parity, flow control
%%real time data plot from a serial port
% This matlab script is for ploting a graph by accessing serial port data in
% real time. Change the com values and all variable values accroding to
% your requirements. Dont forget to add terminator in to your serial device program.
% This script can be modified to be used on any platform by changing the
% serialPort variable.
% Author: Moidu thavot.
%%Clear all variables
clear all;
%%Variables (Edit yourself)
SerialPort='com8'; %serial port
MaxDeviation = 3;%Maximum Allowable Change from one value to next
TimeInterval=0.2;%time interval between each input.0.2
loop=120;%count values
%%Set up the serial port object
s=serial('com8');
set(s,'BaudRate',9600,'DataBits', 8, 'Parity', 'none','StopBits', 1, 'FlowControl', 'none','Terminator','LF');
set(s, 'terminator', 'LF');
set(s, 'timeout', 10);
%%s = serial(SerialPort)
fopen(s);
time =now;
voltage = 0;
%% Set up the figure
figureHandle = figure('NumberTitle','off',...
'Name','Voltage Characteristics',...
'Color',[0 0 0],'Visible','off');
% Set axes
axesHandle = axes('Parent',figureHandle,...
'YGrid','on',...
'YColor',[0.9725 0.9725 0.9725],...
'XGrid','on',...
'XColor',[0.9725 0.9725 0.9725],...
'Color',[0 0 0]);
hold on;
plotHandle = plot(axesHandle,time,voltage,'Marker','.','LineWid th',1,'Color',[0 1 0]);
xlim(axesHandle,[min(time) max(time+0.001)]);
% Create xlabel
xlabel('Time','FontWeight','bold','FontSize',14,'C olor',[1 1 0]);
% Create ylabel
ylabel('Voltage in V','FontWeight','bold','FontSize',14,'Color',[1 1 0]);
% Create title
title('Real Time Data','FontSize',15,'Color',[1 1 0]);
%% Initializing variables
voltage(1)=0;
time(1)=0;
count = 2;
k=1;
while ~isequal(count,loop)
%%Re creating Serial port before timeout
k=k+1;
if k==25
fclose(s);
delete(s);
clear s;
s = serial('com8');
fopen(s)
k=0;
end
%%Serial data accessing
pause(2);
fprintf('here');
voltage(count) = fscanf(s,'%f');
%%For reducing Error Use your own costant
voltage(1)=0;
if (voltage(count)-voltage(count-1)>MaxDeviation)
voltage(count)=voltage(count-1);
end
time(count) = count;
set(plotHandle,'YData',voltage,'XData',time);
set(figureHandle,'Visible','on');
datetick('x','mm/DD HH:MM');
pause(5);
count = count +1;
end
%% Clean up the serial port
fclose(s);
delete(s);
clear s;
When I check the serial port status, I got the following:
Communication Settings
Port: COM8
BaudRate: 9600
Terminator: 'LF'
Communication State
Status: open
RecordStatus: off
Read/Write State
TransferStatus: idle
BytesAvailable: 0
ValuesReceived: 0
ValuesSent: 0
I noticed the serial port is ready (since it is open) but no data is sent or receive. Could you please tell me what is wrong so I could try?
Please , thank you