よし、契約だ。シリアル ポートを使用して LED ライト アレイを変調しています (アレイを調光可能にしています)。問題は、アレイが定期的に点滅し、2 ~ 4 秒ごとにすばやく点滅することです。
System.Timer を使用して、10 ミリ秒ごとに Tx バッファーの状態を確認します。バッファーに保留中の最小文字数がない場合、ルーチンはさらに追加します。理論的には、バッファが文字を使い果たすことはありませんが、LED アレイが点滅します。これらのイベントを検出してカウントするので、アンダーランが発生していることがわかります。さらに、バッファを補充するのにかかる時間を測定すると、文字を追加するのに 1000 ミリ秒以上かかる場合があります。TxBuffer サイズは 4096 に設定されており、目的のバッファ カウントは 2000 です。私の人生では、理論的にはまったくブロックされるべきではないのに、シリアル ポートが 1 秒もブロックされる理由がわかりません...
セットアップ コード:
charsSent = 0;
myPort.PortName = commPort;
myPort.Encoding = new UTF8Encoding ();
myPort.BaudRate = 19200;
myPort.DataBits = 8;
myPort.Parity = Parity.None;
myPort.StopBits = StopBits.One;
myPort.Handshake = Handshake.None;
myPort.DtrEnable = false;
myPort.RtsEnable = false;
myPort.ReadTimeout = 500; // SerialPort.InfiniteTimeout;
myPort.WriteTimeout = 500; // SerialPort.InfiniteTimeout;
myPort.ReadBufferSize = 4096;
myPort.WriteBufferSize = 4096;
myPort.Open ();
タイマーコード:
myPort.BreakState = false;
int txBufferCount = myPort.BytesToWrite;
if (txBufferCount == 0)
++underRuns;
// refill the xmit buffer if needed...
int bytesNeeded = (txBufferCount > MaxTxLoadCount) ? 0 : MaxTxLoadCount - txBufferCount;
DateTime start = DateTime.Now;
while (bytesNeeded > 0)
{
myPort.Write (charbuf, 0, 5);
charsSent += 5;
bytesNeeded -= 5;
}
if (DateTime.Now - start > maxWriteTime)
maxWriteTime = DateTime.Now - start;
何か案は?