一、問題描述
工作需要,上面知我曾經有接觸matlab ,又因這兒的學生寫演算法時都以單機版去測試,
所以學生寫好的小小演算法轉成正式版時,往往效能結果與學生所告知的結果有很大的出入,
只好請我把設備改寫成matlab 版本,讓學生在寫演算法時可以以實際所接收到的資料去做測試,
讓落差不會那麼的大.......
然而,網路查詢了一下,
matlab 接收bluetooth資料的資訊,許多人都用建議要安裝LEGO MINDSTORMS NXT (NXT toolbox) ,
但好像又與我的需求不太相同,
因為我並沒有使用LEGO的設備 !!!
後來,好在ptt 有好心人提供了另一個方案,
讓我知道並非一定要用NXT toolbox 才能接收藍芽資料,
替代方案:好心人士之前是採取直接連藍芽的模式,然後使用COM Port來抓訊號
有了此資訊,就開始往此方面再去研究研究藍芽連接的方式囉~
----------------------------------------------------------------------
需求:透過一手邊的藍芽設備會丟出一些訊號,
希望能透過matlab來接收此訊號,
然後再做一些後續的訊號處理與呈現。
----------------------------------------------------------------------
二、方法
1. 先新增設備與設定藍芽裝置的連接埠
a. window-->裝置及印表機-->Bluetoothe裝置
b. 新增裝置對話視窗-->win7會自動搜尋目前可使用新增的裝置名稱-->下一步
c. 新增裝置對話視窗-->win7提供幾種配對的選項供選擇-->需依個人選求去點選
在此,因為我所使用到的藍芽裝置需要key(硬體才會認得要開始作用),
所以我選擇第二個選項『輸入裝置的配對碼』-->『0000』-->下一步。
d. win7會自動幫您安裝裝置驅動程式軟體-->若成功後,也會顯示『此裝置已成功新增至此部電腦』之訊息。
e. 確認裝置已安裝,並查看其連接埠號,以供後續matlab使用。
2. matlab 程式:
clear;
clear all;
close all;
% assigns the object s to serial port
s = serial('COM4');
s.BaudRate = 9600; % set(s, 'BaudRate', 9600);
s.Parity = 'none'; % set(s, 'Parity', 'none');
s.DataBits = 8; % set(s, 'DataBits', 8);
s.StopBit = 1; % set(s, 'StopBit', 1);
s.Timeout = 10;
try
% 取得連線
fopen(s);
% 此部份需依設備而去設定,因為我所使用到的藍芽設備需先送出一些參數值,
並計算才能知道最後要送出的開始指令為何。
藍芽設備也要正確的接收到開始指令,才有法度運作與回傳資料~
% startCmd = [254 7 9 20 255 0 5]; % 0xFE 0x07 0x09 0x14 0xFF];
startCmd = [254 7 s_cmd1 s_cmd2 255 0 5];
% 下start指令
fwrite(s, startCmd, 'uint8');
while (true)
data_packet = fread(s, DataPacketBytes); %DataPacketBytes一切要接收的位元大小
% read bluetooth data
s_data =......
end
% disp(sprintf('%d', s_data_packet(1,1)));
disp(sprintf(test_string, s_data));
catch exception
h = msgbox('Connect error~', 'Error', 'error');
close all;
end
三、問題
1. 需了解自己的藍芽設備要如何正確的給予指令,才能如期的接收到訊號。
2. 有些設備接收到的訊號是他人無法直接解讀的,需要有額外的說明文件來進一步的了解藍芽封包所真正代表的意思。
3. Matlab 感覺在藍芽連線上並不是很人性化,因為常常資源被綁著!
使用fclose(s) 、fclose(all)...有時並無法解決。
需把Matlab 整個關掉再重新啟動才能再接收到資料,或亦關掉藍芽設備重開。
以上並沒有找到可行正確的解決方案,僅能先以簡陋的方式先處理。
(若有哪位大大找到解決方案,歡迎討論囉~)
留言列表