2

これは、comport.Write(...) を使用して 1 バイトが送信されたときに起動する、別のスレッド/プロセスにある種のイベント ハンドラーを持つことが可能かどうか疑問に思っていました。

コードのこの部分を考慮してください:

public SerialPort comport = new SerialPort("COM1", 38400, Parity.Even, 8, StopBits.One);    
comport.Write(buf, 0, buf.Length);

ここで、buf.Lenght が 1000 であるとしましょう。私のプログラムは、1000 バイトすべてを送信するまで停止します。私はcomport.Writeを分割したくありません。一度だけ使用したいだけです。

バイトが送信されるたびに、ある種のイベントハンドラーが、データ送信を大幅に中断することなく、たとえばプロセスバーの更新などをオンにできるようになりました (遅くなりません)。

どんな助けでも大歓迎です。

4

3 に答える 3

1

SerialPortクラスはこれをすぐに提供しませんが、この機能を追加できます。手順 (メタコードとしてメモ帳に書かれています。これを適切な C# に変換し、エラー処理、境界条件、および引数のチェックを追加する必要があります)

イベントを定義する

public event Action BytesWritten;

イベントインボーカーを定義する

public void FireBytesWritten(){...}

イベント ハンドラーを定義する

public void OnBytesWritten(...){}

初期化またはセットアップ コードのどこかで、イベントをイベント ハンドラーにフックします。

this.BytesWritten += OnBytesWritten;

ループ ラッピング ステートメントを追加し、N バイトが書き込まれたときにイベントを発生させます。

SerialPort comport = new SerialPort("COM1", 38400, Parity.Even, 8, StopBits.One);

int chunkSize = 1; // 1 byte for the chunk size
for(int i = 0; i < buf.Length; i += chunkSize)
{
    // Write small amount of bytes
    comport.Write(buf, i, chunkSize);
    
    // Fire an event saying that many bytes were written
    FireBytesWritten(...);

    //do checks for boundary conditions, add error handling if Write fails
}
于 2013-08-09T09:17:35.897 に答える
0

はい、クラス内でイベントを作成し、必要に応じて起動してください。

http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx

于 2013-08-09T08:56:01.477 に答える
0

ドキュメントで簡単にわかるように、組み込みクラスにはそのようなイベントはありませんSerialPort。しかしもちろん、メッセージを小さなチャンクに分割し、そのようなイベントを提供するラッパー クラスに独自のメソッドを記述することもできます。もちろん、パフォーマンスに多少の影響はありますが、シリアル回線は非常に遅いため、それを感じることはありません。

于 2013-08-09T09:15:33.647 に答える