2012-08-10 139 views
0

我必須從計算機(VB.NET)逐個字節地發送文件到串行連接的AT89s52。
每個發送字節都需要一些時間在微控制器上做一些工作。
這裏是一個接收的字節我的C代碼相關部分:8051 UART,串行接收字節

SCON = 0x50; 
TMOD = 0x20; // timer 1, mode 2, 8-bit reload 
TH1 = 0xFD; // reload value for 9600 baud 
TR1 = 1; 
TI = 1; 

again: 

     while(RI!=0) 
     { 
      P1=SBUF;   // show data on led's 
      RI=0; 
      receivedBytes++; 
     } 

     if (key1==0) 
     { 
      goto exitreceive; // break receiving 
     } 

     show_lcd_received_bytes(receivedBytes); 
     // here is one more loop 
     // with different duration for every byte 
     goto again; 

這裏是發送字節VB.NET代碼:

For a As Integer = 1 To 10 
     For t As Integer = 0 To 255 
      SerialPort1.Write(Chr(t)) 
     Next t 
    Next a 

問題是,三菱商事有一些工作之後都要做收到的字節和VB.NET不知道這一點,併發送字節太快,所以在mC完成了所有字節的一部分(約10%)。 我可以合併「睡眠(20)」在VB循環螞蟻然後事情會工作,但我有很多浪費時間,因爲每個字節需要不同的時間來處理,這將是不可接受的慢速通信。

現在,我的問題是,如果8051可以設置一些繁忙狀態的UART,VB可以讀取之前發送決定發送字節或不。 或者如何以其他方式設置所述的通信? 我也嘗試接收具有相同結果的mC端串行中斷字節。

硬件肯定是好的,因爲我可以很好地發送數據到計算機(如預期)。

+1

降低波特率。 – 2012-08-10 12:05:28

+0

爲什麼在通信正常工作時降低波特率? – 2012-08-10 12:54:38

+1

當你失去了90%的數據,因爲微控制器無法跟上,那麼你通常不會說「通信工作正常」。 – 2012-08-10 12:59:01

回答

1

您的問題是建築。不要嘗試在處理字節Rx的中斷處理接收到的數據。讓您的字節Rx中斷僅將接收到的字節複製到單獨的Rx數據緩衝區,並有一個後臺任務來處理傳入數據,而不阻塞Rx中斷處理程序。如果由於整體吞吐量問題而無法跟上,那麼RTS/CTS流量控制就是合適的機制。例如,當您的Rx緩衝區滿了90%時,請取消確保流量控制信號以暫停發送端。

+0

是的,我注意到了這一點。但我如何將MAX232用於TX/RX我有兩對I/O對可用於實現RTS/CTS信號。我在這個領域是新的,所以我可能8051 UART已經有了一些握手數據流的機制。現在情況更清楚了。謝謝。 – 2012-08-11 08:55:26

1

從過去的爆炸,我記得使用突破框來串行線跟蹤器調試這種東西。

使用串行通信,如果您已經使用了所有引腳/線纜,那麼通過RTS(就緒發送)和DTR(數據終端就緒)進行流量控制,用於發送何時可以發送更多數據。你對通過C編碼的設備有控制嗎?在VB.NET中,有些事件用於接收這些信號,或者可以使用SerialPort對象上的屬性查詢它們。

+0

那麼tcarvin,我有控制該設備,但我不知道它是否支持設置RTS和DTR位以及如何設置它。其實,這確實是我對8051的一些有經驗的用戶的原始問題。 – 2012-08-10 12:57:16

1

由於@TJD提到硬件流量控制可用於在微型計算機處理接收到的字節時停止PC發送字符。在過去,我通過使用可用的端口線作爲輸出來實現硬件流。輸出需要連接到TTL到RS-232驅動器(如果您當前正在使用RS-232,則可能有另外的驅動程序可用)。如果您使用USB虛擬串行端口或RS-422/485,則需要實施軟件流控制。通常會發送一個控制S以告訴PC停止發送並且控制-Q繼續。爲了充分利用流量控制,您很可能還需要實現完全中斷驅動的FIFO來接收/發送字符。

如果您需要有關硬件流量控制的更多信息,請查看http://electronics.stackexchange.com

+0

謝謝你的建議傑夫。在我的電路板上,我有免費的資源來做TTL/RS232轉換,(幸運的是)這兩個信號是準確的。 – 2012-08-11 08:58:42

0

很多這些答案都建議硬件流量控制,但您也可以選擇使用軟件流量控制來增強您的傳輸,使其更加健壯。目前,您的通信很強大,但是如果您開始運行更高的波特率或更長的距離,或者即使只是嘈雜的連接,也可能會收到錯誤字符或字符可能丟失的字符。

您可以在完成設定的任何操作後添加一個簡單的雙字節ACK序列。它可能是這個樣子:

上位機發送命令字節:<爲0x00> 裝置回命令字節:<爲0x00> 設備執行任何操作,需要 設備發送ACK/NAK字節(基於結果):

如果通訊中斷,這將允許您在主機端查看。迴應的角色可能與發送的內容不匹配,從而提醒您出現問題。另外,如果主機在某個超時時間內沒有收到字符,主機可以嘗試重新發送。最後,ACK/NAK讓你選擇返回一個狀態,但最重要的是它會讓主機知道你已經完成了操作,並且它可以發送另一個命令。

這可以擴展爲包含校驗和,以便設備驗證接收到的命令是否有效(與命令字節一起發送的簡單邏輯反轉就足夠了)。

該解決方案的優點是不需要額外的線路或任何一端的UART支持硬件流量控制。