iRobotLab
開始行:
#contents
----
*概要 [#m5f3b243]
-Linux組み込みボード上でシリアル通信を使ったプログラムを...
-前回まで
#ref(con7control.png,zoom,320x160)
--図 シリアルポート経由でのログイン
-今回から
#ref(con6obsrv.png,zoom,320x160)
--図 ネットワーク経由でのログイン
*準備 [#q752670f]
**開発環境のインストール [#ja7886b8]
-apt-getを用いてLinux組み込みボード上でプログラムをコンパ...
--apt-get install binutils-dev gcc g++ libpopt-dev make p...
**SSH経由でログインできることを確認 [#ie5ef57c]
-TeraTerm, minicomなどで,SSH経由でログインできることを確...
--SSH経由でのログインの場合,ホスト名/アドレスが必要にな...
---有線LAN使用の場合:ifconfig eth0
---無線LAN使用の場合:ifconfig ath0
**配線の変更 [#aa985f51]
-con7のケーブルをcon6へ挿す
#ref(picsay-1280997322.jpg,zoom,320x160)
--図 con7に挿さっている状態
#ref(picsay-1280997383.jpg,zoom,320x160)
--図 con6に挿さっている状態
*プログラミング [#yeaf8558]
**Hello World!を出力 [#y75e71e8]
-下記のプログラムを入力
#ref(sample.c)
01:#include <sys/types.h>
02:#include <sys/stat.h>
03:#include <sys/ioctl.h>
04:#include <fcntl.h>
05:#include <termios.h>
06:#include <unistd.h>
07:#include <stdio.h>
08:#include <stdlib.h>
09:#include <string.h>
10:
11:/* シリアルインターフェースに対応するデバイスファイル...
12:#define SERIAL_PORT "/dev/ttyAM1"
13:
14:int main(){
15:
16: /* シリアルインターフェースのオープン */
17: /* O_RDWR: 入出力用にオープン */
18: /* O_NOCTTY: ノイズ等による不意のctrl-cを防ぐため,...
19: /* シリアルインターフェースをint型変数"fd"の名前で...
20: int fd;
21: fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY);
22: if(fd < 0){
23: printf("%s doesn't open it\n",SERIAL_PORT);
24: return -1;
25: }
26:
27: /* シリアルポートの設定を行う変数を宣言 */
28: struct termios oldtio, newtio;
29: /* 現在の設定を oldtio に保存 */
30: tcgetattr(fd, &oldtio);
31: /* 今回使用する設定 newtio に現在の設定 oldtio をコ...
32: newtio = oldtio;
33:
34: /* 入出力スピードの設定 */
35: /* 以下の方法1または方法2で設定.どちらかでよい */
36:
37: /* 方法1 */
38: cfsetispeed(&newtio, B115200); /* 入力スピード設定 */
39: cfsetospeed(&newtio, B115200); /* 出力スピード設定 */
40:
41: /* 方法2 */
42: cfsetspeed(&newtio, B115200); /* 入出力スピード設定...
43:
44: /* 27行目-42行目までの設定を有効にする */
45: tcflush(fd, TCIFLUSH);
46: tcsetattr(fd, TCSANOW, &newtio); /* 設定を有効に */
47:
48: /* 通信処理:シリアルデバイスに出力 */
49: char buf[255];
50: strcpy(buf,"hello");
51: write(fd, buf , sizeof(buf)); /* write関数:送信処理...
52:
53: /* デバイスの設定を戻す */
54: tcsetattr(fd, TCSANOW, &oldtio);
55: close(fd);
56: return 0;
57:}
-gcc -o sample1 sample.c
--プログラム sample.c をコンパイル
--コンパイル後の実行ファイルの名前をsample1として保存
-./sample1
--プログラムを実行
--Hello World!と表示されることを確認
**プログラムの説明 [#t5558cca]
-通信のための準備・終了処理
--16行目から46行目までがシリアル通信を行うための準備の部...
--53行目から56行目までがシリアル通信を終了させるための後...
-メインプログラム
--48行目から51行目までがシリアル通信を使ったプログラムの...
---read関数:受信(接続機器 から Armadillo-300に情報伝達)
---write関数:送信(Armadillo-300 から 接続機器に情報伝達)
*参考 [#f2f5609f]
**シリアル通信に関する重要な部分の説明 &aname(important_p...
-12行目
--#define SERIAL_PORT "/dev/ttyAM1"
---今回使用するシリアルインターフェース
-21行目
--fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY);
---シリアルインターフェースを"fd"の名前で使えるようにする.
-28-32行目
--struct termios oldtio, newtio
---非同期通信ポートを制御するための汎用ターミナルインタフ...
--tcgetattr(fd, &oldtio);
---シリアルインターフェース"fd"から,現在の設定を読み込み...
--newtio = oldtio
---現在の設定をnewtioにコピー.以後,newtioの設定を変え,...
-38-39行目
--cfsetispeed(&newtio, B115200);
---newtioの中の入力に関する通信速度の設定
--cfsetospeed(&newtio, B115200);
---newtioの中の出力に関する通信速度の設定
-42行目
--cfsetspeed(&newtio, B115200);
---36-38行目と同じことをしている.こちらは入出力を一度に...
-45-46行目
--tcflush(fd, TCIFLUSH);
---シリアルインターフェースの送受信データをクリア
~tcsetattrの実行のために必要.
--tcsetattr(fd, TCSANOW, &newtio);
---newtioを用いてシリアルインターフェース"fd"を設定.
-51行目
--write(fd, buf , sizeof(buf));
---シリアルインターフェース"fd"にsize(buf)分のデータbufを...
-54-55行目
--tcsetattr(fd, TCSANOW, &oldtio);
---シリアルインターフェース"fd"を初期の設定(oldtio)に戻す
--close(fd);
---シリアルインターフェースと名前"fd"の繋がりを開放.
**struct termiosの説明 [#iea820dd]
-struct temiosは構造体であり,以下のようになっている.
--struct termios {
---tcflag_t c_iflag; /* 入力フラグ */
---tcflag_t c_oflag; /* 出力フラグ */
---tcflag_t c_cflag; /* 制御フラグ */
---tcflag_t c_lflag; /* ローカルフラグ */
---cc_t c_cc[NCCS]; /* 特殊制御文字の設定 */
--};
***入力フラグ [#dc1f6b6a]
-端末(この場合armadillo)への入力に関する設定である.特に...
***出力フラグ [#ke19152d]
-端末(この場合armadillo)からの出力に関する設定である.特...
***制御フラグ [#z2e032b4]
-端末(この場合armadillo)のハードウェアに関する設定である...
***ローカルフラグ [#v58465fe]
-端末(この場合armadillo)のその他の設定である.ドライバと...
---tcflag_t c_lflag;
**struct termiosの使い方 [#xaaf25db]
-tcgetattrにてプログラム開始時の初期設定を読み込む
-new = old などとして初期設定と同じ新しい設定変数を作成し...
-cfsetspeedなど必要に応じて必要な箇所のみの変更を行う
-通信処理
-プログラム終了時に初期設定に戻す
**シリアルデバイスにおける入力処理の概念 [#jff3a31d]
***入力方式 [#e8abf335]
-シリアル通信では,シリアルデバイスを介して外部からデータ...
--カノニカル入力処理(デフォルト)
---外部からの全ての入力は,行単位で処理される.つまり,re...
~NL(ASCIIのLF)
~ファイル終端
~行終端文字
~注意点としては,標準の設定ではCR(DOS/Windowsのデフォルト...
--非カノニカル入力処理
---read関数を呼び出す際に読み込むデータの大きさを指定する...
***処理方式 [#if6da0d4]
-カノニカル入力処理/非カノニカル入力処理においては外部か...
--同期処理
---read関数にてデータ読み込みが始まると,データを読み終え...
--非同期処理
---read関数にてデータ読み込みが始まると,プログラム自体は...
***Armadilloでの処理 [#ib328ec6]
-シリアルに接続されたセンサなどを想定しているので非カノニ...
終了行:
#contents
----
*概要 [#m5f3b243]
-Linux組み込みボード上でシリアル通信を使ったプログラムを...
-前回まで
#ref(con7control.png,zoom,320x160)
--図 シリアルポート経由でのログイン
-今回から
#ref(con6obsrv.png,zoom,320x160)
--図 ネットワーク経由でのログイン
*準備 [#q752670f]
**開発環境のインストール [#ja7886b8]
-apt-getを用いてLinux組み込みボード上でプログラムをコンパ...
--apt-get install binutils-dev gcc g++ libpopt-dev make p...
**SSH経由でログインできることを確認 [#ie5ef57c]
-TeraTerm, minicomなどで,SSH経由でログインできることを確...
--SSH経由でのログインの場合,ホスト名/アドレスが必要にな...
---有線LAN使用の場合:ifconfig eth0
---無線LAN使用の場合:ifconfig ath0
**配線の変更 [#aa985f51]
-con7のケーブルをcon6へ挿す
#ref(picsay-1280997322.jpg,zoom,320x160)
--図 con7に挿さっている状態
#ref(picsay-1280997383.jpg,zoom,320x160)
--図 con6に挿さっている状態
*プログラミング [#yeaf8558]
**Hello World!を出力 [#y75e71e8]
-下記のプログラムを入力
#ref(sample.c)
01:#include <sys/types.h>
02:#include <sys/stat.h>
03:#include <sys/ioctl.h>
04:#include <fcntl.h>
05:#include <termios.h>
06:#include <unistd.h>
07:#include <stdio.h>
08:#include <stdlib.h>
09:#include <string.h>
10:
11:/* シリアルインターフェースに対応するデバイスファイル...
12:#define SERIAL_PORT "/dev/ttyAM1"
13:
14:int main(){
15:
16: /* シリアルインターフェースのオープン */
17: /* O_RDWR: 入出力用にオープン */
18: /* O_NOCTTY: ノイズ等による不意のctrl-cを防ぐため,...
19: /* シリアルインターフェースをint型変数"fd"の名前で...
20: int fd;
21: fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY);
22: if(fd < 0){
23: printf("%s doesn't open it\n",SERIAL_PORT);
24: return -1;
25: }
26:
27: /* シリアルポートの設定を行う変数を宣言 */
28: struct termios oldtio, newtio;
29: /* 現在の設定を oldtio に保存 */
30: tcgetattr(fd, &oldtio);
31: /* 今回使用する設定 newtio に現在の設定 oldtio をコ...
32: newtio = oldtio;
33:
34: /* 入出力スピードの設定 */
35: /* 以下の方法1または方法2で設定.どちらかでよい */
36:
37: /* 方法1 */
38: cfsetispeed(&newtio, B115200); /* 入力スピード設定 */
39: cfsetospeed(&newtio, B115200); /* 出力スピード設定 */
40:
41: /* 方法2 */
42: cfsetspeed(&newtio, B115200); /* 入出力スピード設定...
43:
44: /* 27行目-42行目までの設定を有効にする */
45: tcflush(fd, TCIFLUSH);
46: tcsetattr(fd, TCSANOW, &newtio); /* 設定を有効に */
47:
48: /* 通信処理:シリアルデバイスに出力 */
49: char buf[255];
50: strcpy(buf,"hello");
51: write(fd, buf , sizeof(buf)); /* write関数:送信処理...
52:
53: /* デバイスの設定を戻す */
54: tcsetattr(fd, TCSANOW, &oldtio);
55: close(fd);
56: return 0;
57:}
-gcc -o sample1 sample.c
--プログラム sample.c をコンパイル
--コンパイル後の実行ファイルの名前をsample1として保存
-./sample1
--プログラムを実行
--Hello World!と表示されることを確認
**プログラムの説明 [#t5558cca]
-通信のための準備・終了処理
--16行目から46行目までがシリアル通信を行うための準備の部...
--53行目から56行目までがシリアル通信を終了させるための後...
-メインプログラム
--48行目から51行目までがシリアル通信を使ったプログラムの...
---read関数:受信(接続機器 から Armadillo-300に情報伝達)
---write関数:送信(Armadillo-300 から 接続機器に情報伝達)
*参考 [#f2f5609f]
**シリアル通信に関する重要な部分の説明 &aname(important_p...
-12行目
--#define SERIAL_PORT "/dev/ttyAM1"
---今回使用するシリアルインターフェース
-21行目
--fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY);
---シリアルインターフェースを"fd"の名前で使えるようにする.
-28-32行目
--struct termios oldtio, newtio
---非同期通信ポートを制御するための汎用ターミナルインタフ...
--tcgetattr(fd, &oldtio);
---シリアルインターフェース"fd"から,現在の設定を読み込み...
--newtio = oldtio
---現在の設定をnewtioにコピー.以後,newtioの設定を変え,...
-38-39行目
--cfsetispeed(&newtio, B115200);
---newtioの中の入力に関する通信速度の設定
--cfsetospeed(&newtio, B115200);
---newtioの中の出力に関する通信速度の設定
-42行目
--cfsetspeed(&newtio, B115200);
---36-38行目と同じことをしている.こちらは入出力を一度に...
-45-46行目
--tcflush(fd, TCIFLUSH);
---シリアルインターフェースの送受信データをクリア
~tcsetattrの実行のために必要.
--tcsetattr(fd, TCSANOW, &newtio);
---newtioを用いてシリアルインターフェース"fd"を設定.
-51行目
--write(fd, buf , sizeof(buf));
---シリアルインターフェース"fd"にsize(buf)分のデータbufを...
-54-55行目
--tcsetattr(fd, TCSANOW, &oldtio);
---シリアルインターフェース"fd"を初期の設定(oldtio)に戻す
--close(fd);
---シリアルインターフェースと名前"fd"の繋がりを開放.
**struct termiosの説明 [#iea820dd]
-struct temiosは構造体であり,以下のようになっている.
--struct termios {
---tcflag_t c_iflag; /* 入力フラグ */
---tcflag_t c_oflag; /* 出力フラグ */
---tcflag_t c_cflag; /* 制御フラグ */
---tcflag_t c_lflag; /* ローカルフラグ */
---cc_t c_cc[NCCS]; /* 特殊制御文字の設定 */
--};
***入力フラグ [#dc1f6b6a]
-端末(この場合armadillo)への入力に関する設定である.特に...
***出力フラグ [#ke19152d]
-端末(この場合armadillo)からの出力に関する設定である.特...
***制御フラグ [#z2e032b4]
-端末(この場合armadillo)のハードウェアに関する設定である...
***ローカルフラグ [#v58465fe]
-端末(この場合armadillo)のその他の設定である.ドライバと...
---tcflag_t c_lflag;
**struct termiosの使い方 [#xaaf25db]
-tcgetattrにてプログラム開始時の初期設定を読み込む
-new = old などとして初期設定と同じ新しい設定変数を作成し...
-cfsetspeedなど必要に応じて必要な箇所のみの変更を行う
-通信処理
-プログラム終了時に初期設定に戻す
**シリアルデバイスにおける入力処理の概念 [#jff3a31d]
***入力方式 [#e8abf335]
-シリアル通信では,シリアルデバイスを介して外部からデータ...
--カノニカル入力処理(デフォルト)
---外部からの全ての入力は,行単位で処理される.つまり,re...
~NL(ASCIIのLF)
~ファイル終端
~行終端文字
~注意点としては,標準の設定ではCR(DOS/Windowsのデフォルト...
--非カノニカル入力処理
---read関数を呼び出す際に読み込むデータの大きさを指定する...
***処理方式 [#if6da0d4]
-カノニカル入力処理/非カノニカル入力処理においては外部か...
--同期処理
---read関数にてデータ読み込みが始まると,データを読み終え...
--非同期処理
---read関数にてデータ読み込みが始まると,プログラム自体は...
***Armadilloでの処理 [#ib328ec6]
-シリアルに接続されたセンサなどを想定しているので非カノニ...
ページ名:
既存のページ名で編集する