====== シリアルポートの利用 ======
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
|< 30em 6em 13em 12em >|
^ U(S)ART ^ device node ^ 用途 |
| UART4 | /dev/ttyS0 (/dev/console) | 内部コンソール |
| UART1 | /dev/ttyS1 | BtoB 通信ボード 1 |
| USART2 | /dev/ttyS2 | D-SUB RS-232C/485((RS-485 は XG-50 rev.2のボードで対応)) |
| USART3 | /dev/ttyS3 | BtoB 通信ボード 2 |
BtoB 通信ボード用 UART は、オプションの LTE-M および Wi-SUN 拡張ボードとの通信で利用します。\\
ここでは、D-SUB RS-232C/485 での利用方法を記載します。
\\
===== ハードウェア =====
==== モード切替 ====
Revison.2 のボードでは、RS-232/485 をボード上の DIPSW で切り替えることが可能です。
{{:xg_series_devel:use_serialport:rev2_rs485_232_select_switch.jpg?400|}}
|<32em 5em 5em 5em 5em 12em>|
^ 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 仕様となっています。
|< 20em 2em 3em 3em >|
^ 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 ===
|< 20em 2em 3em 3em >|
^ Pin No. ^ 信号 ^ 方向 ^
| 1| TRX- | IN/OUT |
| 2| TRX+ | IN/OUT |
| 3| - | - |
| 4| - | - |
| 5| GND | - |
| 6| - | - |
| 7| - | - |
| 8| - | - |
| 9| - | - |
\\
===== ソフトウェア =====
**/dev/ttySx** になっていることから想像できるとおり、[[https://linuxjm.osdn.jp/html/LDP_man-pages/man3/termios.3.html|TERMIOS]] のインターフェースで制御を行います((**CONFIG_SERIAL_TERMIOS** を有効にしている前提とします))。
\\
==== 制御の手順 ====
一般的なシリアルポート利用の手順としては、下記のような流れとなります((''apps/examples/usbserial/host.c'' から))。
* デバイスを open
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);
* データを read/write (データ送受信の実行)
nbytes = read(fd, g_iobuffer, BUFFER_SIZE-1);
nbytes = write(fd, g_shortmsg, sizeof(g_shortmsg));
* デバイスを close
close(fd);
\\
==== 注意点 ====
RTS/CTS のフロー制御は ''c_cflag'' の **CRTSCTS**((POSIX にはない、Linux の実装)) ではなく、**make menuconfig** で設定を行います。
{{:xg_series_devel:use_serialport:menuconfig_uart_rtscts.png?600|RTS/CTS flow control}}
\\