2011-12-13 28 views
-1

該僞代碼用於試圖訪問發送和接收來自傳感器的數據的無線介質的接收器。用於將無線介質接入有限狀態機的接收器的僞代碼

  1. 設置pc = 0.01
  2. 發送輪詢包
  3. 如果沒有傳感器響應於輪詢包,設置pc = min (pc + 0.01, 1.0)
  4. 如果數據分組被成功地從傳感器中的一個接收到的,保持pc在電流值
  5. 如果兩個或多個傳感器之間發生碰撞,如數據包損壞所示,請設置pc = pc/2
  6. 重複步驟2

我已閱讀How to read a FSM diagram的鏈接,它確實對我的傳感器部分有所幫助。但是我仍然對將上述僞代碼轉換爲FSM感到困惑。

任何人都可以提出一個鏈接或電子書,給出了關於將僞代碼轉換爲FSM的清晰解釋?

+0

標題很爛,但它比你原來的要好。請改善它;我對網絡不太瞭解,所以我會把它留給你。 – 2011-12-14 01:16:46

回答

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)設置封裝到它自己的函數中,並且可能需要處理來自傳感器套接字的數據包的所有細節。

相關問題