matlab串口采集数据

底层stm32利用下面格式发送数据

sprintf(uartdata,"%2.4f",adcdata);

UARTprintf(uartdata);
UARTprintf("=");

matlab利用如下程序接收数据
参考http://blog.sina.com.cn/s/blog_6163bdeb0102e8qc.html

OpenSerial.m

%在matlab命令框中如下输入命令打开串口com2
%scom =OpenSerial('com2', @ReadFcn_Com2);
%输入如下命令发送数据
%WriteSerial(scom, 'Hello!');
%在如下函数中更改数据处理方式
%ReadFcn_Com2.m
%输入如下命令关闭串口
%CloseSerial(scom);
%打开串口  
function scom = OpenSerial(sname, HReadFcn)  
scom = serial(sname); 
scom.BaudRate = 9600;
scom.BytesAvailableFcnMode = 'terminator';  
scom.Terminator = '=';  
scom.BytesAvailableFcn = HReadFcn;  
try  
fopen(scom);  
catch err  
fprintf('%s打开失败。\n', sname);  
end  
fprintf('%s成功打开。\n', sname);  
end  

WriteSerial.m

% 写串口
function WriteSerial(scom, str)
fprintf(scom, str ,'async'); % 异步方式
end

ReadFcn_Com2.m

% 读串口回调函数
function ReadFcn_Com2(obj, ~)
n = get(obj, 'BytesAvailable');
if n>6
a = fread(obj, n, 'uchar');
c = char(a(end-5:end-1));
x = num2double(c);
fprintf('%f\n', x);
end
end

CloseSerial.m

% 关闭串口  
function CloseSerial(scom)  
try  
fclose(scom);  
catch err  
fprintf('%s关闭失败。', scom.Name);  
return  
end  
delete(scom);  
end  

需要注意的是,当stm32发送数据过快时,接收缓冲区会有过多数据,本文中只使用了n>6的判断,当数据长度变化的时候会有问题。所以stm32最好指定好数据的长度。

matlab默认的结束符是两个字节{LF,LF},前一个字节是读取结束符,第二个字节是发送结束符。stm32可以通过UARTprintf(“%f\n”,x);来发送数据,这样matlab就不用更改结束符

\r = CR (Carriage Return) // Used as a new line character in Mac OS before X

\n = LF (Line Feed) // Used as a new line character in Unix/Mac OS X

\r\n = CR + LF // Used as a new line character in Windows

https://cn.mathworks.com/help/matlab/matlab_external/terminator.html

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值