我可能只有你今天听过的最奇怪的错误。
我在线程中有一个(非常长的)方法,它将格式化的数据发送到RS232 Led Display。
它应该显示类似的东西
TITLE
SUBTITLE 1
ELEMENT 1
ELEMENT 2
SUBTITLE 2
ELEMENT 1
ELEMENT 2
ELEMENT 3
好吧,每个人都有自己的消息。
我在每条消息之后调用Thread.Sleep(N)(因此每条消息显示N次)。
好的,直到现在一切都很好。问题是,如果(10 <= N <= 20)
我得到以下输出:
TITLE
TITLE
TITLE
TITLE
TITLE
TITLE
TITLE
TITLE
发送消息时,我可以听到哔声。我甚至安装了一个串口监视器,以检查我发送的信息是否相同。
总结一下:
在线程上休眠n&lt; = 9或n&gt; = 20后,在串行端口上写入工作会产生错误的输出,就像输出被缓存一样
这可能是什么?
更新
这是一个片段(这会发送第一个标题)
using (var ld = new LedScreen(COM))
{
ld.AddEffect(LedScreen.Effects.Snow);
ld.AddText(LedScreen.Colors.Red, titulos[ThreadControl.Fase]);
ld.AddEffect(LedScreen.Effects.DSnow);
ld.Write();
}
//Console.WriteLine(titulos[ThreadControl.Fase]);
//esperamos N tiempo (titulo)
Thread.Sleep(TiempoTitulo);
我写了LedScreen类。 write方法就是这个:
public void Write()
{
//caracteres de terminacion
buffer.AddRange(new byte[] { 0xBF, 0xB1 });
try
{
if (!sp.IsOpen) sp.Open();
sp.Write(buffer.ToArray(), 0, buffer.Count);
}
finally
{
sp.Close();
}
}
更新2
我终于得到了它的工作(丑陋的修复,但是......)
在每次写入串口之前,我发送一条“空白”消息,没有延迟。在发送实际消息之前清除屏幕。万岁!它适用于我睡眠线程的任何秒数
答案 0 :(得分:1)
首先,请您澄清线程的睡眠时间? System.Threading.Thread.Sleep()需要一个毫秒参数,而不是'秒'参数。
接下来,你知道串口write()成功吗? (10-20毫秒的硬编码延迟不一定总是足够长。)
为了防止超限,我做了类似的事情:
public bool Send(byte[] bytes)
{
try
{
serialPort.Write(bytes, 0, bytes.Length);
return true;
}
catch (Exception ex)
{
// log or note the error: can be TimeoutException or InvalidOperationException, etc
return false;
}
}
答案 1 :(得分:1)
有几件事情可能会影响你的情况,其中最重要的是已经提到过的“你说的是秒,但Sleep()需要一毫秒的论证,而不是秒”问题。
您还需要查看发送的字符之间的时间长度。流量控制也是。串口参数(波特率等)。您需要知道设备的容差是多少。串行传输中丢失的数据通常意味着您在另一端重载设备。
答案 2 :(得分:1)
您是否知道该设备用于检测消息结束(EOM)的算法?可能是设备使用字符内超时。这可以解释为什么它适用于N&gt;如图20所示,如果在该时间内缓冲区中没有出现新字符,则设备可能会判定消息已终止并显示缓冲区。如果您将ASCII代码10放在消息的末尾,则可能是决定消息的其余部分滚动到单行显示的末尾而不显示它。
这不能解释N&lt;但是,他正在工作。也许如果数据在没有任何延迟的情况下到达,设备会将其解释为连续显示的脚本?这种情况的指示是消息显示的速度在N = 0到9时没有变化,但是对于所有N&gt;确实变化。 20.如果N以毫秒为单位,您可能无法确认。