/* DALLAS DS18(S)20 と DS9097U-09 を使った温度計測 * 0-85°(マイナス側未計算) * 2000-7-17 (k-wada) */ #include #include #include #include #include #define SIO "/dev/cuaa0" #define BAUD 9600 int FD232c; int buff[32]; struct termios qtermios; // Pullup 39 // Reset c1 // Skip rom cc // Date mode e1 // Convert 44 // Read mem f0 // Data read ff // Temp read be // Arm Pullup ef // Term pulse f1 int conv0[] = {9, 0x39, 0xc1, 0xe1, 0xcc, 0xe3, 0xef, 0xf1, 0xe1, 0x44}; int conv1[] = {5, 0xef, 0xe3, 0xed, 0xf1, 0xc1}; int get0[] = {15, 0xc1, 0xe1, 0xcc, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xc1}; trans(int *p) { int byte; byte = *p++; while(byte--) { usleep(5000); write(FD232c, p++, 1); } } dammyread() { int c; while(c = read(FD232c, buff, 1)) { ; } } dataread() { char c, data; float deg; for(c = 0; c < 14; c++) { read(FD232c, &data, 1); switch(c) { case 4: deg = data; break; case 5: deg += 256 * data; break; } } deg *= 0.5 ; fprintf(stderr, "%2.1f\n", deg); } int main() { int r, c, loop; if((r = open232c(SIO)) > 0) { fprintf(stderr, "Can't Open.\n"); exit (1); } loop = 1; while (loop--) { trans(conv0); /* 変換開始シーケンス */ sleep(1); /* 変換時間待機 */ trans(conv1); /* 変換終了シーケンス */ dammyread(); /* 不要な受信をクリア */ trans(get0); /* 温度データ受信指示 */ dataread(); /* 温度データ取得 */ return 0; } } int open232c(char* ttyname) { struct termios tty; int r; if((FD232c = open(ttyname, O_RDWR|O_NDELAY|O_NONBLOCK, 0477)) >= 0) { qtermios.c_iflag = IXOFF; qtermios.c_lflag = (PENDIN|ECHOKE|ECHOE); qtermios.c_cflag = (CLOCAL|HUPCL|CREAD|CS8); qtermios.c_ispeed = BAUD; qtermios.c_ospeed = BAUD; tcsetattr (FD232c, TCSANOW, &qtermios); return 0; } perror("Can't open SIO.\n"); return 1; }