串口通信中的错误

时间:2010-02-09 20:37:10

标签: c# serial-port

我可能只有你今天听过的最奇怪的错误。

我在线程中有一个(非常长的)方法,它将格式化的数据发送到RS232 Led Display。

它应该显示类似的东西

TITLE
SUBTITLE 1
ELEMENT 1
ELEMENT 2
SUBTITLE 2
ELEMENT 1
ELEMENT 2
ELEMENT 3
好吧,每个人都有自己的消息。

我在每条消息之后调用Thread.Sleep(N)(因此每条消息显示N次)。

  • N是秒数

好的,直到现在一切都很好。问题是,如果(10 <= N <= 20)我得到以下输出:

TITLE
TITLE
TITLE
TITLE
TITLE
TITLE
TITLE
TITLE

发送消息时,我可以听到哔声。我甚至安装了一个串口监视器,以检查我发送的信息是否相同。

总结一下:

在线程上休眠n&lt; = 9或n&gt; = 20后,在串行端口上写入工作会产生错误的输出,就像输出被缓存一样

这可能是什么?

更新

  • 好的,我知道System.Threading.Sleep需要几毫秒作为参数。只需将数字乘以1000即可。
  • 每当LED显示屏收到格式正确的信息时,都会发出哔哔声。我应该澄清一下。

这是一个片段(这会发送第一个标题)

            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

我终于得到了它的工作(丑陋的修复,但是......)

在每次写入串口之前,我发送一条“空白”消息,没有延迟。在发送实际消息之前清除屏幕。万岁!它适用于我睡眠线程的任何秒数

3 个答案:

答案 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以毫秒为单位,您可能无法确认。