串口

2012-08-27 42 views
-1

我應該做等到發送到串行端口串口

的所有數據,以測試該條件假定波紋管的代碼:

  Console.WriteLine("Baud is:" + SerialPortObj.BaudRate); 
      Console.WriteLine(DateTime.Now.Millisecond); 
      string tmpStr=""; 
      for (int i = 0; i < 100; i++) 
      { 
       tmpStr += "A"; 
      } 
      SerialPortObj.Write(tmpStr.ToCharArray(),0,99); 
      Console.WriteLine(DateTime.Now.Millisecond); 

例如輸出爲:

波特率是:300

這表明.Net並沒有等到所有要發送的字符!

只提下面的代碼不工作:

  Console.WriteLine("Baud is:" + SerialPortObj.BaudRate); 
      Console.WriteLine(DateTime.Now.Millisecond); 
      string tmpStr=""; 
      for (int i = 0; i < 100; i++) 
      { 
       tmpStr += "A"; 
      } 
      SerialPortObj.Write(tmpStr.ToCharArray(),0,99); 

      while (SerialPortObj.BytesToWrite>0) 
      { 
       Thread.Sleep(1); 
       Console.WriteLine(SerialPortObj.BytesToWrite); 
      }; 

      Console.WriteLine(DateTime.Now.Millisecond); 

例如輸出爲:

波特率是:300


我是一個特殊的協議,是工作取決於波特率改過來,並使用一些東西像如下:

 ->[Send Some Bytes (Baud300)] 

     <-[Receive Another Bytes (Baud9600)] 

,所以我想通過寫方法來發送一些字符和等待,直到它完成,完成之後我的權利嘗試改變波特率,所以我可以理解收到的字節


有什麼想法嗎?

+0

可能它發送數據真的很快嗎?嘗試增加循環到10000次迭代,看看接下來 – Reniuz

+1

會發生什麼,因爲波特是300,因此每個字符持續大約23毫秒。 – mefmef

+0

有一個開始和一個停止位,我會期望每個字符33ms或DRIVER發送所有100個字符。一般來說,串口write()調用不會等待所有字符。實際上被送出去了。什麼是實際的tx?您似乎忘記告訴我們調試信息的重要項目。 –

回答

0

嘗試存儲在一個變量的數據,並在特定條件apear(可以由你設置),該變量的值發送到串行端口

+0

我想你不明白我的情況。我的問題是條件或以另一種方式我如何理解所有字節被髮送? – mefmef

2

首先串行端口是無狀態的。所以,如果波特率發生變化,您無法確定何時達到正確的時間點。由於您要實現自己的特殊協議,您必須能夠控制通信雙方(發送者/接收者)。所以在這種情況下,我強烈建議將Handshake屬性設置爲RequestToSend並檢查DtrEnable屬性。

另外,您應該在通過自己的任務/線程監視的通信的每個站點上使用兩個緩衝區(接收/發送)。如果你將東西推入輸出緩衝區,任務檢查是否可以發送(CtsHolding,DsrHolding),如果是,則更改波特率並將該數據推送到線路上。等待持有屬性設置回來,然後將波特率更改爲另一個值。傳入的線程在這種情況下非常簡單。它只是等待DataReceived事件,導致波特率的更改由外出任務完成。

如果您使用硬件握手(我強烈建議您的情況),然後確保您的串行端口支持它正確。大多數USB轉串口適配器與19200-8-N-1的其他產品不一樣。因此,在你認爲你沒有正確編碼或SerialPort類是越野車嘗試找到兩臺機器與真實串行端口(或一臺機器有兩個端口進行測試)。

+0

這可能會工作..我從來沒有見過每個方向不同波特率的串行鏈接:( –

+0

@MartinJames:是的,我也從來沒有見過這個(我也不會這樣做),但如果OP喜歡得到進入這個麻煩。;-) – Oliver

0

在硬件上做?

您可能會嘗試使用兩個串行適配器,配置爲300/9600。一個是Tx,另一個是rx。你將需要一個'有趣的電纜'與針2/3拆分爲不同的D型,但應該工作。