2011-07-20 90 views
0

我在Delphi Prism下使用SerialPort。我能夠將字節發送到串行端口,但由於串行請求發送(RTS)線始終處於高電平或高電平,因此我無法從外部接收數據。那麼,您設置了什麼設置來自動切換RTS線?自動切換RTS線(Delphi Prism SerialPort)

這裏有一個串口的屬性我設置:

SerialPort1 := new System.Io.Ports.SerialPort(); 
SerialPort1.BaudRate:=19200; 
SerialPort1.DataBits:=8; 
SerialPort1.DtrEnable:=true; 
SerialPort1.Parity:=System.IO.Ports.Parity.Even; 
SerialPort1.PortName:='COM1';//'/dev/ttyS0'; 
SerialPort1.ReadBufferSize:=3000; 
SerialPort1.ReadTimeout:=1000; 
SerialPort1.ReceivedBytesThreshold:=1; 
SerialPort1.RtsEnable:=true; 
SerialPort1.StopBits:=System.IO.Ports.StopBits.One; 
SerialPort1.WriteTimeout:=1000; 
SerialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(@MySerialData); 
SerialPort1.Open; 

我有DTR集。請求發送線是您如何控制何時讀取和寫入數據到串行。 RTS很高,那麼你只能寫,如果RTS很低,你只能閱讀。我們檢查了示波器上的通信線路,並且RTS線總是高電平,這意味着我們的程序只能發送字節,但不能從外部讀取任何字節或數據。這是DataReceived事件永遠不會執行的主要原因,因爲它從不會看到任何傳入的字節或數據。

所以,看看我的串口設置後,你能告訴我我失蹤了什麼。

+0

請參閱答案中的修改。 – dbasnett

+0

謝謝,dbasnett。 – ThN

回答

1

RTS是輸出,所以它不會與接收有關。嘗試開啓DTR和/或CTS。

編輯:

嘗試刪除,啓用RTS線和增加對RTS/CTS握手(不知道這是在Delphi什麼)。我知道這些針腳是什麼以及它們應該做什麼。你有沒有顯示如何連線的引腳。我假設2個3 & 3個交叉,DTR到DSR兩個方向,RTS到CTS兩個方向。

+0

對於握手,我只有4種不同的內置選項可供選擇 - 無,RequestToSend,RequestToSendXonXoff和XonXoff。但是,如果我選擇除None之外的其他任何人作爲握手選項,那麼無論我將writeTimeout屬性設置爲什麼,serialport.Write例程都會超時。因此,我在寫入過程之前和之後手動設置和重置RTS。它似乎工作,但只有在將RTS設置爲低電平以獲取讀取數據的精確時間之前,我必須有一個NoOp循環。或者所有傳入或響應字節丟失。 – ThN

+0

現在,我的DataReceived事件觸發,因爲它看到傳入的字節。 – ThN

+0

@digit我不知道德爾福,但在.Net RequestToSend握手似乎會自動提高RTS時,它有數據發送。對不起,如果我困惑你。如果您正在手動執行此操作,請提升RTS,等待CTS,然後發送。 – dbasnett