OrangePi-PCを使ってみる

Debian StretchでのUART通信

Debian StretchでのUART通信を紹介します。
stretchでは最初から以下のUARTデバイスが存在しています。
$ ls -l /dev/ttyS*
crw------- 1 orangepi tty     4, 64 Nov 29 12:32 /dev/ttyS0
crw-rw---- 1 root     dialout 4, 65 Nov 29 12:25 /dev/ttyS1
crw-rw---- 1 root     dialout 4, 66 Nov 29 12:25 /dev/ttyS2
crw-rw---- 1 root     dialout 4, 67 Nov 29 12:25 /dev/ttyS3
crw-rw---- 1 root     dialout 4, 68 Nov 29 12:25 /dev/ttyS4
crw-rw---- 1 root     dialout 4, 69 Nov 29 12:25 /dev/ttyS5
crw-rw---- 1 root     dialout 4, 70 Nov 29 12:25 /dev/ttyS6
crw-rw---- 1 root     dialout 4, 71 Nov 29 12:25 /dev/ttyS7

但し、setserialコマンドで調べてみると、ttyS0(コンソールポート)以外は使えない状態となっています。


UARTポートの有効化はarmbian-configを使って行います。
armbian-configを起動し以下の手順で進めます。




ここでuart1 uart2 uart3を有効にします。


< Save > を押して < Exit >を押すと以下のスクリーンになります。


ここで<Reboot>を選ぶとリブートします。
再起動が完了するとUARTデバイスは以下のようになります。
これでttyS1/S2/S3が使えるようになります。


デバイスファイルとポートの関係は以下の様になっています。
ピンの名前 デバイススペシャルファイル Txピンの場所 Rxピンの場所
TxD0/RxD0 /dev/ttyS0 オンボード上のTx オンボード上のRx
TxD1/RxD1 /dev/ttyS1 ピンヘッダーのPin#38 ピンヘッダーのPin#40
TxD2/RxD2 /dev/ttyS2 ピンヘッダーのPin#13 ピンヘッダーのPin#11
TxD3/RxD3 /dev/ttyS3 ピンヘッダーのPin#8 ピンヘッダーのPin#10



WiringPiに含まれているSerial Libraryを使ったコードは以下です。
受信した1文字を小文字→大文字、あるいは大文字→小文字に変換して送り返します。
//
// Serial Echo Example
//
// cc -o uart uart.c -lwiringPi
//
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringSerial.h>


int main (int argc, char **argv) {
  int fd;
  char device[32];
  strcpy(device,"/dev/ttyS1");
  if (argc == 2) strcpy(device,argv[1]);
  printf("device=%s\n",device);

  if ((fd = serialOpen (device, 115200)) < 0) {
    printf ("Unable to open serial device: %s\n", strerror (errno)) ;
    return 1 ;
  }

  unsigned char rx;
  unsigned char tx;
  while(1) {
    if (serialDataAvail (fd)) {
      rx = serialGetchar (fd);
      printf ("-> %02x\n", rx);
      tx = rx;
      if (rx >= 0x41 && rx <= 0x5a) {
        tx = rx + 32;
      } else if (rx >= 0x61 && rx <= 0x7a) {
        tx = rx - 32;
      }
      serialPutchar (fd, tx);
    } // end if
  } // end while
}

WiringPiに含まれているSerial Libraryは、tcsetattrやioctlの関数をラップしているだけなので、
wiringSerial.c と wiringSerial.h をコピーすれば、WiringPiをインストールしなくても使えます。、

次回はi2c通信を紹介します。