|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
シリアルポートプログラミング †CAT709, CAT760にはシリアルポートが2つあります。組込みプログラムでは、シリアルポートを良く使うと思いますので、シリアルポートを操作するための簡単なサンプルをのせます。なお、シリアルポートプログラミングの詳しいことについては文末にリンクを載せました JF シリアルプログラミングHOWTO をご覧ください。 このページで紹介しているプログラムは、プラットフォームに依存していません。
の3つのプラットフォームで動作確認しました。 機材 †実験に用いた機材は
「みはるぞう」とは微弱無線による無線センサーシリーズです。無線温度計や無線振動計などがあります。詳しくはみはるぞうのページをご覧ください。 仕様検討 †みはるぞう受信機は
の条件でアスキー文字列を送ってきます。 準備 †みはるぞう受信機 TSR-V2 は cp2101 ドライバによってUSBシリアルポート(/dev/ttyUSB0)として認識します。初めに CAT760 の root ユーザで cp2101 ドライバをロードします。 CAT760で $ su - Passwd: # modprobe cp2101 以上の操作で /dev/ttyUSB0 デバイスに「みはるぞう受信機」が接続されます。 サンプルプログラム †簡単な例 †下のプログラムはシリアルポートをopen()して、受信データを16進数で表示する簡単な例です。 /*
* シリアルポート受信サンプルプログラム
* Version 1.0 2006.10.19 Y.Ebihara (SiliconLinux)
*
* このプログラムはシリアルポートをopenして、データを16進数表示する
* サンプルプログラムです。
* i386パソコン、およびCAT760で動作検証をしています。
*
* test-machine: TSR-V2, i386PC, CAT760
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <termios.h>
#include <time.h>
#define DEV_NAME "/dev/ttyUSB0" // デバイスファイル名
#define BAUD_RATE B9600 // RS232C通信ボーレート
#define BUFF_SIZE 4096 // 適当
// シリアルポートの初期化
void serial_init(int fd)
{
struct termios tio;
memset(&tio,0,sizeof(tio));
tio.c_cflag = CS8 | CLOCAL | CREAD;
tio.c_cc[VTIME] = 100;
// ボーレートの設定
cfsetispeed(&tio,BAUD_RATE);
cfsetospeed(&tio,BAUD_RATE);
// デバイスに設定を行う
tcsetattr(fd,TCSANOW,&tio);
}
/* --------------------------------------------------------------------- */
/* メイン */
/* --------------------------------------------------------------------- */
int main(int argc,char *argv[]){
int fd;
// デバイスファイル(シリアルポート)オープン
fd = open(DEV_NAME,O_RDWR);
if(fd<0){
// デバイスの open() に失敗したら
perror(argv[1]);
exit(1);
}
// シリアルポートの初期化
serial_init(fd);
// メインの無限ループ
while(1){
int i;
int len; // 受信データ数(バイト)
unsigned char buffer[BUFF_SIZE]; // データ受信バッファ
// ここで受信待ち
len=read(fd,buffer,BUFF_SIZE);
if(len==0){
// read()が0を返したら、end of file
// 通常は正常終了するのだが今回は無限ループ
continue;
}
if(len<0){
printf("%s: ERROR\n",argv[0]);
// read()が負を返したら何らかのI/Oエラー
perror("");
exit(2);
}
// read()が正を返したら受信データ数
// 受信したデータを 16進数形式で表示
for(i=0; i<len; i++){
printf("%02X ",buffer[i]);
}
printf("\n");
}
}
Cygwinで実験する場合はデバイス名が /dev/com13 などになります。 実用的な みはるぞう 受信プログラム †上記の例は簡単なサンプルでした。実用的なみはるぞう受信プログラムを下記に載せます。 統合開発環境SWEETを使ったので簡単に出来ました(^-^)。
このプログラムはTSR-V2 から受信したデータを、 受信日, 受信時間, センサー局番号, 通し番号, 温度 のフォーマット(csvファイル)で、ログファイルに書き出すプログラムです。このプログラムをたたき台にしてオリジナルなアプリケーションを作ってみてください。 実行例 # ./miharuzo /dev/ttyUSB0 /tmp/log.csv date_str=2006/10/19, 17:00:56,buffer=$54410000000DF719904CFFFFFFFF0091 2006/10/19, 17:00:56, 0000000D, 247, 25.56, 0, 91 date_str=2006/10/19, 17:01:20,buffer=$54410002001EAA19904CFFFFFFFF0200 2006/10/19, 17:01:20, 0002001E, 170, 25.56, 2, 0 date_str=2006/10/19, 17:02:30,buffer=$5441000000077019E04CFFFFFFFF0091 2006/10/19, 17:02:30, 00000007, 112, 25.88, 0, 91 date_str=2006/10/19, 17:04:05,buffer=$53410000006AC30299FFFFFFFFFF0300 以下略 ログファイル(/tmp/log.csv)の中身 2006/10/19, 17:00:56, 0000000D, 247, 25.56, 0, 91 2006/10/19, 17:01:20, 0002001E, 170, 25.56, 2, 0 2006/10/19, 17:02:30, 00000007, 112, 25.88, 0, 91 リンク †
外部リンク 自動リンク |