MZ Platformとは › 掲示板 › MZプラットフォームユーザー会掲示板 › シリアル通信のバイトデータ受信について
タグ: シリアル通信 バイト データ
- このトピックは、 25 返信、 2 投稿者 です。最終更新日: 3 年, 11 ヶ月 前 MZPlatformユーザー会
-
著者投稿
-
2020年8月17日 at 4:44 PM #6141伊予研究会一般参加者
シリアル通信の送信についてご教示ください。
シリアル通信のメソッドでボードにバイト配列データを出力する(byte[])がありますが、例えば{‘X’, 0x12, 0x15}といった配列データを送る場合メソッド値の設定が分かりません。
byte[] = {‘X’, 0x12, 0x15}の設定は、バイト値格納変数をどのようにして配列にすればよいか、ご教示ください。2020年8月17日 at 6:01 PM #6142MZPlatformユーザー会サイト管理者ご質問の意図から少々外れてしまいますが、もし送信先がバイト配列でデータを受け取るときと、バイト値を連続で受け取るときで反応が同じであれば、バイト値を連続で送信する方が簡単です。つまり、メソッド「ポートにバイトデータを出力する(int)」を複数回呼ぶということです。このメソッドは引数がintなので、その変換だけは必要になります。
ここから本題ですが、バイト配列データを出力するメソッドは日本語化されていますが、そのバイト配列を作成するためのメソッドは日本語化されていません。全メソッド対象にするとお選びいただけます。メソッド「makePacketToSend(int)」でサイズを指定してバイト配列を作成します。このメソッド戻り値がバイト配列になっているので、この後でメソッド「ポートにバイト配列データを出力する(byte[])」の起動で引数にメソッド処理結果を渡します。また、出力する前に配列の中身を与えるメソッド「setPacketValueAt(int,int)」か「setPacketValueAt(int,String)」を必要回数実行します。最初の引数は配列のインデックスで、次の引数が値を指定します。値をintで指定する場合は、前述と同様です。値をStringで指定する場合は、16進数の文字列表現を与えます。例えば「02」や「A0」など2文字の16進数文字列を指定すると、内部で変換して配列に入れてくれます。
わかりにくいと思いますので、ご不明な点があれば再度お問い合わせください。
2020年8月18日 at 9:58 AM #6144伊予研究会一般参加者ご回答ありがとうございました。
ご教示頂いた通り、setPacketValueAt(int,int), setPacketValueAt(int,String)両方で試したところできました。ところで、setPacketValueAtは数値でしかセットすることができません。できましたら先頭に’X’の文字も配列に入れて1回で送信したいのですが、何か良い手段はございますでしょうか。
受け側ではキャラクターコードで判断できるので、Mz側でキャラクターコードにする方法がありましたらご教示ください。よろしくお願いいたします。
2020年8月18日 at 12:50 PM #6145MZPlatformユーザー会サイト管理者残念ながら、現状は文字による値指定ができません。今後の機能追加を検討します。
現状は文字コード表で対応する整数を指定をするしかないので、大文字のXであれば88になるかと思います。
2020年8月18日 at 1:04 PM #6146伊予研究会一般参加者ご連絡ありがとうございました。とりあえず、コードにして送ることにします。
機能追加の検討、よろしくお願いします。2020年8月18日 at 3:42 PM #6147伊予研究会一般参加者とりあえず文字コードをスクリプトで対応させましたので、ファイルを添付します。受け側のArduinoのスケッチは、正しく送られてきたらLEDを点灯するようにして確認しました。
今回、スクリプトは char c = moji; として moji を ‘X’ に入れ替えていますが、直接char c = ‘moji’; として X に入れ替えることができればもっとMzPもスマートになるかと思います。もし、対応方法があるのであれば、ご教示ください(あればで、結構ですので)。取り急ぎ、お礼まで。
添付ファイル:
2020年8月18日 at 6:47 PM #6149MZPlatformユーザー会サイト管理者ご提案の通り、スクリプト実行を使えば可能ですので、現状ではそれが最善と思います。
取り急ぎテストしてみましたが、今後追加するメソッドは下記のようになると思います。
void setPacketValueAt(int, char)2020年8月19日 at 8:49 AM #6150伊予研究会一般参加者早速のお返事ありがとうございます。
最初にMzが受け取る2byteのデータをintに変換する方法をお尋ねしましたが、その逆の方法がございましたら、ご教示ください。
例えば、送りたい数値が0xFFAAの場合、これを0xFF, 0xAAに分解してバイト配列byte[]で送りたいので。よろしくお願いいたします。
2020年8月19日 at 1:49 PM #6153MZPlatformユーザー会サイト管理者残念ながら、逆のメソッドは作成しておりません。
現状の機能でできるかどうかは、送りたい2バイトデータの状況次第と思います。固定のデータであれば、前述の「setPacketValueAt(int,String)」で別々に設定していただければ送れます。
固定でなくとも、最終的に文字列としてFFとAAに分解さえできれば、同様に送れます。使えそうな機能として整数(Integer)格納変数には「toHexString(int)」メソッドがありますが、先頭の0が出てこないなど、あまり使いやすくありません。関連する掲示板での投稿が下記リンク先にあります。
https://ssl.monozukuri.org/mzplatform/forums/topic/整数と16進数の変換メールより転載/また、各変数コンポーネントからバイト配列が取得できることがわかりましたので、サンプルを添付します。この方法も、値によっては1バイトになるなど、あまり使いやすくありません。一方、1文字からのバイト値変換はこれでできることがわかりました。ご確認いただけますでしょうか。
添付ファイル:
2020年8月19日 at 3:36 PM #6155伊予研究会一般参加者サンプルファイル、ありがとうございました。
文字からのバイト変換はこれで十分ですので、これを使うことにします。数値は、1バイト(0~255)もあるので、リンク先のプログラムを参考に分解してみます。
ありがとうございました。 -
著者投稿
- このトピックに返信するには、ログインしてください。