シリアル通信による情報取得について
Posted: 2014年10月17日(金) 12:55
現在私は医療機器とマイコンをシリアル通信で情報を送受信するプログラムを組んでいます。
プログラム言語については全くの初心者なのですが言語を初歩から勉強している時間が無く、NETから使えそうなソースコードを流用させて頂きプログラムを組んでいます。
現在医療機器から情報を取得するところまでは行き着いたのですが、連続取得をしようとするとwhileの頭に戻らず180行目のERRORが出てしまいます。
EROORが出る理由がわからないのですが教えて頂けないでしょうか?
プログラム言語については全くの初心者なのですが言語を初歩から勉強している時間が無く、NETから使えそうなソースコードを流用させて頂きプログラムを組んでいます。
現在医療機器から情報を取得するところまでは行き着いたのですが、連続取得をしようとするとwhileの頭に戻らず180行目のERRORが出てしまいます。
EROORが出る理由がわからないのですが教えて頂けないでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <termios.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#define DEV_NAME "/dev/ttyUSB0" // デバイスファイル名
#define BAUD_RATE B19200 // RS232C通信ボーレート
#define BUFF_SIZE 4096 // 適当
#define FIELD_MAX_SIZE 64 // 適当
#define FILE_NAME_SIZE 256
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
//volatile int STOP=FALSE;
// シリアルポートの初期化
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 );
}
void set_out_file_name(char *out_file_name, char *sampling_time)
{
FILE *fp;
char sampling_year[5];
char sampling_month[3];
char sampling_day[3];
char sampling_hour[3];
char sampling_min[3];
static char outfname[256] = "";
sampling_year[0] = sampling_time[0];
sampling_year[1] = sampling_time[1];
sampling_year[2] = sampling_time[2];
sampling_year[3] = sampling_time[3];
sampling_year[4] = 0x00;
sampling_month[0] = sampling_time[4];
sampling_month[1] = sampling_time[5];
sampling_month[2] = 0x00;
sampling_day[0] = sampling_time[6];
sampling_day[1] = sampling_time[7];
sampling_day[2] = 0x00;
sampling_hour[0] = sampling_time[8];
sampling_hour[1] = sampling_time[9];
sampling_hour[2] = 0x00;
sampling_min[0] = sampling_time[10];
sampling_min[1] = sampling_time[11];
sampling_min[2] = 0x00;
//稼働データ保存ファイル名
sprintf(out_file_name,"/home/pi/Projects/BP840/BP840_1/DATE/BP840(01)_%s_%s%s_%s:%s.csv",
sampling_year, sampling_month, sampling_day,sampling_hour,sampling_min);
if (strcmp(out_file_name, outfname) != 0)
{
printf("%d %s, %s\n",strcmp(out_file_name, outfname), out_file_name, outfname);
fp = fopen(out_file_name,"a");
if( fp == NULL )
{
printf("Can't open!\n",out_file_name);
exit(-1);
}
fprintf(fp, "TIME(Real),TIME(Machine),SpO2,BPM,PA,STATUS 1,STATUS 2\n");
fclose(fp);
strcpy (outfname, out_file_name);
}
}
/*----------------------------------------------------------------------------*/
/*メイン*/
/*----------------------------------------------------------------------------*/
int main( int argc, char *argv[] )
{
char out_file_name[FILE_NAME_SIZE];
struct termios oldtio,newtio;
char buf[255];
FILE *fp;
char *fname = "BP840(01).csv";
int fd;
int i;
int res;
int read_size; // データ数(Byte)
unsigned char buffer [ BUFF_SIZE ];
int in_data_size;
unsigned char in_data[ BUFF_SIZE ]; // データバッファ
unsigned char buft[ FIELD_MAX_SIZE ];
unsigned char buf1[ FIELD_MAX_SIZE ]; // buf1.日付
unsigned char buf2[ FIELD_MAX_SIZE ]; // buf2.時間
unsigned char buf3[ FIELD_MAX_SIZE ]; // buf3.SpO2(酸素飽和度)
unsigned char buf4[ FIELD_MAX_SIZE ]; // buf4.BPM(心拍数)
unsigned char buf5[ FIELD_MAX_SIZE ]; // buf5.PA(パルス振幅)
unsigned char buf6[ FIELD_MAX_SIZE ]; // buf6.状態1
unsigned char buf7[ FIELD_MAX_SIZE ]; // buf7.状態2
int scan_count;
unsigned char *status_message1;
unsigned char *status_message2;
fd = open( DEV_NAME,O_RDWR ); // デバイスファイル(シリアルポート)オープン
if( fd < 0 ) { // デバイスのopen()に失敗したら
perror( argv[ 1 ] );
exit( 1 );
}
serial_init( fd ); // シリアルポートの初期化
in_data_size = 0;
// メインの無限ループ
while (1){
read_size = read( fd, buffer, BUFF_SIZE ); // 受信待ち
write(fd , "SNDF\r" , 9); //機器に送るコマンド
if( read_size == 0 )
{
continue;
}
// read()が0を返したら、End of file
// 通常は正常終了するのだが今回は無限ループ
if( read_size < 0 )
{ // read()が負を返したら何らかのI/Oエラー
printf( "%s: ERROR\n",argv[ 0 ] );
perror( "" );
exit( 2 );
}
// read()が正を返したら受信データ数
for( i = 0 ; i < read_size ; i++ )
{
in_data[ in_data_size ++ ] = buffer[ i ];
}
if( ( in_data[ in_data_size - 1 ] == 0x0a ) || ( in_data[ in_data_size - 1 ] == 0 ) )
{
in_data[ in_data_size - 1 ] = 0x0a;
in_data[ in_data_size ] = 0;
buf1[ 0 ] = 0x00;
buf2[ 0 ] = 0x00;
buf3[ 0 ] = 0x00;
buf4[ 0 ] = 0x00;
buf5[ 0 ] = 0x00;
buf6[ 0 ] = 0x00;
buf7[ 0 ] = 0x00;
scan_count = sscanf( in_data, "%s %s %s %s %s %s %s", buf1, buf2, buf3, buf4, buf5, buf6 ,buf7);
in_data_size = 0;
time_t now;
struct tm *ltm;
time(&now);
ltm = localtime(&now);
int tyear;
int tmon;
int tday;
int thour;
int tmin;
tyear = ltm->tm_year+1900;
tmon = ltm->tm_mon+1;
tday = ltm->tm_mday;
thour = ltm->tm_hour;
tmin = ltm->tm_min;
sprintf(buft,"%d%d%d%d%d",tyear,tmon,tday,thour,tmin);
printf( "%5d-%2d-%2d %3d:%3d:%3d\t\t %s\n",
ltm->tm_year+1900,ltm->tm_mon+1,ltm->tm_mday,ltm->tm_hour,ltm->tm_min,ltm->tm_sec,
buf );
printf("(>_<)%s\n(>_<)",buf);
set_out_file_name(out_file_name,buft);
fp = fopen(out_file_name,"a");
if(fp == NULL)
{
printf("Can't open!\n",fname);
return -1;
}
fprintf(fp, "%5d-%2d-%2d %3d:%2d:%2d, %s\n",ltm->tm_year+1900,ltm->tm_mon+1,ltm->tm_mday,ltm->tm_hour,ltm->tm_min,ltm->tm_sec, buf);
fclose(fp);
continue;
}
}
}