首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使构建代码以尝试并保持发送缓冲区已满,也会发生串行端口欠载。

即使构建代码以尝试并保持发送缓冲区已满,也会发生串行端口欠载。
EN

Stack Overflow用户
提问于 2013-04-05 00:06:29
回答 1查看 151关注 0票数 0

好吧,事情是这样的。我正在使用串行端口来调制LED灯阵列(使阵列变得可调光)。问题是阵列定期闪烁,每2-4秒快速闪烁一次。

我使用System.Timer每10 mS检查一次发送缓冲区状态。如果缓冲区没有挂起的最小字符数,则例程会添加更多字符。在理论上,缓冲区应该永远不会用完字符,但它确实用完了,也就是LED阵列闪烁。我检测并计数这些事件,因此我知道正在发生欠载。此外,我测量了重新填充缓冲区所用的时间,有时需要1000多个mS才能添加更多字符。TxBuffer大小设置为4096,我希望的缓冲区计数为2000。对于我的生活,我不明白为什么串口阻塞长达一秒,而在理论上它根本不应该阻塞……

设置代码:

代码语言:javascript
复制
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 ();

计时器代码:

代码语言:javascript
复制
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;

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2013-04-06 04:24:19

对于我的用法,我找到了一个变通方法。基本上,我允许我的计时器服务路由的两个实例同时存在。此外,我使用锁来保护缓冲区再填充代码,这样当一个实例在锁段内(并且被公牛拉屎阻塞写操作所阻止)时,另一个实例正被锁保持在锁段之外。

Net的结果是,一旦被写阻塞的实例解除阻塞并退出锁部分,另一个实例就进入锁并重新填充缓冲区。LED可能仍在闪烁(取决于驱动程序解锁的确切时间)(UART的Txbuffer = empty,vs. UART的TxShiftRegister = empty)。

只是现在你看不到他们这样做,所以最后它对我来说是有效的…

干杯,

基思

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15816233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档