amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 4936|回复: 50

分享一個自己寫的 MATLAB 串口示波器, 可直接透過藍牙連接

  [复制链接]
发表于 2015-7-13 23:50:16 | 显示全部楼层 |阅读模式
本帖最后由 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 直接連接到電腦




單片機方面的代碼

  1. void Serial_sendDataMATLAB( int16_t *sendData )
  2. {
  3.   uint8_t tmpData[12] = {0};
  4.   uint8_t dataLen = 10;
  5.   uint8_t *ptrData = tmpData;

  6.   tmpData[0]  = 'S';
  7.   tmpData[1]  = Byte8H(sendData[0]);
  8.   tmpData[2]  = Byte8L(sendData[0]);
  9.   tmpData[3]  = Byte8H(sendData[1]);
  10.   tmpData[4]  = Byte8L(sendData[1]);
  11.   tmpData[5]  = Byte8H(sendData[2]);
  12.   tmpData[6]  = Byte8L(sendData[2]);
  13.   tmpData[7]  = (tmpData[1] + tmpData[2] + tmpData[3] + tmpData[4] + tmpData[5] + tmpData[6]) % 256;
  14.   tmpData[8]  = '\r';
  15.   tmpData[9]  = '\n';

  16.   do {
  17.     Bluetooth_SendByte(*ptrData++);
  18.   } while(--dataLen);
  19. }

  20. int main( void )
  21. {
  22.   int16_t IMU_Buf[8] = {0};
  23.   int16_t accData[3] = {0};

  24.   IMU_Init();
  25.   Bluetooth_Init();

  26.   while(1) {
  27.     MPU9255_GetData(IMU_Buf);
  28.     accData[0] = IMU_Buf[0];
  29.     accData[1] = IMU_Buf[1];
  30.     accData[2] = IMU_Buf[2];
  31.     Serial_sendDataMATLAB(accData);
  32.     Delay_1ms(4);
  33.   }
  34. }
复制代码



MATLAB 方面的代碼
  1. close all
  2. clear all

  3. % ******************************
  4. % **** set parameters
  5. comPort = 'COM3';
  6. y_axisMax =  2000;   % int8_t range
  7. y_axisMin = -2000;   % int8_t range
  8. window_width = 800;
  9. % ******************************

  10. % Serial config
  11. s = serial(comPort, 'BaudRate', 115200, 'DataBits', 8, 'StopBits', 1, 'Parity', 'none', 'FlowControl', 'none');
  12. s.ReadAsyncMode = 'continuous';
  13. fopen(s);

  14. fig = figure(1);

  15. % Init data
  16. window_w = window_width;
  17. window = window_w * (-0.75);  % 3/4 window

  18. runtimes = 0;
  19. recvData = 0;
  20. signal = plot(runtimes, recvData);
  21. axis([window, window + window_w, y_axisMin, y_axisMax]);
  22. xlabel('time');
  23. ylabel('data');
  24. grid on;
  25. hold on;

  26. state = 0;
  27. %for i = 1 : 150
  28. while ishandle(fig)
  29.     n_bytes = get(s, 'BytesAvailable');
  30.     if n_bytes == 0
  31.         n_bytes = 20;
  32.     end
  33.     recvData = fread(s, n_bytes, 'uint8');
  34.     data_S = find(recvData == 83);

  35.     dataNum = size(data_S, 1);
  36.     if dataNum >= 1
  37.         i = 1;
  38.         while (i) & (dataNum >= 1)
  39.             if (n_bytes - data_S(dataNum)) < 10
  40.                 dataNum = dataNum - 1;
  41.             else
  42.                 i = 0;
  43.             end
  44.         end
  45.     end
  46.    
  47.     if dataNum >= 1
  48.         count = 0;
  49.         for i = 1 : dataNum
  50.             if (recvData(data_S(i) + 8) == 13) & (recvData(data_S(i) + 9) == 10)
  51.                 check = sum(recvData(data_S(i) + 1 : data_S(i) + 6));
  52.                 if rem(check, 256) == recvData(data_S(i) + 7)
  53.                     count = count + 1;
  54.                     runtimes(runtimes(end) + 1) = runtimes(end) + 1;
  55.                     Acc(:, runtimes(end)) = [ unsigned2signed(recvData(data_S(i) + 1) * 2^8 + recvData(data_S(i) + 2)); ...
  56.                                               unsigned2signed(recvData(data_S(i) + 3) * 2^8 + recvData(data_S(i) + 4)); ...
  57.                                               unsigned2signed(recvData(data_S(i) + 5) * 2^8 + recvData(data_S(i) + 6)); ];
  58.                     state = 1;
  59.                 end
  60.             end
  61.         end

  62.         if state == 1
  63. %
  64. %            set(signal, 'xdata', runtimes, 'ydata', Acc(1, :));
  65.             plot(runtimes, Acc(1, :), 'r', runtimes, Acc(2, :), 'g', runtimes, Acc(3, :), 'b');
  66. %            plot(runtimes(runtimes(end) - count + 1 : end), Acc(1, runtimes(end) - count + 1 : end), 'b');
  67.             window = window + count;
  68.             axis([window, window + window_w, y_axisMin, y_axisMax]);
  69.             drawnow
  70.             state = 0;
  71. %
  72. %            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))
  73.         end
  74.     end
  75. end

  76. fclose(s);
  77. delete(s);
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2015-7-14 00:02:35 | 显示全部楼层
楼主又出东西!
 楼主| 发表于 2015-7-14 00:57:33 | 显示全部楼层
另外方想一下使用 matlab 製作 gif 的方法,做簡單的展示還蠻方便的


  1. function getGIF( filename, frames, rgbColors, dt )

  2.     for i = 1 : size(frames, 2)
  3.         image = frame2im(frames(i));
  4.         [im, map] = rgb2ind(image, rgbColors);
  5.         if i == 1
  6.             imwrite(im, map, filename, 'gif', 'writeMode', 'overWrite', 'delayTime', dt, 'loopcount',inf);
  7.         else
  8.             imwrite(im, map, filename, 'gif', 'writeMode', 'append', 'delayTime', dt);
  9.         end
  10.     end

  11. end
复制代码

  1. load('data.mat');
  2. dataLens = size(data, 2);
  3. runtimes = [1 : dataLens];

  4. y_axisMax =  3000;   % int8_t range
  5. y_axisMin = -2000;   % int8_t range
  6. window_width = 800;
  7. window_w = window_width;
  8. window = window_w * (-0.75);  % 3/4 window

  9. fig1 = figure(1);
  10. set(fig1, 'Position', [400, 100, 1200, 700], 'color', 'w');
  11. xlabel('x(m)');
  12. ylabel('y(m)');
  13. hold on
  14. grid on

  15. count = 0;
  16. step = 100;
  17. for i = 1 : step : dataLens

  18.     count = count + 1;
  19.     plot(runtimes(1:i), data(1, 1:i), 'r');
  20.     plot(runtimes(1:i), data(2, 1:i), 'g');
  21.     plot(runtimes(1:i), data(3, 1:i), 'b');

  22.     legend('acc.c', 'acc.y', 'acc.z');
  23.     window = window + step;
  24.     axis([window, window + window_w, y_axisMin, y_axisMax]);

  25.     frames(count) = getframe(1, [70, 20, 1100, 650]);

  26. end

  27. dt = 0.2;
  28. filename = 'serial data - acc.gif';
  29. getGIF(filename, frames, 128, dt);
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2015-7-14 01:31:58 来自手机 | 显示全部楼层
楼主好人多少年了,真好人
发表于 2015-7-14 07:55:20 | 显示全部楼层
不错。谢谢楼主分享。
发表于 2015-7-14 08:08:30 | 显示全部楼层
不错,果断收藏
发表于 2015-7-14 10:18:38 | 显示全部楼层
会Matlab的是真高手啊
发表于 2015-7-14 12:41:36 | 显示全部楼层
台湾小哥的东西总是很棒!
发表于 2015-7-14 13:01:47 | 显示全部楼层
mark matlab串口
发表于 2015-7-14 13:04:16 | 显示全部楼层
非常好啊~~~~要研究研究
 楼主| 发表于 2015-7-14 13:19:01 | 显示全部楼层
lxl_lw 发表于 2015-7-14 01:31
楼主好人多少年了,真好人

藏著也不會變黃金,不如分享出來,方便實驗調適與後續分析:)
 楼主| 发表于 2015-7-14 23:13:56 | 显示全部楼层
補充一下,程式也可以在我自己的 github 下載,有更新應該也會直接放在上面。
https://github.com/Hom-Wang/MATLAB
发表于 2015-7-18 16:35:57 | 显示全部楼层
这个真不错,谢谢楼主
发表于 2015-7-19 10:57:51 | 显示全部楼层
感谢lz分享@!!!
发表于 2015-8-29 11:08:58 | 显示全部楼层
在你的帖子中学到很多东西、谢谢、、、
发表于 2015-8-30 00:17:49 来自手机 | 显示全部楼层
做的真不错,谢谢分享
发表于 2015-8-31 07:58:59 来自手机 | 显示全部楼层
楼主威武,谢谢分享!
发表于 2015-8-31 08:18:39 | 显示全部楼层
打一个广告。

Matlab2015A百度网盘分享(Win64版,有crack)
http://www.amobbs.com/thread-5625085-1-1.html
发表于 2015-8-31 08:20:20 | 显示全部楼层
mark            
发表于 2015-8-31 08:24:26 | 显示全部楼层
john800422 发表于 2015-7-14 23:13
補充一下,程式也可以在我自己的 github 下載,有更新應該也會直接放在上面。
https://github.com/Hom-Wang ...

一直fork你的资料
发表于 2015-8-31 08:30:46 | 显示全部楼层
楼主太强大。这个不错哦。
发表于 2015-8-31 08:44:04 来自手机 | 显示全部楼层
与其说是示波器,还不如说是数据记录仪。主要是带宽太窄,大多数情况下无法分析波形的,用在慢速数据记录(如温度检测)还不错。
发表于 2015-8-31 09:11:56 | 显示全部楼层
牛  好人
发表于 2015-8-31 11:07:23 | 显示全部楼层
楼主真强。
学习学习
发表于 2015-9-1 23:07:10 | 显示全部楼层
这个厉害。matlab示波器
发表于 2015-9-2 20:55:50 | 显示全部楼层
不错不错,一看就懂,感谢分享,以后肯定能用的上,用来演示效果估计很不错
发表于 2015-9-2 21:56:04 | 显示全部楼层
楼主不错额,感谢
发表于 2015-9-2 22:45:13 | 显示全部楼层
楼主做的不错,记录数据,显示波形,简单易用!
发表于 2015-9-2 23:34:34 | 显示全部楼层
  感谢楼主分享,从楼主的帖子中学到了很多。
发表于 2015-12-18 08:22:15 | 显示全部楼层
串口调试,很好用,谢谢!
发表于 2015-12-18 09:02:03 | 显示全部楼层
mark一下
发表于 2015-12-18 09:13:38 | 显示全部楼层
涨见识呀
发表于 2016-3-29 23:20:25 | 显示全部楼层
楼主你好,请问MATLAB方便从以太网卡读数据吗,如果大量数据通过以太网从设备传到7C机上。
发表于 2016-4-3 20:06:58 | 显示全部楼层
谢谢楼主分享。
发表于 2016-4-3 20:41:45 | 显示全部楼层
厉害厉害
发表于 2016-4-3 20:47:39 | 显示全部楼层
现在,这东西很少的
发表于 2017-10-28 20:31:29 | 显示全部楼层
感谢分享,学习一下~~~~~~~~~~~
发表于 2017-10-28 21:30:54 | 显示全部楼层
matlab可以实时显示串口数据的波形吗?之前我都是采集一段时间再显示的
发表于 2017-11-14 14:44:44 | 显示全部楼层
这个确实漂亮
发表于 2017-11-14 14:46:31 | 显示全部楼层
能不能多搞几个数据?
发表于 2017-11-15 15:34:52 | 显示全部楼层
跟楼主学习 MATLAB 。
发表于 2018-7-15 23:32:44 | 显示全部楼层
用来做串口i调试很棒,谢谢了
发表于 2018-7-16 08:31:43 | 显示全部楼层

楼主不错额,感谢
发表于 2018-7-17 15:17:00 | 显示全部楼层
有意思,谢谢分享
发表于 2018-7-18 17:16:29 | 显示全部楼层
不错,攒下
发表于 2018-7-19 08:32:07 | 显示全部楼层
楼主真是厉害,6的飞起
发表于 2018-7-23 15:05:06 | 显示全部楼层
感谢大佬分享
发表于 2018-7-26 08:53:05 | 显示全部楼层
不错,谢谢楼主分享
发表于 2018-7-26 09:09:20 | 显示全部楼层
好东西,多谢楼主分享
发表于 2018-8-11 13:34:59 | 显示全部楼层
感谢大佬分享
发表于 2018-8-11 13:35:58 | 显示全部楼层

好东西,多谢楼主分享
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2018-12-16 15:10

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表