2010-02-18 115 views
0

我正在嘗試將數據寫入串行端口,然後等待確認。收到確認後,我寫下一組數據。 請建議一種做法。我嘗試了下面的代碼,但在收到答案之前,寫作觸發並完成執行。
當我在調試模式下運行它時,它工作正常,但運行沒有斷點時,它無法正常運行。如何在寫入時管理寫入和讀取串行端口取決於讀取數據

// some data for writing 
byte[] data = "xxx"; 
byte[] data1 = "yyy"; 
byte[] data2 = "zzz"; 

// loop to write the above 5 times 
int times = 1; 
for (int i = 0; i < 20; i++) 
      { 
       if (Flag == true) 
       { 
        Flag = false; 
        if (times <= 5) 
        { 
         serialPort.Write(data, 0, data.Length); 
         serialPort.Write(data1, 0, data1.Length); 
         serialPort.Write(data2, 0, data2.Length); 
         times = times + 1; 
        } 
       } 
       else 
       { 
        MessageBox.Show("Some problem in ack..."); 
       } 
      } 
      Flag = true;  

private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      //char[] buffer = new char[4]; 
      //serialPort.Read(buffer, 0, 4); 
      Flag = true; 
     } 

回答

0

不知怎的,這已經制定出來,

byte[] data = "Your message to be sent on serial port"; 
    serialPort.Write(data, 0, data.Length); 

    byte[] buffer = new byte[16]; 
    int vintctr = 0; 
        while (vintctr < 16) 
         vintctr += serialPort.Read(buffer, 0, 16); 

Debug this and you you can get the reply from the port. 
0

您是否嘗試使用Flag作爲ack?邏輯沒有意義。難道你需要做的是這樣

while (Flag == false) 
    ; //wait for flag to become true after previous write 
...write... 
Flag = false; 
+0

我試圖堅持着這個簡單的方法g循環運行,直到data_received_from_port不再將標誌設置爲真。它在我使用斷點運行程序時起作用。但是如果我直接運行它,它不會工作。已收到確認(由我使用消息框進行檢查),但可能不會發生同步。你認爲設備不能正確發送消息嗎? – subho 2010-02-26 06:38:16

+0

問題可能出在時間上。您無法控制DataReceived何時發生 - 它可能在接收到1個字節後發生,或者很多。如果它在收到1個字節後發生,然後您立即發送下一個數據包,則可能會使設備混淆。當您將MessageBox放入時,您可以大大改變時間。如果您更新了上面的代碼,並且您迄今爲止所做的任何更改將會很有幫助。 – mtrw 2010-02-26 07:24:49

0

你需要一個狀態機模式,或至少一些儲存狀態的方式。 「國家」是指你在閱讀/寫作過程中所處的位置。狀態機通常用於通信的基本設計模式(或任何事件驅動程序),在他們讀了一下:

http://www.codeproject.com/KB/architecture/statepatterncsharp.aspx

http://www.dofactory.com/Patterns/PatternState.aspx

http://en.wikipedia.org/wiki/State_pattern(我不喜歡他們的樣品選擇這裏)

+0

感謝Addys。我想了解如何在我的情況下實現這種模式。一旦我得到答案,我一定會回覆我的答覆。 – subho 2010-02-26 06:35:14