目次

シリアルポートの利用

XG-50 には、dmesg で出力されるとおり、シリアルポートが複数実装されています。

nsh> dmesg
[     0.000000] stm32l4_rng_initialize: Initializing RNG
[     0.000000] registered UART4 as /dev/console.
[     0.000000] registered UART4 as /dev/ttyS0.
[     0.000000] registered UART1 as /dev/ttyS1.
[     0.000000] registered USART2 as /dev/ttyS2.
[     0.000000] registered USART3 as /dev/ttyS3.
[     0.001500] Mounting procfs to /proc
U(S)ART device node 用途
UART4 /dev/ttyS0 (/dev/console) 内部コンソール
UART1 /dev/ttyS1 BtoB 通信ボード 1
USART2 /dev/ttyS2 D-SUB RS-232C/4851)
USART3 /dev/ttyS3 BtoB 通信ボード 2

BtoB 通信ボード用 UART は、オプションの LTE-M および Wi-SUN 拡張ボードとの通信で利用します。
ここでは、D-SUB RS-232C/485 での利用方法を記載します。


ハードウェア

モード切替

Revison.2 のボードでは、RS-232/485 をボード上の DIPSW で切り替えることが可能です。

bit1 bit2 bit3 bit4 Mode
ON OFF - - RS-232C
OFF ON - - RS-485 (Half Duplex)
ON ON - - RS-422 (Full Duplex)
- - OFF - RS-485 終端抵抗なし
- - ON - RS-485 終端抵抗あり


ピンアサイン

RS-232C

標準的な全結線の DTE 仕様となっています。

Pin No. 信号 方向
1 CD IN
2 RxD IN
3 TxD OUT
4 DTR OUT
5 GND -
6 DSR IN
7 RTS OUT
8 CTS IN
9 RI IN


RS-485

Pin No. 信号 方向
1 TRX- IN/OUT
2 TRX+ IN/OUT
3 - -
4 - -
5 GND -
6 - -
7 - -
8 - -
9 - -


ソフトウェア

/dev/ttySx になっていることから想像できるとおり、TERMIOS のインターフェースで制御を行います2)


制御の手順

一般的なシリアルポート利用の手順としては、下記のような流れとなります3)

  fd = open(g_ttydev, O_RDWR);
  ret = tcgetattr(fd, &tty);
  tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
  tty.c_oflag &= ~OPOST;
  tty.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
  tty.c_cflag &= ~(CSIZE|PARENB);
  tty.c_cflag |= CS8;

  ret = tcsetattr(fd, TCSANOW, &tty);
  nbytes = read(fd, g_iobuffer, BUFFER_SIZE-1);

  nbytes = write(fd, g_shortmsg, sizeof(g_shortmsg));
  close(fd);


注意点

RTS/CTS のフロー制御は c_cflagCRTSCTS4) ではなく、make menuconfig で設定を行います。

RTS/CTS flow control


1)
RS-485 は XG-50 rev.2のボードで対応
2)
CONFIG_SERIAL_TERMIOS を有効にしている前提とします
3)
apps/examples/usbserial/host.c から
4)
POSIX にはない、Linux の実装