我有一个来自我的COM端口的数据流,我想以下列格式分离它的数据:
t v1 v2 v3 v4 \ n t v1 v2 v3 v4
数据按以下格式逐行进入缓冲区: t,v1,v2,v3,v4 \ n t,v1,v2,v3,v4 \ n t,v1,v2,v3,v4 ....
我已经创建了一些向量来累积来的数据。我在一个小暂停后立即读取端口(模拟原始大代码中的处理时间)。
以下是com端口内容的读取和转换的最小化部分:
clear all;
clc;
v1=zeros(10000,1);v2=zeros(10000,1);v3=zeros(10000,1);v4=zeros(10000,1);
time=zeros(10000,1);
comport= serial('COM11', 'BaudRate', 115200);
comport.InputBufferSize = 50000000;
flushinput(comport);
fopen(comport);pause(10);
tic;dat=[];in=1;
while(toc<50)
% dat=strsplit(fgetl(comport),',');
while length(dat)~=5
dat=(strsplit(fgetl(comport),','));
end
u8 = fread(comport, comport.BytesAvailable); % uchar, but in double
ch = char(u8);
x=string(ch');
newStr = splitlines(x);
% newStr=newStr(1:length(newStr)-1);
data=zeros(length(newStr),5);
% data=[];
i=1;n=1;r=[];
while(i<=length(newStr))
r=str2double(strsplit(newStr(i),','));
if(length(r)==5)
data(n,:)= r;
n=n+1;
end
i=i+1;
end
data = data(~any(isnan(data), 2), :);
data=double(data);
j=1;
while(j<=length(data))
time(in)=data(j,1);
v1(in) = (data(j,2));
v2(in) = (data(j,3));
v3(in)= (data(j,4));
v4(in) = (data(j,5));
in=in+1;
j=j+1;
end
end
fclose(comport);
delete(comport);
每当我尝试运行此代码时,它有时会起作用,但在其他时候,我会收到以下错误:
Error in freadtry (line 28)
data(i,:)= str2double(strsplit(newStr(i),','));
Subscripted assignment dimension mismatch.
你能告诉我为什么这个错误会继续发生吗?
编辑:我找到了错误并修复了它,它与一些“newStr”行的大小有关,这些行的元素少于5个。
答案 0 :(得分:-1)
我找到了错误并修复了它,它与一些&#34; newStr&#34;的大小有关。行数少于5个元素。 为了解决它,我的循环现在占用每一行并将其保存在(r)中,然后评估它的长度,如果它小于5,它将丢弃该行作为不完整。否则,它会将它添加到最终的矢量中。