- armadillo300にはシリアルポートがCON6とCON7の二つ用意されている.CON7はPCと接続し,ログインやコンパイルなどの各種作業に使用する.一方,CON6をセンサ・サーボコントローラに接続し,センサ情報の取得やサーボ駆動のためのコマンド送受信に用いる.プログラム上ではCON6は下記のデバイス名で使用することができる.
シリアル通信プログラム†
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を防ぐため,tty制御なし */
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で設定.どちらかでよいので方法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: /* ここからがユーザ固有の処理:例として文字列 hello を送信(write関数).受信はread関数 */
49: char buf[20];
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:}
- 通信のための準備・終了処理
- 16行目から46行目までがシリアル通信を行うための準備の部分である.基本的にプログラムによってあまり変更がないので,丸覚えでもかまわない.
- 53行目から56行目までがシリアル通信を終了させるための後始末の部分である.基本的にプログラムによって変更はないので,丸覚えでもかまわない.
- メインプログラム
- 48行目から51行目までがシリアル通信を使ったプログラムの部分である.ここで,自分の考えた処理を行わせる.特に51行目が重要であり,write関数によって接続機器に情報を送信している.
- read関数:受信(接続機器 から Armadillo-300に情報伝達)
- write関数:送信(Armadillo-300 から 接続機器に情報伝達)
- 基本的には,「通信のための準備・終了処理」の部分は殆ど定型であり,丸覚えでかまわない
詳細説明†
- 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"から,現在の設定を読み込みoldtioに保存
- newtio = oldtio
- 現在の設定をnewtioにコピー.以後,newtioの設定を変え,tcsetattr(fd,&newtio)などでシリアルインターフェース"fd"の設定変更を行う.最後にtcsetattr(fd, TCSANOW, &oldtio)にてシリアルインターフェース"fd"を初期の設定に戻す.大まかな流れは後ほど説明.
- 38-39行目
- cfsetispeed(&newtio, B115200);
- cfsetospeed(&newtio, B115200);
- 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"の繋がりを開放.
#include(): Limit exceeded:
ゼミのお話/ロボット工学者養成所/一覧/シリアル通信/構造体struct termios
その他・シリアル通信に関する情報†
入力データの取り扱い†
#include(): Limit exceeded:
ゼミのお話/ロボット工学者養成所/一覧/シリアル通信/入力方式と処理方法
#include(): Limit exceeded:
ゼミのお話/ロボット工学者養成所/一覧/シリアル通信/カノニカル・非カノニカル入力方式
#include(): Limit exceeded:
ゼミのお話/ロボット工学者養成所/一覧/シリアル通信/同期・非同期処理
#include(): Limit exceeded:
ゼミのお話/ロボット工学者養成所/一覧/シリアル通信によるデバイス制御/Armadillo300におけるシリアルデバイスの推奨入力方法