/* UDP シリアル相互変換プログラム mes2用 処理手順 UDP受信待ち 受信したら、内容確認し、h83664へシリアルDATAを送る シリアルDATAを1秒間の間待つ。返事が来なかったら、udpへTIMEUPを送信 シリアルより返答を受け取ったら、内容をUDPで送信する */ #include #include //#include "./itu.h" #include "./y_sci1.h" //ソケット int sk; //UPD受信設定 struct sockaddr addr, recv; //LANから受け取るdataの入れ物 unsigned char urdata[20]; //SCIからのdataの入れ物 unsigned char sdata[20]; //dataのシリアル番号の入れ物 unsigned char snum,snum2 ; //flug=1のとき、UDP受信あり 2:前回と同じDATA受信 int flug ; //flug2=1のとき、sci待ち受け解除 int flug2 ; //itu割込み用カウンタ unsigned int count; /* //itu1割り込み処理 #pragma interrupt void warikomi(void) { int i; unsigned char c; c = TISRA; c = c & (~2); TISRA = c; //割り込みフラグをクリア*必ず必要 count++; if( count > 2000) { count = 0; flug2 = 1; } // y_outch1( 'L' ) ; return; } */ /*主処理__*/ int main(void) { int i; char tmpc; char tmpc2; //変数の初期化 snum=' ';snum2=' '; flug = 0 ; flug2 = 0; for(i=0;i<20;i++){ urdata[i] = ' ' ; sdata[i] = ' ' ;} count=0; //UDP受信DATAの大きさを入れる int size = 0; //sci設定 y_inisci12((unsigned char) 2 , (unsigned char) 129 ); /*LAN設定__*/ ifconfig("ne0",IPADDR(192,168,11,7),IPADDR(255,255,255,0)); sk = udp_socket(); if(sk == -1) {return 0;} //ポート設定 addr.sin_port = 124; //相手のアドレス addr.sin_addr = IPADDR( 192,168,11,4 ); //ソケットにアドレスを割り当てる udp_bind(sk, &addr); /*__LAN設定*/ //割り込みベクタアドレスの指定 *必ず必要 //set_handler(28,warikomi); // int_enable(); // printf("start"); // y_outch1( 'S' ) ; /*無限ループ__*/ while (1) { // printf("_"); // y_outch1( '_' ) ; //udp受信 udp_timeout(sk,100); size = recvfrom(sk, urdata, 20, &recv); //受信DATAがある場合 if(size > 0) { //受け取ったDATAが前回受け取ったDATAと同一か否かの検査 snum2 = snum ; snum = urdata[19] ; flug = 1; if( snum == snum2 ){ flug = 2; } // y_outch1( 'j' ) ; } //同じ命令をもう一度受け取った場合の処理 if( flug == 2) { flug = 3; sendto(sk, urdata, 20, &recv); // printf("same"); // y_outch1( 'O' ) ; } //命令を受け取った場合の処理 if( flug == 1) { flug = 3; //シリアルに発送する。 for(i=0;i<20;i++){ // tmpc2 = urdata[i]; // printf( &tmpc2,1 ) ; y_outch1( urdata[i] ) ; if(urdata[i]=='!'){break;} } //規定時間待つタイマーをスタート //タイマー割り込みで規定時間後にSCI受信待ちを解除(flug2を1にSET) // itu1( 1250 , 3 ); // 1/20000000 * 1250 * 2^3 = 1/2000秒 //SCI受信。!を受けるまでSCI受信を続ける for(i=0;i<20;i++){ sdata[i] = ' ' ; } i = 0; count=0; while (1){ tmpc = y_inchn() ; if(tmpc != '_'){ if(tmpc != -1){ sdata[i] = tmpc ; i++ ; } } if(tmpc == '!' ){ break ; } if(flug2 >0 ){ break ; } if(i == 18 ){ sdata[18]='!' ; break ; } count ++; if(count>30000){ flug2 = 1;} } //SCI待ちtimeOver以外なら、LANよりシリアル受信DATAを発送する // itu1end();count = 0; //タイマー終了 count = 0; if(flug2 >0 ) { flug2 = 0 ; sdata[0] = 'A'; sdata[1] = 'A'; sdata[2] = 'T'; sdata[3] = 'I';sdata[4] = 'M'; sdata[5] = 'E';sdata[6] = 'U'; sdata[7] = 'P'; sdata[8] = '!'; }//TimeOver(1sec) sdata[19] = snum; sendto( sk, sdata, 20, &recv ); } if( flug == 3){ flug = 0;} }/*__無限ループ*/ } /*__主処理*/