john800422 发表于 2015-7-13 23:50:16

分享一個自己寫的 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);


Shaopus 发表于 2015-7-14 00:02:35

楼主又出东西!

john800422 发表于 2015-7-14 00:57:33

另外方想一下使用 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);

lxl_lw 发表于 2015-7-14 01:31:58

楼主好人多少年了,真好人

lans0625 发表于 2015-7-14 07:55:20

不错。谢谢楼主分享。

ztlaputa 发表于 2015-7-14 08:08:30

不错,果断收藏

374184600 发表于 2015-7-14 10:18:38

会Matlab的是真高手啊

Ronald 发表于 2015-7-14 12:41:36

台湾小哥的东西总是很棒!

277955973 发表于 2015-7-14 13:01:47

mark matlab串口

zhanyanqiang 发表于 2015-7-14 13:04:16

非常好啊~~~~要研究研究

john800422 发表于 2015-7-14 13:19:01

lxl_lw 发表于 2015-7-14 01:31
楼主好人多少年了,真好人

藏著也不會變黃金,不如分享出來,方便實驗調適與後續分析:)

john800422 发表于 2015-7-14 23:13:56

補充一下,程式也可以在我自己的 github 下載,有更新應該也會直接放在上面。
https://github.com/Hom-Wang/MATLAB

xiangbin099 发表于 2015-7-18 16:35:57

这个真不错,谢谢楼主

gaojunchen 发表于 2015-7-19 10:57:51

感谢lz分享@!!!

destiny、 发表于 2015-8-29 11:08:58

在你的帖子中学到很多东西、谢谢、、、

chinazhaoyl 发表于 2015-8-30 00:17:49

做的真不错,谢谢分享

PANGKUN 发表于 2015-8-31 07:58:59

楼主威武,谢谢分享!

lans0625 发表于 2015-8-31 08:18:39

打一个广告。

Matlab2015A百度网盘分享(Win64版,有crack)
http://www.amobbs.com/thread-5625085-1-1.html

00superman00 发表于 2015-8-31 08:20:20

mark            

RudeBoy 发表于 2015-8-31 08:24:26

john800422 发表于 2015-7-14 23:13
補充一下,程式也可以在我自己的 github 下載,有更新應該也會直接放在上面。
https://github.com/Hom-Wang ...

一直fork你的资料{:lol:}

dongwang_fl 发表于 2015-8-31 08:30:46

楼主太强大。这个不错哦。

wiser803 发表于 2015-8-31 08:44:04

与其说是示波器,还不如说是数据记录仪。主要是带宽太窄,大多数情况下无法分析波形的,用在慢速数据记录(如温度检测)还不错。

gongshu 发表于 2015-8-31 09:11:56

牛好人

xingjianpeng 发表于 2015-8-31 11:07:23

楼主真强。
学习学习

天下乌鸦一般黑 发表于 2015-9-1 23:07:10

这个厉害。matlab示波器

prow 发表于 2015-9-2 20:55:50

不错不错,一看就懂,感谢分享,以后肯定能用的上,用来演示效果估计很不错

qwert1213131 发表于 2015-9-2 21:56:04

楼主不错额,感谢

TongIC 发表于 2015-9-2 22:45:13

楼主做的不错,记录数据,显示波形,简单易用!

talkingbeast 发表于 2015-9-2 23:34:34

感谢楼主分享,从楼主的帖子中学到了很多。

li99932li 发表于 2015-12-18 08:22:15

串口调试,很好用,谢谢!

308594151 发表于 2015-12-18 09:02:03

mark一下

hnyyuem 发表于 2015-12-18 09:13:38

涨见识呀

xuyapple 发表于 2016-3-29 23:20:25

楼主你好,请问MATLAB方便从以太网卡读数据吗,如果大量数据通过以太网从设备传到7C机上。

戴风海 发表于 2016-4-3 20:06:58

谢谢楼主分享。

qianshan 发表于 2016-4-3 20:41:45

厉害厉害

yick 发表于 2016-4-3 20:47:39

现在,这东西很少的

jacktau 发表于 2017-10-28 20:31:29

感谢分享,学习一下~~~~~~~~~~~

study_hardware 发表于 2017-10-28 21:30:54

matlab可以实时显示串口数据的波形吗?之前我都是采集一段时间再显示的

RudeBoy 发表于 2017-11-14 14:44:44

这个确实漂亮

RudeBoy 发表于 2017-11-14 14:46:31

能不能多搞几个数据?

imliyucai 发表于 2017-11-15 15:34:52

跟楼主学习 MATLAB 。

lhj200304 发表于 2018-7-15 23:32:44

用来做串口i调试很棒,谢谢了

huke08@126.com 发表于 2018-7-16 08:31:43


楼主不错额,感谢

fromdream 发表于 2018-7-17 15:17:00

有意思,谢谢分享

yanjian305 发表于 2018-7-18 17:16:29

不错,攒下

CNGK 发表于 2018-7-19 08:32:07

楼主真是厉害,6的飞起

578243539 发表于 2018-7-23 15:05:06

感谢大佬分享

608工作室 发表于 2018-7-26 08:53:05

不错,谢谢楼主分享

clqfly 发表于 2018-7-26 09:09:20

好东西,多谢楼主分享

yangxilanmcu 发表于 2018-8-11 13:34:59

感谢大佬分享

yangxilanmcu 发表于 2018-8-11 13:35:58


好东西,多谢楼主分享
页: [1]
查看完整版本: 分享一個自己寫的 MATLAB 串口示波器, 可直接透過藍牙連接