私は、0xAA をシリアル ポートから常にギャップなく送信するテスト ユーティリティを作成したいと考えていました。RXは関係ありません。
タイマーを使用してバッファーをいっぱいに保ち、BytesToWrite を監視して、バッファーにさらにデータを書き込む前に、しきい値を下回るまで待機しました。
別の方法として、タイマーを使用せずに AsyncCallback のシリアル ポートを更新することもできましたが、楽しみのためにこの方法でやりたかったのです。label11 を表示して、バッファーの塗りつぶしと空を確認できます。
EndWrite を使用せずに BeginWrite を使用しても、しばらくは問題なく使用できますが、最終的にはリソースが不足することに注意してください。私は基本的にダミーの EndWrite を入れています。
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
timerFill.Enabled = checkBox2.Checked;
}
private void timerFill_Tick(object sender, EventArgs e)
{
GenerateSquareWave();
}
int const bufferSize = 256;
void GenerateSquareWave()
{
int k = serialPort1.BytesToWrite;
label11.Text = k.ToString();
if (k < bufferSize)
{
byte[] data = new byte[bufferSize];
for (int i = 0; i < bufferSize; i++)
{
data[i] = 0xAA;
}
serialPort1.BaseStream.BeginWrite(data, 0, data.Length, new AsyncCallback((IAsyncResult ar) => serialPort1.BaseStream.EndWrite(ar)), null);
}
}