底层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