2011-07-20 17 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が設定されています:

は、ここで私が設定SERIALPORTプロパティです。 Send Lineは、シリアルにデータを読み書きするタイミングを制御する方法です。 RTSが高いと書き込みでき、RTSが低い場合は読み出しのみ可能です。オシロスコープ上の通信ラインをチェックし、RTSラインが常にハイであることは、プログラムがバイトを送信するだけで、外部からはバイトまたはデータを読み取ることができないことを意味します。これがDataReceivedイベントが実行されることのない主な理由です。なぜなら、受信するバイトまたはデータは決して見られないからです。

私のシリアルポートの設定を見て、私が紛失しているものを教えてください。

+0

回答の編集を参照してください。 – dbasnett

+0

ありがとう、dbasnett。 – ThN

答えて

1

RTSが出力されるため受信とは関係ありません。 DTRまたはCTSをオンにしてみてください。

EDIT:

はRTS有効の行を削除し、RTS/CTS(それがDelphiであり、正確にわからない)のためのハンドシェイクを追加してみてください。私はピンが何であるか、彼らが何をすべきかを知っています。これがどのように配線されているかを示すピン配置がありますか?私は2 & 3が交差していると仮定し、DTRをDSRの両方向に、RTSをCTSの両方向に、

+0

ハンドシェイクの場合、私は4種類の組み込みオプション(None、RequestToSend、RequestToSendXonXoff、XonXoff)しか選択できません。しかし、私がハンドシェークオプションのためのNone以外のものを選ぶと、writeTimeoutプロパティを何に設定しても、serialport.Writeルーチンは常にタイムアウトします。そこで、書き込み手続きの前後でRTSを手動で設定してリセットしました。それはうまくいくようですが、データを読み取るための正確なタイミングを得るために、RTSをローに設定する前にNoOpループを持っていなければなりません。または、すべての受信バイトまたは応答バイトが失われます。 – ThN

+0

今、DataReceivedイベントは着信バイトを検出するため、発生しています。 – ThN

+0

@digit私はDelphiを知らないが、.Net RequestToSendハンドシェイクは送信するデータがあるときに自動的にRTSを発生させるようだ。私はあなたを混乱させて申し訳ありません。これを手動で行う場合は、RTSを立ち上げ、CTSを待ってから送信してください。 – dbasnett

関連する問題