2009-08-21 11 views
3

私はシリアル通信に基づいてある種のプロトコル用の監視ツールを開発しています。C#serialPort speed

シリアルボーレート= 187,5kb 私はSystem.IO.Ports.SerialPortクラスを使用します。

このプロトコルには4種類のフレームがあります。それらは1Byte、3Bytes、6Bytes、10-255Bytesです。 私は彼らと一緒に仕事をすることができますが、私は遅すぎてに応答しません。

最初は最初に梱包されています。 96ms(遅すぎる)、それには約1000Bが含まれています。これは、20〜50フレーム(あまりにも遅すぎる)を意味します。 後でその作業がより安定し、3-10Bytesですが、1-2フレームが含まれているのでまだ遅すぎます。コース1のフレームはOKですが、2は遅すぎます。

もっと信頼できる方法を教えてください。私はそれが可能であることを知っている。

Revision1:

私はストレートな方法を試してみました:

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
     if (!serialPort1.IsOpen) return; 
     this.BeginInvoke(new EventHandler(this.DataReceived)); 
} 

そして、その背景ワーカー: そして...新しいトレッド(読む) と...いつも同じ。遅すぎる、遅すぎる。 WinApiに戻り、kernel32.dll関数をインポートする必要がありますか?

リビジョン2: これは踏み込みの方法で、コード使用の一部です:

int c = serialPort1.BytesToRead; 
byte[] b = new byte[c]; 
serialPort1.Read(b, 0, c); 

私はそれがSERIALPORTクラス内のストリームの使用にいくつかの問題があると思います。または何らかの同期問題。

改訂3: 私はすぐに両方を使用しません!私はちょうど異なった方法を試みた。このバグが時々発生しませんDataReceivedイベントに関係しているよう

よろしく MarekKは

+0

何らかのコードや何らかの情報がないと、ごく少数の人があなたを助けることができます。あなたはどのように港から読むのですか? –

+0

コードの一般的な動作は非常に大きいです。コードの一部が何かを待っているようです。私は魔女を知らない。 – MrHIDEn

+0

** SerialStreamサブクラスであるBaseStreamを使ってみました。 私は同じ結果を得ました。しかし!!!!!! 私は自分のラップトップ用のPCIeカードを探し始めました.PCIエクスプレスカードでもUSBに基づいたコンバータは、USBスタックのために通信レベルが良くないことがわかりました。私は、データストリームがUSB手続きを待っていると思います。私はこれが最も難しいと思います。私はPCIe 232カードを購入しようとしています。** – MrHIDEn

答えて

1

たぶん、あなたは、このfirstをお読みください、そしてそれはまだフレームワーク3.0/3.5で修正されていません。 VS2008/NET 3.5の下で問題が発生したときにMicrosoftに問題を報告したこのポスターについての何かhereを読むべきです...それが真実かどうかは言えませんが、心に留めておく価値があります.NETバージョン2に導入された.NETバージョンでMicrosoftはある程度の難易度を持っていました。

当時は.NET 1.1を使用していましたが、それはVB6のActiveXコントロールに付属しています。これは、インターネット上のsourceによれば、それは最高のシリアル通信制御でした!

サードパーティのコードを使用してシリアル通信を処理する方がよい場合があります。通常、管理対象外で書かれたもの、つまりたくさんのp/invokeを使用して管理されていないものです。

私は私が見つけたのMSDNの記事here、で見つかったジョン・ハインドのバージョンを使用してみましたが非常にオフ入れてそこ非同期的にそれを行うための手立てはなかった、プラスそれは恐ろしいコーディングの経験だったので...

I Hindのコードよりも良い結果を出したFransonが提供するものを使用して終了しました。

希望します。 よろしくお願いします。 トム。