即使代码被构建为试图保持Tx缓冲区满,串行端口运行不足也会发生
本文关键字:运行 串行端口 缓冲区 Tx 构建 代码 | 更新日期: 2023-09-27 18:07:21
好的,事情是这样的。我使用串行端口来调制LED灯阵列(使阵列可调光)。问题是数组周期性闪烁,每2-4秒快速闪烁一次。
我使用系统。定时器,每10毫秒检查一次Tx缓冲区状态。如果缓冲区没有最小的待处理字符数,则例程会增加更多的字符。理论上,缓冲区应该永远不会耗尽字符,但它确实,又名LED阵列闪烁。我检测并统计这些事件,因此我知道正在发生运行不足。此外,我测量了重新填充缓冲区所花费的时间,有时添加更多字符需要超过1000毫秒的时间。TxBuffer大小设置为4096,我想要的缓冲区计数是2000。对于我的生活,我不明白为什么串行端口阻塞长达一秒钟,而理论上它根本不应该阻塞…
设置代码:
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;
任何想法?
对于我的使用,我找到了一个解决方法。基本上,我允许定时器服务路由的两个实例同时存在。此外,我用锁来保护缓冲区重新填充代码,这样,当一个实例在锁区域内(并被阻塞写阻塞)时,另一个实例被锁保持在锁区域外。
最终结果是,一旦被写阻塞的实例解除阻塞并退出锁段,另一个实例就会进入锁并重新填充缓冲区。净,led可能仍在闪烁(取决于驱动程序解除阻塞的确切时间(UART的Txbuffer =空,与UART的TxShiftRegister =空)。
只是现在你看不到他们这样做,所以最终它对我有效…
欢呼,基斯