% 主要用到的命令及函數 % 所有注釋文字均為原創,用詞並非一定准確,僅供參考 % 沒有寫GUI的程序,若用VC或.NET寫串口通訊的界面程序,需要考慮到多線程任務的處理,比較復雜,因為MATLAB有中斷響應事件instrcallback,大大簡化了程序的編寫; % 設置串口號,字符串形式 strSerialPortNum = input('串口號(數字):'); strSerialPortName = ['COM',num2str(strSerialPortNum)]; % 設置串口參數 % 設置串口對象 s = serial(strSerialPortName); % 設置串口波特率(38400),校驗位(偶校驗) % 其他參數可查看MATLAB幫助文檔 set(s,'BaudRate',38400,'parity','even'); % 設置中斷反饋函數 set(s, 'BytesAvailableFcn', {'instrcallback'}); % 注意函數“instrcallback”的位置,比如我的是D:\Program Files\MATLAB\R2011b\toolbox\shared\instrument\@instrument\instrcallback.m,經驗證,把instrcallback.m復制到主程序目錄下並不產生作用,應該是只能修改安裝目錄下%toolbox\shared\instrument\@instrument\instrcallback.m的文件中的程序才有用。 % 設置中斷響應(有10個可用字節時,產生中斷) set(s, 'BytesAvailableFcnCount', 10); % 設置中斷響應模式(有“byte”和“Terminator”兩種模式可選,“byte”是達到一定字節數產生中斷,“Terminator”可用作鍵盤某個按鍵事件來產生中斷) set(s, 'BytesAvailableFcnMode', 'byte'); % 設置串口數據最大讀寫時間,如果超過這個時間,仍讀取不到數據,那么則終止讀寫 % 注:串口的一些參數必須在打開串口之前進行設置,即在串口狀態是“Close”的情況下來進行設置 set(s, 'TimeOut', 1); % 打開串口 fopen(s); % 向串口發送數據(這里發送一個大寫字母“S”,這是我的硬件數據通信握手指令;本來用fprintf(s,'S')命令發送,但是結果只產生一幀的數據,后來在中斷響應函數instrcallback中也加入fprintf(s,'S')命令來不斷的向硬件發送握手請求,但發現數據的傳輸速率慢了好幾倍,本來是硬件中設置的是發送一次“S”指令,即可不斷的產生數據,這樣數據傳輸速率基本能達到每9ms接收10KB的數據,而在上位機MATLAB中循環發送握手指令,數據傳輸速率慢且不穩定,平均25-40ms接收10KB的數據。查看MATLAB的幫助文檔,發現fprintf(s,'S')命令其實是向串口發送了“S\n”這樣的指令,所以才會出現只能接收一幀數據(我這里是10KB)的情況。我需要的是單發送字符“S”,需用fprintf(s,'%c','S')指令); fprintf(s,'%c','S');
% 逐幀讀取串口數據,這里一幀是10個字節,以2進制方式讀取,用uint8(8位無符號整型)參數; receiveData = fread(s,10,'uint8'); % 上面這句命令我是寫在中斷響應函數instrcallback中的,還有一些數據處理的代碼,有時間會詳細寫在以后的博文中;這句之后即可加上N多的數據處理代碼了(instrcallback函數的作用也在於此); % 關閉串口對象 fclose(s); % 刪除串口對象(並非必須) delete(s); % 清楚串口對象所占內存(並非必須) clear s;