obnizのフォーラムは新しいシステムに移行しております。

新しいフォーラムはこちらになります

UARTの受信データの先頭にnullが付加されてしまう



  • 同一obniz間のUART送信→受信で、送信データの先頭にNull(0)が付加されて受信されます。原因はなんでしょうか?

    以下の構成です。
    Webhook query(A)をEvent(B)で受けてUART0に送信。同一obnizでクロス接続(C)されたUART1の画面プログラム(D)で受信しconsole.logに表示(E)。

    同一データで3回実行してみましたが、1回目と2回目は0と送信データが2文字まとめて受信され、3回目は0と送信データが別タイミングで受信されるという挙動の違いもあります。(D参照)

    ■【A】Webhook query(同一を3回実行)
    0_1557622382760_68a0cf3d-c0bb-4c5b-8097-20bf06c0d7f8-image.png

    ■【B】Webhookを受けてUART0にコマンド送信するプログラム(Event)

    <!-- 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@2.0.2/obniz.js" crossorigin="anonymous"></script>
    </head>
    <body>
    <script>
    var obniz = new Obniz("xxxx-xxxx");
    obniz.onconnect = async function () {
    //   obniz.resetOnDisconnect(false);
    
       if (typeof done === "function"){ 
          if (typeof req === "object") {
             if ( req.query.cmd0 ) cmd = "0";
             if ( req.query.cmd1 ) cmd = "1";
             if ( req.query.cmd3 ) cmd = "2";
             if ( req.query.cmd3 ) cmd = "3";
             if ( req.query.cmd4 ) cmd = "4";
             obniz.uart0.start({tx:0,rx:1});
    //         obniz.uart0.send(cmd,0x0D,0x0A); 
             obniz.uart0.send(cmd);         
         }
       }
       await obniz.wait(1000);
       obniz.close();
    }  
    </script>
    </body>
    </html>
    

    ■【C】同一obnizでUART0からUART1にコマンド送信
    ジャンプワイヤーでUART0とUART1をクロス接続

    ■【D】UART1でコマンドを受信して画面に表示するプログラム(HTML)

    <!-- 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@2.0.2/obniz.js" crossorigin="anonymous"></script>
    
    </head>
    UART1_To_Web
    <body>
    <br> 
    <div id="text"></div>
    <script>
    
    var obniz = new Obniz("xxxx-xxxx");  
      
    obniz.onconnect = async function () {
       obniz.resetOnDisconnect(false); 
       obniz.uart1.start({tx: 2 ,rx: 3 });
    
       obniz.uart1.onreceive = async function(data,text){
          console.log(data);
          console.log(text);
          $("#text").text('text='+text);
       }
    
    }
    
    </script>
    </body>
    </html>
    

    ■【E】実行結果 (console.log)

    0_1557623430863_cb39e598-b076-4469-b6ff-f811d738abf6-image.png

    24行目がdata、25行目がtextです。
    以上



  • @Google-Homer さん

    おそらく、uartの立ち上げ時の波形を読み取ってしまっているのかと思います。
    検証用のビットをつけることで回避が可能ですので、パリティビットの設定をして試してみてもらえないでしょうか。

    obniz.uart0.start({tx: 1, rx: 2, parity: "odd"});
    

    もしくは

    obniz.uart0.start({tx: 1, rx: 2, parity: "even"});
    


  • また、2回に分かれるかどうかですが、uartの仕組み上、スタートとストップがわかりませんので、
    バラバラでくることもあれば一括で来ることもあります。

    uartの状況に左右されないプログラムを作りたい場合は、
    obniz.js 2.0.3にて1文字ずつ取得する関数obniz.uart0.readByte()を追加していますので、
    そちらを使っていただければと思います。



  • odd/evenともに現象変わりませんでした。他の可能性どうでしょうか?



  • 試していただきありがとうございます。
    こちらでも再現するか確認してみますので、しばしお待ちください。



SUGGESTED TOPICS