2010-11-21 6 views
3

私はArduinoマイクロコントローラを持っています。マイクロコントローラの作品(私は、マイクロコントローラは、データを「吐く」を私に示してアプリを持っている事は、私はhttp://www.c-sharpcorner.com/uploadfile/eclipsed4utoo/serialportcommunication12082008111137am/serialportcommunication.aspxからいくつかのコードを(実施しているということです):。マイクロコントローラから読み取る

ここで私はSERIALPORT

を初期化します
_serialPort = new SerialPort("COM17", 19200, Parity.None, 8, StopBits.One); 
_serialPort.Handshake = Handshake.None; 
_serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); 
_serialPort.ReadTimeout = 1000; 
_serialPort.WriteTimeout = 1000; 
_serialPort.Open(); 

そして、ここで私は、リスニングのハンドラがあります。

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    Thread.Sleep(1000); 
    string data = _serialPort.ReadLine(); 
    this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data }); 
} 

をしかし、私はこのエラーを取得:。ハンドラでstring data = _serialPort.ReadLine();The operation has timed out.

COMポートはCOM17でポートは開きます(マイクロコントローラのLEDがそれを示しています)。なぜ操作がタイムアウトしたのか?

つまり、マイクロコントローラにロードされたプログラムは、1秒でデータを「撮影」するように設定されています。

+0

thread.sleepには理由がありますか?データを受信する準備ができたら、関数は呼び出されませんか? –

+0

もし私がthread.sleepにコメントしたら、プログラムはより速く停止します。 (つまり1秒早く) – Alex

+0

ハイパーターミナル(またはあなたが持っているコンソールポート)にこれらのCOM設定を試しましたか?あなたは最初に30秒のような長いタイムアウトを試しましたか? –

答えて

2

問題の原因は、配線の反対側にある可能性があります。 SerialPort.ReadLine()を完了させ、タイムアウトエラーを生成しないようにするには、行末の文字シーケンスを送信する必要があります。 SerialPort.NewLineの値。デフォルトで改行制御文字( "\ n")になります。文字の代わりにバイトを送信する場合は、代わりにRead()を使用する必要があります。

また、通信エラーを検出できるように、ErrorReceivedイベントを実装する必要があります。 Baudrate、Parity、Databits、Stopbitsなど、通信パラメータが一致しない場合に表示される種類。

+1

@Badescu:ハンスの応答が明確でない場合は、行末の文字を読み取るかタイムアウトするまで、ReadLineは返されません。あなたのデバイスがEOLを送信していないようです。 – Tergiver

+0

@Hans古い回答にコメントして申し訳ありませんが、私はシリアル通信で[問題](http://stackoverflow.com/q/18789887/2208810)を持っています。私は同様の質問をたくさん検索しましたが見つかりませんでしたあなたは私に何か助けてもらえますか? – mafap

1

DataRcvdイベントハンドラが起動したときに相手側から送信されたすべてのものがあると想定することはできません。つまり、マイクロコントローラがABCDEFGHI(newlinechar)を送信し、イベントハンドラがABCでバッファに書き込まれます。

私は、マイクロコントローラが改行を送信していない場合は動作しないことに同意します。

0

ArduinoがLeandro、Micro、または他のAtmega32u4ベースのボードの場合は、RTSとDTRを高く設定する必要があります。そうしないと、データが受信されません。

_port.Handshake = Handshake.None; 
_port.Open(); 
_port.RtsEnable = true; 
_port.DtrEnable = true; 
関連する問題