シリアル通信のバイトデータ受信について

MZ Platformとは 掲示板 MZプラットフォームユーザー会掲示板 シリアル通信のバイトデータ受信について

10 件の投稿を閲覧中 - 11 ~ 20 件(全 26 件)
  • 著者
    投稿
  • #6141
    伊予研究会
    一般参加者

    シリアル通信の送信についてご教示ください。

    シリアル通信のメソッドでボードにバイト配列データを出力する(byte[])がありますが、例えば{‘X’, 0x12, 0x15}といった配列データを送る場合メソッド値の設定が分かりません。
    byte[] = {‘X’, 0x12, 0x15}の設定は、バイト値格納変数をどのようにして配列にすればよいか、ご教示ください。

    #6142
    MZPlatformユーザー会
    サイト管理者

    ご質問の意図から少々外れてしまいますが、もし送信先がバイト配列でデータを受け取るときと、バイト値を連続で受け取るときで反応が同じであれば、バイト値を連続で送信する方が簡単です。つまり、メソッド「ポートにバイトデータを出力する(int)」を複数回呼ぶということです。このメソッドは引数がintなので、その変換だけは必要になります。

    ここから本題ですが、バイト配列データを出力するメソッドは日本語化されていますが、そのバイト配列を作成するためのメソッドは日本語化されていません。全メソッド対象にするとお選びいただけます。メソッド「makePacketToSend(int)」でサイズを指定してバイト配列を作成します。このメソッド戻り値がバイト配列になっているので、この後でメソッド「ポートにバイト配列データを出力する(byte[])」の起動で引数にメソッド処理結果を渡します。また、出力する前に配列の中身を与えるメソッド「setPacketValueAt(int,int)」か「setPacketValueAt(int,String)」を必要回数実行します。最初の引数は配列のインデックスで、次の引数が値を指定します。値をintで指定する場合は、前述と同様です。値をStringで指定する場合は、16進数の文字列表現を与えます。例えば「02」や「A0」など2文字の16進数文字列を指定すると、内部で変換して配列に入れてくれます。

    わかりにくいと思いますので、ご不明な点があれば再度お問い合わせください。

    #6144
    伊予研究会
    一般参加者

    ご回答ありがとうございました。
    ご教示頂いた通り、setPacketValueAt(int,int), setPacketValueAt(int,String)両方で試したところできました。

    ところで、setPacketValueAtは数値でしかセットすることができません。できましたら先頭に’X’の文字も配列に入れて1回で送信したいのですが、何か良い手段はございますでしょうか。
    受け側ではキャラクターコードで判断できるので、Mz側でキャラクターコードにする方法がありましたらご教示ください。

    よろしくお願いいたします。

    #6145
    MZPlatformユーザー会
    サイト管理者

    残念ながら、現状は文字による値指定ができません。今後の機能追加を検討します。

    現状は文字コード表で対応する整数を指定をするしかないので、大文字のXであれば88になるかと思います。

    #6146
    伊予研究会
    一般参加者

    ご連絡ありがとうございました。とりあえず、コードにして送ることにします。
    機能追加の検討、よろしくお願いします。

    #6147
    伊予研究会
    一般参加者

     とりあえず文字コードをスクリプトで対応させましたので、ファイルを添付します。受け側のArduinoのスケッチは、正しく送られてきたらLEDを点灯するようにして確認しました。
     今回、スクリプトは char c = moji; として moji を ‘X’ に入れ替えていますが、直接char c = ‘moji’; として X に入れ替えることができればもっとMzPもスマートになるかと思います。もし、対応方法があるのであれば、ご教示ください(あればで、結構ですので)。

     取り急ぎ、お礼まで。

    添付ファイル:
    #6149
    MZPlatformユーザー会
    サイト管理者

    ご提案の通り、スクリプト実行を使えば可能ですので、現状ではそれが最善と思います。

    取り急ぎテストしてみましたが、今後追加するメソッドは下記のようになると思います。
    void setPacketValueAt(int, char)

    #6150
    伊予研究会
    一般参加者

    早速のお返事ありがとうございます。

    最初にMzが受け取る2byteのデータをintに変換する方法をお尋ねしましたが、その逆の方法がございましたら、ご教示ください。
    例えば、送りたい数値が0xFFAAの場合、これを0xFF, 0xAAに分解してバイト配列byte[]で送りたいので。

    よろしくお願いいたします。

    #6153
    MZPlatformユーザー会
    サイト管理者

    残念ながら、逆のメソッドは作成しておりません。
    現状の機能でできるかどうかは、送りたい2バイトデータの状況次第と思います。

    固定のデータであれば、前述の「setPacketValueAt(int,String)」で別々に設定していただければ送れます。

    固定でなくとも、最終的に文字列としてFFとAAに分解さえできれば、同様に送れます。使えそうな機能として整数(Integer)格納変数には「toHexString(int)」メソッドがありますが、先頭の0が出てこないなど、あまり使いやすくありません。関連する掲示板での投稿が下記リンク先にあります。
    https://ssl.monozukuri.org/mzplatform/forums/topic/整数と16進数の変換メールより転載/

    また、各変数コンポーネントからバイト配列が取得できることがわかりましたので、サンプルを添付します。この方法も、値によっては1バイトになるなど、あまり使いやすくありません。一方、1文字からのバイト値変換はこれでできることがわかりました。ご確認いただけますでしょうか。

    添付ファイル:
    #6155
    伊予研究会
    一般参加者

    サンプルファイル、ありがとうございました。
    文字からのバイト変換はこれで十分ですので、これを使うことにします。数値は、1バイト(0~255)もあるので、リンク先のプログラムを参考に分解してみます。
    ありがとうございました。

10 件の投稿を閲覧中 - 11 ~ 20 件(全 26 件)
  • このトピックに返信するには、ログインしてください。