2010-12-03 19 views
0

私はDataReceivedメソッドをトリガーしていますが、RS232デバイスからデータが送信されています。物事は、次のコードC#SerialPort Data接続時にDataReceivedの問題が発生しました

byte[] data = new Byte[serialPort.BytesToRead]; 
serialPort.Read(data, 0, data.Length); 
string read = System.Text.Encoding.ASCII.GetString(data); 

とスムーズに実行するが、私は、データ

後に文字列を追加する場合
string read = System.Text.Encoding.ASCII.GetString(data) + "asdf \n"; 

データがまだ受信されているが、時折、誤って表示されます。例えば。私がスケールに接続していて、 "10.45kg asdf"を読んでいるのであれば、私のコンピュータには "10. asdf45kg"と表示されます。ここでの問題は何ですか?

+0

使用しているデバイスについて詳しく教えてください....デバイスごとに異なるプロトコルがある可能性があるので、特定の形式でリクエストを送信する必要があります。 –

答えて

4

DataReceivedメソッドは、シリアルポートがトリガするように感じるとトリガされますが、必ずしもデバイスからフルストリングを受け取ったときではありません。詳細については、this SO answerを参照してください。ターミネータ文字がわかっている場合は、SerialPortのNewLineプロパティを設定してから、ReadLine()を使用してこの問題を回避できます。

+0

mtrw、すばらしい提案。それは今働いた。私の機器(無線データモジュール)には、機器データのEOP文字を設定できるソフトウェアが含まれています。私は "〜"を選んでEOP、NewLine = "〜"を選んだ。その後、問題は解決されます。しかし、もし私がソフトウェアを持っていなければどうでしょうか?どのようにしてEOPを追加しますか? EOPを変更するために機器に書き込むことができないと仮定します。私はどのように私のコンピュータからそれを行うでしょうか? – KMC

+0

誰かが私にニューラインの背後にあるコンセプトを説明すれば、問題は解決しますが、私は感謝しますか?だから、DataReceivedは文字フレームの間にいつでもトリガされますか? NewLineをいくつかの文字に制限した場合、完全な文字列がコンピュータに送信される前に、部分文字列はどこに隠れていますか? – KMC

+1

一般に、デバイス仕様では、End of Line/End of Packet文字が表示されます。あなたは(通常)それを変更することはありません。私はEOL文字に改行または復帰( '\ n'または '\ r')のどちらかを使用することをお勧めします。これはかなり一般的です。あなたの2番目の質問については、部分的な文字列がシリアルポートの内部バッファまたは関連する低レベルOSの内部バッファに隠れています。このイベントは、少なくともいくつかの文字が読み込み可能であることがわかったときに、OSによって起動されます。 – mtrw

関連する問題