2011-12-13 6 views
-1

この疑似コードは、センサーからデータを送受信する際に無線媒体にアクセスしようとするシンク用です。無線媒体を有限状態マシンにアクセスするシンク用の疑似コード

  1. 、いかなるセンサがポーリングパケットに応答しない場合、ポーリングパケット
  2. を送信pc = 0.01
  3. を設定したデータパケットが正常にセンサーの1つから受信された場合pc = min (pc + 0.01, 1.0)
  4. を設定し、電流値でpcを保つ
  5. 破損したデータパケットが示すように2つ以上のセンサー間に衝突がある場合は、pc = pc/2
  6. ステップ2を繰り返します。

私はHow to read a FSM diagramでリンクを読んでいて、実際にセンサー部分に役立ちました。しかし、私はまだ上記の疑似コードをFSMに変換しようとすると混乱しています。

擬似コードをFSMに変換することについての明確な説明を提供するリンクや電子ブックをお勧めしますか?

+0

タイトルは吸いますが、元々のものより優れています。それを改善してください。私はネットワーキングについてよく知らないので、あなたに任せます。 –

答えて

0

ここで本当に探しているものはわかりません。これを単純にコーディングするのはかなり簡単ですが、この問題は私にとってfull-blown FSM table-driven approachに見合うようには見えません。

ここではいくつかのCのような擬似コードは次のとおりです。

double pc = 0.01; 
int sensorsfd; 

void loop(void) { 
    for (;;) { 
     fd_set readfds, writefds, exceptfds; 
     FD_ZERO(&readfds); 
     FD_ZERO(&writefds); 
     FD_ZERO(&exceptfds); 
     FD_SET(sensorsfd, &readfds); 

     struct timeval tv; 
     tv.tv_sec = 0; 
     tv.tv_usec = 1; /* 0.001 seconds */ 

     int r; 

     send_polling_packet(); 

     r = select(sensorsfd+1, &readfds, &writefds, &exceptfds, &tv); 

     if (r == -1 && errno == EINTR) { 
      continue; 
     } else if (r == -1) { 
      perror("select() failed"); 
      exit(1); 
     } else if (r == 0) { 
     /* timeout expired */ 
      pc = min (pc + 0.01, 1.0); 
     } else if (r == 1) { 
     /* sensorsfd won't block when reading it */ 
      packet_t p = read_packet(sensorsfd); 
     /* should also handle _no packet_ if the sensors 
      socket returns EOF */ 
      if (packet_corrupted(p)) { 
       pc /= 2; 
      } else { 
       handle_packet(p); 
      } 
     } else { 
      /* error in program logic */ 
     } 
    } 
} 

擬似コード私はちょうどこれを書いて にそれをテストするためのメカニズムを持っていないという意味で。あなたのプログラムがこれよりもはるかに複雑になるなら、おそらく はselect(2)の設定をそれ自身の機能にカプセル化し、 センサーのソケットからのパケットを処理するすべての詳細をカプセル化したいでしょう。

関連する問題