var uart1 = obniz.getFreeUart();の「uart1」部分について



  • UARTのstartがうまく行きません。
    var uart1 = obniz.getFreeUart();の「uart1」部分ですが、任意の変数名でよいのかと思ったら「uart0」又は「uart1」以外の変数名にした場合、startでエラー(関数から戻ってこない)になっているように見受けられます。何かからくりありますか?



  • @Google-Homer
    任意の変数で動作します、他の部分のプログラムでその変数を使っていたり、startの書き方になにか違いがあるような気がします。startの部分までのプログラムを共有いただけますか?



  • 正常と思われるケースと異常と思われるケースの実行結果のスクショ及び異常ケースのコードを送ります。よろしくお願いします。
    ■正常ケース、Afterが表示されたのでstart正常と解釈
    0_1547749852611_DSC_0173.JPG

    ■異常ケース、Afterが表示されないのでstart異常と解釈
    0_1547749856082_DSC_0174.JPG

    ■異常ケースのコード
    <!-- HTML Example -->
    <html>
    <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
    <script src="https://unpkg.com/obniz@1.15.1/obniz.js" crossorigin="anonymous"></script>
    <script src="https://unpkg.com/obniz-parts-kits@0.9.5/ai/index.js"></script>
    </head>
    <body>
    <script>
    var obniz = new Obniz("XXXX-XXXX");
    obniz.onconnect = function () {
    obniz.io0.output(false);
    ua0 = obniz.getFreeUart();
    obniz.display.clear();obniz.display.print("Before start");
    obniz.ua0.start({tx:1,rx:2});
    obniz.display.clear();obniz.display.print("After start");
    }
    </script>
    </body>
    </html>



  • @Google-Homer
    ありがとうございます。

    ua0 = obniz.getFreeUart();
    obniz.ua0.start({tx:1, rx:2});
    

    とありますが。正しくは

    ua0 = obniz.getFreeUart();
    ua0.start({tx:1, rx:2});
    

    となります。

    ua0はただの変数なので、obnizオブジェクトにくっつくものではありません。
    obnizと関係あるものでもobnizから切り離して1つの変数にできるのがjavascriptの特徴でもあります。



  • 回答頂いた内容と下記サンプルとの関係を教えて下さい。

    0_1547775128805_Screenshot_20190118-102516.png



  • @Google-Homer
    obnizにはuart0とuart1があります。どちらも使ってない限りは未使用です。

    obniz.uart0.start({});
    obniz.uart1.start({});
    

    どちらでも良いので、まだstartしてないものが欲しい場合はgetFreeUart()関数で取り出すことができます。

    var uart = obniz.getFreeUart();
    uart.start()
    

    まだどちらも使ってない場合はuart0のことになります。つまり

    var uart = obniz.uart0;
    uart.start()
    

    これと同じことになります。



  • 基本的にはgetFreeUart()でuartオブジェクトを取得する方法をおすすめします。
    「どちらかでは困る、uart0を使い続けたい」と決まっている場合はobniz.uart0として頂ければと思います。

    ドキュメントではuartが2つあるのをわかりやすくするためにそうなっておりました(改善の余地がありそうです。getFreeUart()にすることを検討します。)



  • 1.obniz.uart0.start({tx:1,tr:2})
    2.uart0=obniz.getFreeUart()
    3.uart0.start({tx:3,tr:4})
    この3行の連続処理のコードを書いたとしたら
    1行目では内部番号0のUARTが、3行目では内部番号1のUARTがstartするという理解で良いでしょうか?



  • @Google-Homer
    はい。仰る通りです。なので、uart0という変数にobniz.uart1が入ることになります。



  • ありがとうございました。
    静的(obniz.uart0/1)と動的(obniz.getFreeUart)の2種類あること理解できました。



  • @Google-Homer
    そこなのですが、現在動いているプロセスの情報のみ利用しているため他のプログラムが利用している場合は競合することになります。


Log in to reply
 

SUGGESTED TOPICS