分享一個自己寫的 MATLAB 串口示波器, 可直接透過藍牙連接
本帖最后由 john800422 于 2015-7-14 00:53 编辑分享一個自己寫的 MATLAB 串口示波器,
可直接透過藍牙連接,一次傳輸 10 byte,帶 3 個 int16 的資料。
MATLAB 部分沒有特別做優化,目前 100Hz 應該沒有問題,頻率大了圖會變慢而已,
可以拿用調試感測器,像是加速度計、陀螺儀等。
封包格式
byte_0 = 'S';
byte_1 = data_1_H8;
byte_2 = data_1_L8;
byte_3 = data_2_H8;
byte_4 = data_2_L8;
byte_5 = data_3_H8;
byte_6 = data_3_L8;
byte_7 = ( byte_1 + byte_2 + byte_3 + byte_4 + byte_5 + byte_6 ) % 256;
byte_8 = '\r';
byte_9 = '\n';
連接方式:
1。接收端:就是藍牙透過 rs232 轉 usb 連接到電腦
發送端:單晶片透過 UART 連接藍牙
2。也可以單片機透過 rs232 轉 usb 直接連接到電腦
單片機方面的代碼
void Serial_sendDataMATLAB( int16_t *sendData )
{
uint8_t tmpData = {0};
uint8_t dataLen = 10;
uint8_t *ptrData = tmpData;
tmpData= 'S';
tmpData= Byte8H(sendData);
tmpData= Byte8L(sendData);
tmpData= Byte8H(sendData);
tmpData= Byte8L(sendData);
tmpData= Byte8H(sendData);
tmpData= Byte8L(sendData);
tmpData= (tmpData + tmpData + tmpData + tmpData + tmpData + tmpData) % 256;
tmpData= '\r';
tmpData= '\n';
do {
Bluetooth_SendByte(*ptrData++);
} while(--dataLen);
}
int main( void )
{
int16_t IMU_Buf = {0};
int16_t accData = {0};
IMU_Init();
Bluetooth_Init();
while(1) {
MPU9255_GetData(IMU_Buf);
accData = IMU_Buf;
accData = IMU_Buf;
accData = IMU_Buf;
Serial_sendDataMATLAB(accData);
Delay_1ms(4);
}
}
MATLAB 方面的代碼
close all
clear all
% ******************************
% **** set parameters
comPort = 'COM3';
y_axisMax =2000; % int8_t range
y_axisMin = -2000; % int8_t range
window_width = 800;
% ******************************
% Serial config
s = serial(comPort, 'BaudRate', 115200, 'DataBits', 8, 'StopBits', 1, 'Parity', 'none', 'FlowControl', 'none');
s.ReadAsyncMode = 'continuous';
fopen(s);
fig = figure(1);
% Init data
window_w = window_width;
window = window_w * (-0.75);% 3/4 window
runtimes = 0;
recvData = 0;
signal = plot(runtimes, recvData);
axis();
xlabel('time');
ylabel('data');
grid on;
hold on;
state = 0;
%for i = 1 : 150
while ishandle(fig)
n_bytes = get(s, 'BytesAvailable');
if n_bytes == 0
n_bytes = 20;
end
recvData = fread(s, n_bytes, 'uint8');
data_S = find(recvData == 83);
dataNum = size(data_S, 1);
if dataNum >= 1
i = 1;
while (i) & (dataNum >= 1)
if (n_bytes - data_S(dataNum)) < 10
dataNum = dataNum - 1;
else
i = 0;
end
end
end
if dataNum >= 1
count = 0;
for i = 1 : dataNum
if (recvData(data_S(i) + 8) == 13) & (recvData(data_S(i) + 9) == 10)
check = sum(recvData(data_S(i) + 1 : data_S(i) + 6));
if rem(check, 256) == recvData(data_S(i) + 7)
count = count + 1;
runtimes(runtimes(end) + 1) = runtimes(end) + 1;
Acc(:, runtimes(end)) = [ unsigned2signed(recvData(data_S(i) + 1) * 2^8 + recvData(data_S(i) + 2)); ...
unsigned2signed(recvData(data_S(i) + 3) * 2^8 + recvData(data_S(i) + 4)); ...
unsigned2signed(recvData(data_S(i) + 5) * 2^8 + recvData(data_S(i) + 6)); ];
state = 1;
end
end
end
if state == 1
%
% set(signal, 'xdata', runtimes, 'ydata', Acc(1, :));
plot(runtimes, Acc(1, :), 'r', runtimes, Acc(2, :), 'g', runtimes, Acc(3, :), 'b');
% plot(runtimes(runtimes(end) - count + 1 : end), Acc(1, runtimes(end) - count + 1 : end), 'b');
window = window + count;
axis();
drawnow
state = 0;
%
% sprintf('Acc.X = %d mg, Acc.Y = %d mg, Acc.Z = %d mg, runtimes = %d', Acc(1, end), Acc(2, end), Acc(3, end), runtimes(end))
end
end
end
fclose(s);
delete(s);
楼主又出东西! 另外方想一下使用 matlab 製作 gif 的方法,做簡單的展示還蠻方便的
function getGIF( filename, frames, rgbColors, dt )
for i = 1 : size(frames, 2)
image = frame2im(frames(i));
= rgb2ind(image, rgbColors);
if i == 1
imwrite(im, map, filename, 'gif', 'writeMode', 'overWrite', 'delayTime', dt, 'loopcount',inf);
else
imwrite(im, map, filename, 'gif', 'writeMode', 'append', 'delayTime', dt);
end
end
end
load('data.mat');
dataLens = size(data, 2);
runtimes = ;
y_axisMax =3000; % int8_t range
y_axisMin = -2000; % int8_t range
window_width = 800;
window_w = window_width;
window = window_w * (-0.75);% 3/4 window
fig1 = figure(1);
set(fig1, 'Position', , 'color', 'w');
xlabel('x(m)');
ylabel('y(m)');
hold on
grid on
count = 0;
step = 100;
for i = 1 : step : dataLens
count = count + 1;
plot(runtimes(1:i), data(1, 1:i), 'r');
plot(runtimes(1:i), data(2, 1:i), 'g');
plot(runtimes(1:i), data(3, 1:i), 'b');
legend('acc.c', 'acc.y', 'acc.z');
window = window + step;
axis();
frames(count) = getframe(1, );
end
dt = 0.2;
filename = 'serial data - acc.gif';
getGIF(filename, frames, 128, dt); 楼主好人多少年了,真好人 不错。谢谢楼主分享。 不错,果断收藏 会Matlab的是真高手啊 台湾小哥的东西总是很棒! mark matlab串口 非常好啊~~~~要研究研究 lxl_lw 发表于 2015-7-14 01:31
楼主好人多少年了,真好人
藏著也不會變黃金,不如分享出來,方便實驗調適與後續分析:) 補充一下,程式也可以在我自己的 github 下載,有更新應該也會直接放在上面。
https://github.com/Hom-Wang/MATLAB 这个真不错,谢谢楼主 感谢lz分享@!!! 在你的帖子中学到很多东西、谢谢、、、 做的真不错,谢谢分享 楼主威武,谢谢分享! 打一个广告。
Matlab2015A百度网盘分享(Win64版,有crack)
http://www.amobbs.com/thread-5625085-1-1.html mark john800422 发表于 2015-7-14 23:13
補充一下,程式也可以在我自己的 github 下載,有更新應該也會直接放在上面。
https://github.com/Hom-Wang ...
一直fork你的资料{:lol:} 楼主太强大。这个不错哦。 与其说是示波器,还不如说是数据记录仪。主要是带宽太窄,大多数情况下无法分析波形的,用在慢速数据记录(如温度检测)还不错。 牛好人 楼主真强。
学习学习 这个厉害。matlab示波器 不错不错,一看就懂,感谢分享,以后肯定能用的上,用来演示效果估计很不错 楼主不错额,感谢 楼主做的不错,记录数据,显示波形,简单易用! 感谢楼主分享,从楼主的帖子中学到了很多。 串口调试,很好用,谢谢! mark一下 涨见识呀
楼主你好,请问MATLAB方便从以太网卡读数据吗,如果大量数据通过以太网从设备传到7C机上。 谢谢楼主分享。 厉害厉害 现在,这东西很少的 感谢分享,学习一下~~~~~~~~~~~ matlab可以实时显示串口数据的波形吗?之前我都是采集一段时间再显示的 这个确实漂亮 能不能多搞几个数据? 跟楼主学习 MATLAB 。 用来做串口i调试很棒,谢谢了
楼主不错额,感谢 有意思,谢谢分享 不错,攒下 楼主真是厉害,6的飞起 感谢大佬分享 不错,谢谢楼主分享 好东西,多谢楼主分享 感谢大佬分享
好东西,多谢楼主分享
页:
[1]