|
本帖最后由 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[12] = {0};
- uint8_t dataLen = 10;
- uint8_t *ptrData = tmpData;
- tmpData[0] = 'S';
- tmpData[1] = Byte8H(sendData[0]);
- tmpData[2] = Byte8L(sendData[0]);
- tmpData[3] = Byte8H(sendData[1]);
- tmpData[4] = Byte8L(sendData[1]);
- tmpData[5] = Byte8H(sendData[2]);
- tmpData[6] = Byte8L(sendData[2]);
- tmpData[7] = (tmpData[1] + tmpData[2] + tmpData[3] + tmpData[4] + tmpData[5] + tmpData[6]) % 256;
- tmpData[8] = '\r';
- tmpData[9] = '\n';
- do {
- Bluetooth_SendByte(*ptrData++);
- } while(--dataLen);
- }
- int main( void )
- {
- int16_t IMU_Buf[8] = {0};
- int16_t accData[3] = {0};
- IMU_Init();
- Bluetooth_Init();
- while(1) {
- MPU9255_GetData(IMU_Buf);
- accData[0] = IMU_Buf[0];
- accData[1] = IMU_Buf[1];
- accData[2] = IMU_Buf[2];
- 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([window, window + window_w, y_axisMin, y_axisMax]);
- 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([window, window + window_w, y_axisMin, y_axisMax]);
- 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);
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|