2014-04-28 18 views
0

我試圖通過配置爲8n1而沒有握手的rs485連接與win ce設備進行通信。問題是該設備有兩種操作模式,充當接收器或發射器。爲了在兩種操作模式之間切換,我需要打開/關閉rts。 我試過這樣做,但該設備永遠不會改變模式,除非我在啓用或禁用rts的地方使用斷點。這導致我相信有一個時間問題,並且在我設法發送任何東西(默認模式是接收)之前,rts被打開和關閉。 我試過看關於這個話題的前幾個問題,我試過谷歌,但到目前爲止,我還沒有遇到任何東西。任何人都可以幫忙嗎?串口服務器;配置rts

這裏是我的代碼:

public static ushort Send_rs485(byte[] ToSend) 
    { 
     try 
     { 
      rs485.Write(ToSend, 0, ToSend.Length); 

     } 
     catch (TimeoutException) 
     { 
      MessageBox.Show("COM port error"); 
     } 
     return (0); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     if (COM_opened) 
     { 
      bool CTS = false; 

      rs485.RtsEnable = true; 
      rs485_Execute_cmd(on_off); 

      on_off = !on_off; 
      rs485.RtsEnable = false; 
     } 
     else 
     { 
      MessageBox.Show("COM port not opened"); 
     } 
     //rs485.RtsEnable = false; 

    } 
+1

解決方法是簡單地將兩個Thread.Sleep放在Execute_cmd調用的周圍(或至少在它之後)。我似乎記得在使用COM端口時,經常在生產中看到這種情況,無論是在C#還是在各種設備的C代碼中。 – Luaan

+1

你嚴重低估了現代處理器的速度。正如所寫的,您只需將信號打開幾個*納秒*即可。該設備可以看到的可能性非常低。它在你調試時起作用,因爲你放慢了速度。你需要一個定時器來關閉它。該方案設計得不好,如果設備沒有給你提示它切換模式,你永遠不能完全確定你保持足夠長的時間。如果確實如此,您似乎可以檢測到它不處於正確的模式,那麼當您檢測到模式開關後,當然就會將其關閉。 –

+0

謝謝你的幫助。我現在已經解決了這個問題,不幸的是(就像Luaan提到的那樣)它只是感覺很髒 –

回答

2

的基本問題是Write不會等待要傳送IIRC的所有數據。當你以合理的方式進行通信時,這不是一個大問題,因爲它仍然在等待數據被緩衝(所以你不會嘗試發送100 MiB/s),但是如果你還在做其他除了簡單的讀寫操作(在你的情況下,改變引腳)之外,這會產生一個同步問題。

這意味着您必須等待 - 通過串口進行通信通常非常緩慢。要獲得需要等待的時間量,您需要知道您要發送的數據量和波特率。例如,要通過9600波特端口發送12個字節,您需要等待10 ms。

我不確定是否有什麼東西可以用來使其感覺不太髒。