UART: 受信する

今回はUARTで相手から送られてきたデータを受信します。
送信より難しいのは送信は自分の好きなタイミングでできるのでいいのですが、受信はそうではないので扱いが少し難しいです。

自分で送受信

何の意味もありませんが、obnizからUARTで出す信号をobnizで受信してみましょう。
電線1本あれば作れてしまいます。io0とio1をつなぎます。

次に受信ですが、方法が2つあります。
1つはonreceiveを使う方法です。

uart.onreceive = function(data, text) {

}

このようにするとuartがデータを受け取ったときにこの関数が呼ばれます。
こうすることで、データを受信するごとにこの関数が呼ばれます。
UARTではデータは1バイトずつバラバラに来ます。なので、この関数もバラバラにデータを受信します。
"Hello"という文字を相手が送っても"Hello"というデータが来ることもあれば、"He"と"llo"の2回に分けてデータが来ることもあります。

関数の引数はdataとtextになっています。
dataは受信したバイト配列になります。textにはそれをUTF8でデコードした文字がはいります。
仮に文字じゃないデータが入っていてUTF8でデコードできない場合はtextはnullとなります。

早速送受信してみます。
自分からHelloを送って受信した文字を出してみます。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function(){
  var uart = obniz.getFreeUart();
  uart.start({tx: 0, rx: 1, baud:9600 });

  uart.onreceive = function(data, text) {
    console.log(text);
  }

  uart.send("Hello");
}

どうでしょうか。一度にHelloと受信できればこのように表示されます。

バイト列を送ったとしてもきちんと動作するかと思います。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function(){
  var uart = obniz.getFreeUart();
  uart.start({tx: 0, rx: 1, baud:9600 });

  uart.onreceive = function(data, text) {
    console.log(data);
  }

  uart.send([0,1,2]);
}

このようにuartであれば簡単にデータのやりとりができます。
しかし、データの間違いや、どこからどこまでが一回のデータなのかという高度な仕組みはありません。
また、相手はこっちの事を気にせずデータを送ってくるため、こちら側の処理が追いつかないとせっかく相手が送ってくれたデータを途中で失ってしまうこともあります。
UARTは簡単で便利ですが、高度なことをしようとするとそれなりに工夫が必要です。

onreceiveじゃない受信

受信するもう1つの方法はポーリングです。

onreceiveを設定しないでいるとuartの中にobnizから受信したデータが溜まっていきます。

uart.isDataExists()

を呼ぶことで、受信済みのデータがあるかどうかを確認できます。

uart.readText()
uart.readBytes()

を使うことでその受信したデータをそのままバイトアレイとして取り出したり、UTF8の文字として取り出すことができます。
取り出すことでuartの中からデータは消えます。ので取り出してすぐはuart.isDataExists()はfalseとなります。

これを使えば無限ループを使ってデータを取り出すことも可能です。
無限ループを使う場合はJavaScriptが止まってしまわないようにwaitを使って適度に休みを入れる必要があります。

var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function(){
  var uart = obniz.getFreeUart();
  uart.start({tx: 0, rx: 1, baud:9600 });

  uart.send("Hello")

  while(1){
    if(uart.isDataExists()){
        console.log(uart.readText());
    }
    await obniz.wait(10);
  }
}


Next : SPI: Communicate

You will Get in Few Days

Circuit for Starter “obniz Board” is available on Amazon and other online stores.
You can get it at below

Our products and resellers

Forum

Visit our developer’s forum to discuss and discover technologies.

Forum

Contact

Feel free to contact out support and technical team.

Contact us