PICAXEでシリアル入力(エコーバック)

    PICAXE
    03 /20 2015
    シリアル入力でデータを受け取り、シリアル出力にそのデータを送り返すエコーバック(echo back)をやってみた。

    使うピンは書き込み(プログラム)以外にはまず使わないSerial in(SI)とSerial out(SO)ピンを使うのが現実的。
    loop_back01.png
    SIピンをシリアル入力(Rx)で使うならserrxd命令を使うのが面倒がない。
     4800bps(4MHz時)、8ビット、ノンパリ、ストップ1
     (ボーレートを下げたいならserinを使う。)
    出力も同様に面倒な設定がないsertxdでやってみる。
    serrxdは前回の記事でも書いたようにdisconnect~reconnectで挟むのが基本なので下記のようになる。

    #picaxe 08m2
    #NO_DATA
    main:
     disconnect
     serrxd b0
     reconnect

     sertxd (b0)
     goto main

    これで、PICAXEの開発ソフト(PICAXE Editor 6、PICAXE Programming Editor)のターミナルソフトで使う分には問題ないのだが、Tera Termを使って押しては行けないキーを押すと下図のように「・・・・J」になりその後何を押しても「・・・・J」になったり1文字抜けたりしてNG。
    loop_back02.png
    これはアスキーコード文字以外のカーソルキー、Esc等を押すと発生する。

    PICAXEの開発ソフトのターミナルには送信時にフィルターと文字変換が入っていて発生しないと思われるが、Tera Termの方はそうではないので発生する。
    開発ソフトのターミナルは送信に一々「send」ボタンを押さなくてはならず面倒。
    Tera Termだとキーを押した瞬間に送信されるがつい押しては行けないキーを押してしまう。

    なお、Tera Termでリターンキーはcrなので受信の改行コードはAUTOにして cr+lf にみなすようにしてある。
    loop_back03.png

    アスキーコード以外とエスケープ無視するフィルターを入れてみた。
    ついでにリターン(cr)を cr+lf に変換している。

    #picaxe 08m2
    #NO_DATA
    main:
        disconnect
        serrxd b0
        reconnect

        if b0 > 127 or b0 = 27 then    ; not ASCII or ESC ?
         goto main
        elseif b0 = 13  then    ; Enter(cr)?
         sertxd (cr,lf)

        else
         sertxd (b0)
        endif
           
        goto main

    これで直ったかというと、ダメなのである。 この後、色々やってみたが省略。
    え~分からん。orz

    そこで「picaxe エコーバック」でググってみた。
    先人が一人おられてその方によるとdisconnect ~ reconnectで挟むとゴミがでるとある。
     (リンクしてよいのか不明なので微妙な紹介の仕方)
    早速試してみると問題はreconnectの方が問題だと分かった。
    上のプログラムでこれをコメントアウトするとうまくいくのである。

    しかし、これがないとハードリセットで再書き込みするか、パワーオン直後5秒ぐらいポーズさせなくてならない。
    最悪これでもよいのだが無粋である。 あ~なんとかならんか....

    2日後に(^^;)閃きました! reconnectを送信の後にしたら?

    #picaxe 08m2
    #NO_DATA
    main:
        disconnect
        serrxd b0

        if b0 > 127 or b0 = 27 then    ; not ASCII or ESC ?
         goto main
        elseif b0 = 13  then    ; Enter(cr)?
         sertxd (cr,lf)
        else
         sertxd (b0)
        endif

        reconnect
        goto main

    お~、うまく行きました。 (理由は分からないけど。) ゴミは出ないし一文字抜けることもないしOKです。
    プログラムの書き込みが心配だったが問題ない。
     まれに書き込めない可能性がありますが再書き込みしてみてください。
     今回は受信と送信の間の時間が短いですが処理が入って長くなると書き込めない確立が高まるかもしれません。

    なお、送信にハードを使うhserout命令を使うと、ゴミは出ないが1文字抜ける症状はでるのでreconnectはやはり送信の後にしなくてはならなかった。

    #picaxe 08m2
    #NO_DATA
    hsersetup B4800_4, %10010 ;4800 baud, disable hserin, inverted TXD
    main:
        disconnect
        serrxd b0

        if b0 > 127 or b0 = 27 then    ; not ASCII or ESC ?
         goto main
        elseif b0 = 13  then    ; Enter(cr)?
         hserout 0,(cr,lf)
        else
         hserout 0,(b0)
        endif

        reconnect
        goto main

    reconnectの件はPICAXEの開発ソフトのターミナルで使う分には問題ないのでそういう仕様だと思うしかないようです。

    以上
    関連記事

    コメント

    非公開コメント

    Friendship 7

    浅く広くのハード屋です。
    コメントへの返信には過大な期待をしないで下さい。 非公開コメントは停止しております。 不適切なコメントはFC2で自動的にはじかれます。
    リンクフリーですが盗作は禁止です。
    本ブログの内容を参考にされる場合はあくまで自己責任でお願い致します。