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回実行)
■【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)
24行目がdata、25行目がtextです。
以上
-
おそらく、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ともに現象変わりませんでした。他の可能性どうでしょうか?
-
試していただきありがとうございます。
こちらでも再現するか確認してみますので、しばしお待ちください。