日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

matlab中instr,MATLAB 串口通信

發布時間:2024/9/27 循环神经网络 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 matlab中instr,MATLAB 串口通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

matlab 串口編程

由于項目需要,用matlab 做了一個串口通信工具,也碰到不少坑。這里總結一下。

讀取串口數據

matlab 支持串口通信,因此直接調用串口的結構體serial就可以,在調用之前,需要對串口屬性進行設置。

delete(instrfindall) %%關閉沒用的,這句很重要

s=serial('COM5');%創建串口

set(s,'BauRate',115200); %設置波特率

set(s,'inputBufferSize',1024000) %設置輸入緩沖區域為1M

%串口事件回調設置

set(s,'BytesAvailabelFcnMode','bytes');%設置中斷響應函數對象

set(s,'BytesAvailabelFcnCount',10);%設置終端觸發方式

s.BytesAvailabelFcn=@ReceiveCallback;%ReceiveCallback是中斷的觸發函數,這里我是自定義的。系統的回調函數為instrcallback;

fopen(s);%打開串口

%data=fread(s)%讀取二進制字節 fwrite二進制寫入 相應文本用fscanf 和fpintf

%data %進行數據處理

%fclose(s);

%delete(s);

%clear s;

以上的代碼是MATLAB 串口讀取的基本函數,對串口操作的整個過程可以概括為:“設置串口參數”->"打開串口“->"讀取串口數據”->“關閉串口”。

串口通信方式選擇

serial 中斷方式參數為BytesAvailabelFcnMode,它的方式有Terminator 和bytes 兩種。Terminator 為查詢方式中斷方式。其值有“LR(換行符)” 和“CR(回車符)” 兩種。

查詢方式中斷

查詢方式中斷方式為Terminator,值有CR和LF兩個。查詢中斷的含義是在緩存區讀取數據,當讀取到存在CR和LF之后,觸發中斷,調用回調函數。查詢中斷簡單但不適用。具體例子可以看http://blog.sina.com.cn/s/blog_6163bdeb0102e8qc.html

set(s,'BytesAvailabelFcnMode','Termiator');% 查詢中斷

set(s,'Terminator','CR');%設置中斷方式

基于matlab 方式實時串行通信編程

matlab更多的采用的事事件驅動方法中斷。中斷參數為"bytes"。即按字節中斷。如設定緩存區域達到10個字節,就觸發中斷,調用回調函數,進行處理。

set(s,'BytesAvailabelFcnMode','bytes');%設置中斷響應函數對象

set(s,'BytesAvailabelFcnCount',10);%設置終端觸發方式

s.BytesAvailabelFcn=@ReceiveCallback;

我們可以對系統的instrcallback 函數進行修改調用系統的回調函數,但是系統的回調函數matlab 安裝包下,可以右鍵打開,或者直接用which 命令查找它的位置,另外我們也可以自己寫相應的回掉函數。比如我這里自己定義回調函數ReceiceCallback。

function ReceiveCallback( obj,event) %創建中斷響應函數

global s a fid;

str = fread(s);%讀取數據

% hex=dec2hex(str)

a=[];IMU_data = [];Motion_data=[];

sign_head1=hex2dec('A5');sign_head2 = hex2dec('5A');

sign_finish=hex2dec('AA');sign_IMU=hex2dec('A1');sign_Motion=hex2dec('A2');

a= [a;str];

j=1;

while (~isempty(a))

if j>size(a,1)

break;

end

if a(j)==sign_head1 && a(j+1) == sign_head2

if (j+a(j+2)+1) > size(a,1)

break;

end

index_start = j+2;

index_finish= index_start + a(j+2)-1;

pack = a(index_start:index_finish);

if ~isempty(pack) &&pack(pack(1))== sign_finish

if pack(2) == sign_IMU

IMU_data(1,:) = Get_IMU(pack);

j = index_finish;

continue;

end

if pack(2) ==sign_Motion

Motion_data(1,:) = Get_Motion(pack);

j = index_finish;

end

if ~isempty(IMU_data) && ~isempty(Motion_data)

act_data = [IMU_data,Motion_data]

fprintf(fid,'%8.1f%8.1f%8.1f%8.1f%8.1f%8.1f%8d%8d%8d%8d%8d%8d%8d%8d%8d\n',act_data);

Motion_data=[];IMU_data=[];

a(1:index_finish)=[];

j=1;

end

end

else

j=j+1;

end

end

end

回調函數包含兩個參數,這個必須要,不能少。其中obj 是傳遞串口參數的。event暫時沒用到。這里回調函數是從還從去讀取二進制數據。然后解算出姿態傳感器的姿態數據和傳感器數據。并且存到txt中。姿態上報數據格式為A5 5A 開頭,第三位為傳遞數據位(不包含A55A),第四位為A1/A2,A1。A1 表示的是姿態數據,A2表示傳感器數據。數據以AA結尾。因此算法的思路是每次有姿態數據和傳感器數據然后就保存到文本中。

代碼已上傳到我的github

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的matlab中instr,MATLAB 串口通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。