TDS01Vを制御するプログラムを書く

公開日: : 最終更新日:2013/11/12 電脳メガネ

記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

ひとまずTDControl2(テスト版): ぷろぐらむとかを参考に、リセットを行うプログラムを書いてみた。

/lang/c/tds01v/sample.c ? CodeRepos::Share ? Trac にも上げてあります。


/* MacでUSB経由にてTDS01Vの値を取得する
*/

#include<stdio.h>
#include<stdlib.h>
#include<strings.h>
#include<termios.h>
#include<unistd.h>
#include<fcntl.h>

#define BAUDRATE B9600 /* 通信速度の設定 */
#define MODEMDEVICE "/dev/cu.usbserial-0000103D" /* デバイスファイルの指定 */

#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

int main()
{
int fd, c, res; /* fd:ファイルディスクリプタ res:受け取った文字数 */
struct termios oldtio, newtio; /* 通信ポートを制御するためのインターフェイス */
char buf[255]; /* 受信文字を格納 */

if((fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ))==-1){
/* O_RDWR:読み書き両用 O_NOCTTY:tty制御をしない */
perror(MODEMDEVICE);
exit(-1);
}

tcgetattr(fd, &oldtio); /* 現在のシリアルポートの設定を待避させる*/
bzero(&newtio, sizeof(newtio)); /* 新しいポートの設定の構造体をクリアする */
newtio.c_cflag = (BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD);

/*
BAUDRATE: ボーレートの設定
CRTSCTS : 出力のハードウェアフロー制御
CS8 : 8n1 (8 ビット,ノンパリティ,ストップビット 1)
CLOCAL : ローカル接続,モデム制御なし
CREAD : 受信文字(receiving characters)を有効にする.
*/

newtio.c_iflag = (IGNPAR | ICRNL);
/*
IGNPAR : パリティエラーのデータは無視する
ICRNL : CR を NL に対応させる(これを行わないと,他のコンピュータで
CR を入力しても,入力が終りにならない)
それ以外の設定では,デバイスは raw モードである(他の入力処理は行わない)
*/

newtio.c_oflag = 0;
/* Raw モードでの出力 */

newtio.c_lflag = ICANON;
/*
ICANON : カノニカル入力を有効にする
全てのエコーを無効にし,プログラムに対してシグナルは送らせない
*/

tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
/* モデムラインをクリアし,ポートの設定を有効にする */

/*
端末の設定終了.
行の先頭に 'z' を入力することでプログラムを終了させる
*/
puts("START");

// リセットコマンドを書き込んでみる
// buf[0] = 0x0F;
// write(fd,buf,1);
// sprintf(buf, "%s\n", "0F");
// write(fd,buf,255);
puts("WRITE");
// sprintf(buf, "%s\n", "0F");
buf[0] = '0';
buf[1] = 'F';
buf[2] = 0x0a;
buf[3] = 0x0d;
printf("%02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3]);
write(fd,buf,4);

// 応答を読み取ってみる
puts("READ");
res = read(fd,buf,1);
puts("AFTER READ");
printf("res=%d\n", res);
buf[--res]=0;
printf(":%s:%d\n", buf);

if(0){ // ひとまずコメントアウト
while (STOP==FALSE) { /* 終了条件が満たされるまでループ */
puts(".");
// res = read(fd,buf,255);
res = read(fd,buf,255);
buf[--res]=0; /* 文字列の終端をセットする */
printf(":%s:%d", buf, res);
if (buf[0]=='z') STOP=TRUE;
}
}
puts("END");
tcsetattr(fd, TCSANOW, &oldtio); /* 退避させた設定に戻す */
close(fd); /* シリアルポートを閉じる */
return(0);
}

駄目だ。


res = read(fd,buf,1);

で止まってしまう。どこがいけないのかなあ??

関連記事

サンフランシスコのピア39にあるチャウダーズでクラムチャウダーを食す!

lolipop アップルの開発者向けイベント「WWDC2014」

ミスドのカルピスドーナツとカルピスポンデリングを食べてみた!

ミスドで期間限定のカルピスコラボ商品「カルピスドーナツ」と「カルピ

十三カレー計画で牛すじカレーネギのせを食す!(大阪・十三)

「iPhoneアプリ開発キャンプ@大阪」のランチで、十三カレー計画

大阪・難波の加寿屋 法善寺でかすうどんを食す。ランチタイムはおにぎり2個まで無料!

大阪・難波の加寿屋 法善寺 (かすうどん KASUYA)で、かす

ライブドアブログで運営していた「あきお商店」を「卵は世界である」に改名しました

少し前からライブドアブログで「あきお商店」というブログをやって

→もっと見る

PAGE TOP ↑