0

よし、契約だ。シリアル ポートを使用して 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;

何か案は?

4

1 に答える 1