シリアルポートプログラミング

CAT709, CAT760にはシリアルポートが2つあります。組込みプログラムでは、シリアルポートを良く使うと思いますので、シリアルポートを操作するための簡単なサンプルをのせます。なお、シリアルポートプログラミングの詳しいことについては文末にリンクを載せました JF シリアルプログラミングHOWTO をご覧ください。

このページで紹介しているプログラムは、プラットフォームに依存していません。

  • i386PC(普通のパソコン)Linux
  • i386PC WindowsXP + Cygwin
  • CAT760

の3つのプラットフォームで動作確認しました。

機材

実験に用いた機材は

  • EK760
  • みはるぞう受信機 TSR-V2 (USBシリアルポートとして認識します)

「みはるぞう」とは微弱無線による無線センサーシリーズです。無線温度計や無線振動計などがあります。詳しくはみはるぞうのページをご覧ください。

IMG_6394.jpg

仕様検討

みはるぞう受信機は

  • 9600bps
  • 8bit, nonparity, 1stopbit

の条件でアスキー文字列を送ってきます。
シリアルポートからのデータを受信して16進数で表示するだけの簡単なプログラムとします。

準備

みはるぞう受信機 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_pic2.png

統合開発環境SWEETを使ったので簡単に出来ました(^-^)。

filemiharuzo.c
(文字コード=EUC, ライセンス=パブリックドメイン)

このプログラムは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

リンク

外部リンク

自動リンク