シリアル通信による情報取得について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
hiropuls

シリアル通信による情報取得について

#1

投稿記事 by hiropuls » 10年前

現在私は医療機器とマイコンをシリアル通信で情報を送受信するプログラムを組んでいます。

プログラム言語については全くの初心者なのですが言語を初歩から勉強している時間が無く、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;

		}

	}

}

顔芸

Re: シリアル通信による情報取得について

#2

投稿記事 by 顔芸 » 10年前

デバッグ環境が再現できないのでなんとも言えないですが,perrorが何か教えてくれませんか・・?

「man 関数名」でネット検索し,立てているフラグの意味や関数を使う位置が意図した通りかどうか
もう一度確認されてはいかがでしょうか.

参考: man read
http://linuxjm.sourceforge.jp/html/LDP_ ... ead.2.html

閉鎖

“C言語何でも質問掲示板” へ戻る