TI中文支持网
TI专业的中文技术问题搜集分享网站

Simulink里创建SCI通讯模块,错误:索引超出矩阵维度

求大神指教。

在MATLAB/Simulink里创建了SCI通讯的transmit和Receive模块,希望在目标板F28035的串口上收到数据后原原本本的再发送回来,在主机的串口调试助手上可以实现发送的内容再接收回来。如下图所示。F28035,SCI transmit,SCI receive都已配置好。

使用串口COM4

编译之后出现错误如下:

根据错误信息提示,我打开了c200hostsci_rx.m文件,PostPropagationSetup也找到具体位置,但是不知道该怎么修改。

c200hostsci_rx.m源码如下:

function c2000hostsci_rx(block)
% S-function for Host side serial receive block
%
%  See also C2000HOSTSCI_TX

% Copyright 2006-2013 The MathWorks, Inc.

setup(block);
%endfunction

%% Function: setup ===================================================
%% Abstract:
%%Set up the S-function block's basic characteristics such as:
%%- Input ports
%%- Output ports
%%- Dialog parameters
%%- Options
%% 
%%Required: Yes
%%C-Mex counterpart: mdlInitializeSizes
%%
function setup(block)datatypeID = block.DialogPrm(4).Data;dataLenPrm = block.DialogPrm(5);sampletimes = [block.DialogPrm(9).Data, 0];outputStatus = block.DialogPrm(10).Data;if isequal(dataLenPrm.Dimensions, [ 1 1 ])outputDims = dataLenPrm.Data;elseDAStudio.error('TIC2000:blocks:SCIHostRxDataLength');end% Register number of portsblock.NumInputPorts  = 0;if outputStatus == 1 %output receiving statusblock.NumOutputPorts = 2;elseblock.NumOutputPorts = 1;end% Setup port properties to be inherited or dynamicblock.SetPreCompOutPortInfoToDynamic;% Override output port propertiesblock.OutputPort(1).DatatypeID= datatypeID;block.OutputPort(1).Complexity= 'Real';block.OutputPort(1).SamplingMode = 'Sample';block.OutputPort(1).Dimensions= outputDims;if block.NumOutputPorts == 2block.OutputPort(2).DatatypeID= 0;block.OutputPort(2).Complexity= 'Real';block.OutputPort(2).SamplingMode = 'Sample';block.OutputPort(2).Dimensions= 1;end% Register parametersblock.NumDialogPrms= 10;block.DialogPrmsTunable = {'Nontunable', 'Nontunable', 'Nontunable', 'Nontunable', 'Nontunable', 'Nontunable', 'Nontunable','Nontunable', 'Nontunable', 'Nontunable'};% Register sample times%  [0 offset]: Continuous sample time%  [positive_num offset] : Discrete sample time%%  [-1, 0]: Port-based sample time%  [-2, 0]: Variable sample timeblock.SampleTimes = sampletimes;%% -----------------------------------------------------------------%% Options%% -----------------------------------------------------------------% Specify if Accelerator should use TLC or call back into% MATLAB fileblock.SetAccelRunOnTLC(false);%% -----------------------------------------------------------------%% Register methods called during update diagram/compilation%% -----------------------------------------------------------------%%%% CheckParameters:%%Functionality: Called in order to allow validation of%%block's dialog parameters. User is%%responsible for calling this method%%explicitly at the start of the setup method%%C-Mex counterpart: mdlCheckParameters%%block.RegBlockMethod('CheckParameters', @CheckPrms);%%%% PostPropagationSetup:%%Functionality: Setup work areas and state variables. Can%%also register run-time methods here%%C-Mex counterpart: mdlSetWorkWidths%%block.RegBlockMethod('PostPropagationSetup', @DoPostPropSetup);%% -----------------------------------------------------------------%% Register methods called at run-time%% -----------------------------------------------------------------%%%% ProcessParameters:%%Functionality: Called in order to allow update of run-time%%parameters%%C-Mex counterpart: mdlProcessParameters%%block.RegBlockMethod('ProcessParameters', @ProcessPrms);%%%% Start:%%Functionality: Called in order to initialize state and work%%area values%%C-Mex counterpart: mdlStart%%block.RegBlockMethod('Start', @Start);

%endfunction

%% -------------------------------------------------------------------
%% The local functions below are provided for illustrative purposes
%% to show how you may implement the various block methods listed
%% above.
%% -------------------------------------------------------------------

function CheckPrms(block)
%endfunction

function ProcessPrms(block)block.AutoUpdateRuntimePrms;
 
%endfunction
function DoPostPropSetup(block)setupBlk = find_system(bdroot, 'FollowLinks', 'on', 'MaskType','c2000 Host SCI Setup');switch block.DialogPrm(1).Datacase 1commMode= get_param(setupBlk, 'commModeA');case 2commMode= get_param(setupBlk, 'commModeB');case 3commMode= get_param(setupBlk, 'commModeC');case 4commMode= get_param(setupBlk, 'commModeD');end%== Register method for Outputs function =========================switch commMode{1}case 'protocol'block.RegBlockMethod('Outputs', @ProOutputs);case 'raw data'block.RegBlockMethod('Outputs', @RawOutputs);end%== Restore serial port id and error output value to Dwork space ==block.NumDworks = 2;block.Dwork(1).Name= 'InstrID';block.Dwork(1).Dimensions= 1;block.Dwork(1).DatatypeID= 0;%doubleblock.Dwork(1).Complexity= 'Real'; % realblock.Dwork(2).Name= 'ErrorValue';block.Dwork(2).Dimensions= block.OutputPort(1).Dimensions;block.Dwork(2).DatatypeID= block.OutputPort(1).DatatypeID;block.Dwork(2).Complexity= 'Real'; % real

%endfunction


function Start(block)%== Get Serial port ID and store it in to Dwork(1) ==============setupBlk = find_system(bdroot, 'FollowLinks', 'on', ...'MaskType','c2000 Host SCI Setup');userdata = get_param(setupBlk{1}, 'userdata');moduleID =  block.DialogPrm(1).Data;block.Dwork(1).Data = userdata.serialID(moduleID);%== Setup initial output value & error output value ==============datatype= class(block.OutputPort(1).Data);initPrm= block.DialogPrm(6);errValuePrm = block.DialogPrm(8);if isequal(initPrm.Dimensions, [1 block.OutputPort(1).Dimensions])initValue = cast(initPrm.Data, datatype);elseif isequal(initPrm.Dimensions, [1 1])initValue = ones(1, block.OutputPort(1).Dimensions) .* initPrm.Data;initValue = cast(initValue, datatype);elseDAStudio.error('TIC2000:blocks:SCIHostRxInitDimension');endblock.OutputPort(1).Data = initValue;if isequal(errValuePrm.Dimensions, [1 block.OutputPort(1).Dimensions])errValue = cast(errValuePrm.Data, datatype);elseif isequal(errValuePrm.Dimensions, [1 1])errValue = ones(1, block.OutputPort(1).Dimensions) .* errValuePrm.Data;errValue = cast(errValue, datatype);elseDAStudio.error('TIC2000:blocks:SCIHostRxTimeoutDimension');endblock.Dwork(2).Data = errValue;
%endfunction

%%
%% Outputs function for raw data mode
%%
function RawOutputs(block)trycom = instrfind('id', block.Dwork(1).Data);head = uint8(block.DialogPrm(2).Data);tail = uint8(block.DialogPrm(3).Data);dataDim = block.DialogPrm(5).Data;dataType =  block.DialogPrm(4).Data;switch dataTypecase {1, 6, 7}%single, int32, uint32typeDim = 4;case {2, 3}%int8, uint8typeDim = 1;case {4, 5}%int16, uint16typeDim = 2;enddataLen = dataDim*typeDim;t0 = clock;tmax = com.Timeout;%== check head ================================%if length(head)cnt = 1;while (cnt <= length(head))recHead = fread(com, 1, 'uint8');if recHead == head(cnt)cnt = cnt+1;elsecnt = 1;endif(etime(clock, t0) > tmax)break;endendif cnt > length(head)rcvStat = 0;elsercvStat = 1;endelsercvStat = 0;end%== get data ==================================%if rcvStat == 0while(com.BytesAvailable < dataLen) %wait until data arrivedif(etime(clock, t0) > tmax)rcvStat = 1; %timeoutbreak;endendif (com.BytesAvailable >= dataLen)recbuff = uint8(fread(com, dataLen, 'uchar'));outdata = c2char2num(recbuff, dataType, dataDim);else %rcvStat = 1;endend%== check tail ================================%if rcvStat == 0 && length(tail)while(com.BytesAvailable < length(tail))if(etime(clock, t0) > tmax)rcvStat = 1;break;endendif(com.BytesAvailable >= length(tail))rcvTail = uint8(fread(com, length(tail))');if (isequal(rcvTail, tail))rcvStat = 0;elsercvStat = 2;endendend%== Output received data ======================%if rcvStat == 0block.OutputPort(1).Data = outdata;elseif block.DialogPrm(7).Data == 2block.OutputPort(1).Data = block.Dwork(2).Data;endif block.NumOutputPorts == 2block.OutputPort(2).Data = rcvStat;endcatch MEfclose(com);ME.rethrow;end
%endfunction

%%
%% Output function for protocol mode
%% 
function ProOutputs(block)

dataType =  block.DialogPrm(4).Data; 

switch dataType
case {1, 6, 7}%single, int32, uint32typeDim = 4;
case {2, 3}%int8, uint8typeDim = 1;
case {4, 5}%int16, uint16typeDim = 2;
end

dataDim = block.DialogPrm(5).Data;
dataLen = dataDim * typeDim;
trycom = instrfind('id', block.Dwork(1).Data);t0 = clock;tmax = com.Timeout;while(1)if(com.BytesAvailable)rcvPkg = fread(com, com.BytesAvailable, 'uchar');rcvPkg = rcvPkg(end);elsercvPkg = fread(com, 1);endif (rcvPkg == 's')tryfwrite(com, 'r');catch MEif isempty(strfind( ME.identifier, 'blocks:SCIHostTxWriteTimeout'))ME.rethrow;elsefwrite(com, 'r');endendwhile(1) % get the head of data packagercvPkg = fread(com, 1);if(rcvPkg == 'd')break;elseif(etime(clock, t0) > tmax)DAStudio.error('TIC2000:blocks:SCIHostRxReadTimeout');endendwhile(com.BytesAvailable < dataLen+1) %wait until all data arrivedif(etime(clock, t0) > tmax)fread(com, com.BytesAvailable); %clear receive bufferDAStudio.error('TIC2000:blocks:SCIHostRxReadTimeout');endendrecbuff = uint8(fread(com, dataLen+1, 'uchar'));if(~tchecksum(recbuff))block.OutputPort(1).Data = c2char2num(recbuff(1:end-1), dataType, dataDim);if block.NumOutputPorts == 2block.OutputPort(2).Data = 0;endbreak;elseif block.DialogPrm(7).Data == 2%data error, output error valueblock.OutputPort(1).Data = block.Dwork(2).Data;if block.NumOutputPorts == 2block.OutputPort(2).Data = 2;endbreak;elseif block.NumOutputPorts == 2block.OutputPort(2).Data = 2;endbreak;endendif (etime(clock, t0) > tmax)
%%DAStudio.error('TIC2000:blocks:SCIHostRxReadTimeout');break;endend
catch MEif(isempty(strfind(ME.message, 'sci_rx_timeout')))fclose(com);ME.rethrow;else %timeoutif block.DialogPrm(7).Data == 2%output error valueblock.OutputPort(1).Data = block.Dwork(2).Data;endif block.NumOutputPorts == 2block.OutputPort(2).Data = 1;endend
end
%endfunction

这个问题困扰了我好几天,实在不知道怎么解决,谢谢各位大神了!

赞(0)
未经允许不得转载:TI中文支持网 » Simulink里创建SCI通讯模块,错误:索引超出矩阵维度
分享到: 更多 (0)