求大神指教。
在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;
else
DAStudio.error('TIC2000:blocks:SCIHostRxDataLength');
end
% Register number of ports
block.NumInputPorts = 0;
if outputStatus == 1 %output receiving status
block.NumOutputPorts = 2;
else
block.NumOutputPorts = 1;
end
% Setup port properties to be inherited or dynamic
block.SetPreCompOutPortInfoToDynamic;
% Override output port properties
block.OutputPort(1).DatatypeID = datatypeID;
block.OutputPort(1).Complexity = 'Real';
block.OutputPort(1).SamplingMode = 'Sample';
block.OutputPort(1).Dimensions = outputDims;
if block.NumOutputPorts == 2
block.OutputPort(2).DatatypeID = 0;
block.OutputPort(2).Complexity = 'Real';
block.OutputPort(2).SamplingMode = 'Sample';
block.OutputPort(2).Dimensions = 1;
end
% Register parameters
block.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 time
block.SampleTimes = sampletimes;
%% -----------------------------------------------------------------
%% Options
%% -----------------------------------------------------------------
% Specify if Accelerator should use TLC or call back into
% MATLAB file
block.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).Data
case 1
commMode = get_param(setupBlk, 'commModeA');
case 2
commMode = get_param(setupBlk, 'commModeB');
case 3
commMode = get_param(setupBlk, 'commModeC');
case 4
commMode = 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; %double
block.Dwork(1).Complexity = 'Real'; % real
block.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);
else
DAStudio.error('TIC2000:blocks:SCIHostRxInitDimension');
end
block.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);
else
DAStudio.error('TIC2000:blocks:SCIHostRxTimeoutDimension');
end
block.Dwork(2).Data = errValue;
%endfunction
%%
%% Outputs function for raw data mode
%%
function RawOutputs(block)
try
com = 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 dataType
case {1, 6, 7} %single, int32, uint32
typeDim = 4;
case {2, 3} %int8, uint8
typeDim = 1;
case {4, 5} %int16, uint16
typeDim = 2;
end
dataLen = 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;
else
cnt = 1;
end
if(etime(clock, t0) > tmax)
break;
end
end
if cnt > length(head)
rcvStat = 0;
else
rcvStat = 1;
end
else
rcvStat = 0;
end
%== get data ==================================%
if rcvStat == 0
while(com.BytesAvailable < dataLen) %wait until data arrived
if(etime(clock, t0) > tmax)
rcvStat = 1; %timeout
break;
end
end
if (com.BytesAvailable >= dataLen)
recbuff = uint8(fread(com, dataLen, 'uchar'));
outdata = c2char2num(recbuff, dataType, dataDim);
else %
rcvStat = 1;
end
end
%== check tail ================================%
if rcvStat == 0 && length(tail)
while(com.BytesAvailable < length(tail))
if(etime(clock, t0) > tmax)
rcvStat = 1;
break;
end
end
if(com.BytesAvailable >= length(tail))
rcvTail = uint8(fread(com, length(tail))');
if (isequal(rcvTail, tail))
rcvStat = 0;
else
rcvStat = 2;
end
end
end
%== Output received data ======================%
if rcvStat == 0
block.OutputPort(1).Data = outdata;
elseif block.DialogPrm(7).Data == 2
block.OutputPort(1).Data = block.Dwork(2).Data;
end
if block.NumOutputPorts == 2
block.OutputPort(2).Data = rcvStat;
end
catch ME
fclose(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, uint32
typeDim = 4;
case {2, 3} %int8, uint8
typeDim = 1;
case {4, 5} %int16, uint16
typeDim = 2;
end
dataDim = block.DialogPrm(5).Data;
dataLen = dataDim * typeDim;
try
com = 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);
else
rcvPkg = fread(com, 1);
end
if (rcvPkg == 's')
try
fwrite(com, 'r');
catch ME
if isempty(strfind( ME.identifier, 'blocks:SCIHostTxWriteTimeout'))
ME.rethrow;
else
fwrite(com, 'r');
end
end
while(1) % get the head of data package
rcvPkg = fread(com, 1);
if(rcvPkg == 'd')
break;
elseif(etime(clock, t0) > tmax)
DAStudio.error('TIC2000:blocks:SCIHostRxReadTimeout');
end
end
while(com.BytesAvailable < dataLen+1) %wait until all data arrived
if(etime(clock, t0) > tmax)
fread(com, com.BytesAvailable); %clear receive buffer
DAStudio.error('TIC2000:blocks:SCIHostRxReadTimeout');
end
end
recbuff = uint8(fread(com, dataLen+1, 'uchar'));
if(~tchecksum(recbuff))
block.OutputPort(1).Data = c2char2num(recbuff(1:end-1), dataType, dataDim);
if block.NumOutputPorts == 2
block.OutputPort(2).Data = 0;
end
break;
elseif block.DialogPrm(7).Data == 2
%data error, output error value
block.OutputPort(1).Data = block.Dwork(2).Data;
if block.NumOutputPorts == 2
block.OutputPort(2).Data = 2;
end
break;
else
if block.NumOutputPorts == 2
block.OutputPort(2).Data = 2;
end
break;
end
end
if (etime(clock, t0) > tmax)
%% DAStudio.error('TIC2000:blocks:SCIHostRxReadTimeout');
break;
end
end
catch ME
if(isempty(strfind(ME.message, 'sci_rx_timeout')))
fclose(com);
ME.rethrow;
else %timeout
if block.DialogPrm(7).Data == 2
%output error value
block.OutputPort(1).Data = block.Dwork(2).Data;
end
if block.NumOutputPorts == 2
block.OutputPort(2).Data = 1;
end
end
end
%endfunction
这个问题困扰了我好几天,实在不知道怎么解决,谢谢各位大神了!






