====== シリアルポートの利用 ====== 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}} \\