2016-09-16 16 views
0

私はシリアルポートを使ってArduinoマイクロコントローラに基づいてロボットを制御しようとしています。私はそれは文が動作しません%dは同等のfreadで動作するようにしようとすると、しかしMATLAB Arduinoとのシリアル通信、fwrite関数doesnt。 fprintfで動作します

clear; 
clc; 
s=serial ('COM19'); 
set(s,'BaudRate',115200); 
fopen(s); 
fprintf(s,'%d',0); 
fprintf(s,'%c',13); 
fprintf(s,'%d',256); 
fprintf(s,'%c',13); 
fprintf(s,'%d',512); 
fprintf(s,'%c',13); 
fprintf(s,'%d',1000); 
fprintf(s,'%c',13); 
fclose(s); 
delete(s); 

:ロボットは完全に罰金以下のコードで実行されます。しかし、fprintf(s、 '%c'、13)の代わりにfwrite(s、13、 'uchar')を使っても問題ありません。私は%dを(私は 'int'を試して)置き換えるデータ型と何が問題なのか理解していません。誰かが何か提案があれば大きな助けになるでしょう。あなたは

答えて

0

対象は、MATLABドキュメントで説明されてありがとう:
http://www.mathworks.com/help/matlab/matlab_external/writing-and-reading-data.html

のfprintfを - デバイスに
fwriteのテキストを書く - それはまた述べています

デバイスにバイナリデータを書き込みます。

デフォルトでは、fprintfはデータを書き込みますg%s \ n形式... ValuesSentプロパティ値には、デバイスに送信されたコマンドの\ nがTerminatorプロパティ値に置き換えられるたびに、ターミネータが含まれることに注意してください。

上記資料によれば、fprintfコマンドを使用して送信されたテキストの末尾に\nを付加します。値65(「A」のASCII値)を有する単一のバイトを送信
fwrite(s, 'A', 'uchar'):UINT8形式で\nはバイナリとテキストデータとの間の差の10

例に等しいです。
fprintf(s, "%c", 'A')は65 10(10はターミネータ)です。
fprintf(s,'%d',100);は、バイトを送信します。49 48 48 10(49はASCII値が '1')。
fwrite(s, 100, 'uchar'); 1バイトに等しい送信:あなたはArduinoのソフトウェアで1バイトを読み取るためSerial.read()を使用している場合は100

を、Arduinoのは、バイナリデータ形式を期待しています。
Matlabでfwriteコマンドを使用すると、バイナリデータを送信できます。
Arduino側では、255を超える整数値(例:uint16形式の2バイト)を送信するために、Arduinoソフトウェアは2バイトの受信を期待し、1つのuint16要素として処理する必要があります。

テキストデータ(Matlabでfprintfを使用)を使用したい場合は、Arduinoソフトウェアを修正してテキスト(ASCII)形式を読み取る必要があります。
参照:https://www.arduino.cc/en/Tutorial/ReadASCIIString

関連する問題