FAQ

シリアル通信をおこなうプログラムを作成するには?

Armadillo上で動作する、シリアル通信をおこなうLinuxアプリケーションをC言語で作成する場合を考えます。

1. Linux一般でのシリアルプログラミングについて

Linuxでは、シリアルインターフェースは一般に/dev/ttyS*というデバイスファイルとして扱われます。(*は任意の文字列を表します。/dev/ttyS*という表記は、例えば/dev/ttyS0、/dev/ttyS10を意味します。)

Linuxでシリアル通信をおこなうプログラムを書くには、概念的には以下のような手順になります。

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>

#define SERIAL_PORT "/dev/ttyS0"  /* シリアルインターフェースに対応するデバイスファイル */

int main(int argc, char *argv[])
{
    char buf[255];                    /* バッファ */
    int fd;                           /* ファイルディスクリプタ */
    struct termios oldtio, newtio;    /* シリアル通信設定 */
    
    fd = open(SERIAL_PORT, O_RDWR);   /* デバイスをオープンする */
    
    ioctl(fd, TCGETS, &oldtio);       /* 現在のシリアルポートの設定を待避させる */
    newtio = oldtio;                  /* ポートの設定をコピー */
    newtio.c_cflag = ...;             /* ポートの設定をおこなう 詳細はtermios(3)参照 */
    ioctl(fd, TCSETS, &newtio);       /* ポートの設定を有効にする */
    
    read(fd, buf, sizeof(buf));       /* デバイスから255バイト読み込み */
    write(fd, buf, sizeof(buf));      /* デバイスへ255バイト書き込み */
    
    ioctl(fd, TCSETS, &oldtio);       /* ポートの設定を元に戻す */
    close(fd);                        /* デバイスのクローズ */

    return 0;
}

Linuxを含むUnix系OSでは、全てのものがファイルとして表現されますので、シリアルポートへの読み書きも通常のファイルと同様におこなえます。シリアルポートの通信設定は、ioctlもしくはtermios 関数群でおこないます。

より詳しい情報は、以下のページをご参照下さい。

2. Armadillo固有の設定について

シリアルインターフェースとデバイスファイルとの対応は各製品のソフトウェアマニュアルを、シリアルインターフェースのハードウェア仕様(電圧レベル、ハードウェアフロー制御の有無など)は各製品のハードウェアマニュアルを参照してください。

なお、Armadilloのデフォルトイメージではいくつかのシリアルインターフェースがコンソールに割り当てられているため、他のプログラムから使用することができません。 シリアルコンソールへの割り当てを解除する方法は、以下をご参照下さい。

その他

特集記事の「特集 : 作ってみよう,MyガジェットPart3」でもシリアルポートのプログラミングについて説明をしているので、参考にしてください。

また、Armadillo実践開発ガイド 第2部の「6.5. シリアルポートの入出力」では、実際のプログラム例を紹介しています。