2010-02-09 64 views
1

我可能只是有你今天听到的最奇怪的错误。串口通信中的错误

我有一个(很长)的方法在一个线程内,它发送格式化数据到RS232 LED显示。

它应该显示像这样

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 = < 9或N> = 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

我终于得到它的工作

每个之前写串口,我送(丑陋的修复,但MEH)。一个没有延迟的“空白”信息。这会在发送实际消息之前清除屏幕。万岁!它适用于任何数量的秒我睡觉线程

+0

你能发布一个围绕睡眠和发送串行消息的代码片段吗? – 2010-02-09 20:43:00

+0

从.NET 2.0开始,串行通信组件有一个已知的问题......它希望它可以在.NET 3.5中解决,但是不会...... – t0mm13b 2010-02-09 20:43:49

+2

在你的问题中没有任何东西可以让任何人诊断出什么问题可能。找出“嘟嘟”的含义。 SerialPort不会发出哔声。 – 2010-02-09 20:44:59

回答

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

您是否知道设备用于检测消息结束(EOM)的算法?这可能是设备使用字符内超时。这可以解释为什么它在N> 20的情况下工作,如果在那段时间没有新的字符出现在缓冲区中,那么设备可能会认为消息已终止并显示缓冲区。如果在报文末尾加上ASCII码10,则可能会判定该报文的其余部分在单行显示的末尾滚动而不显示。尽管如此,这并不能解释N < 9的工作原理。也许如果数据到达没有任何延迟的设备解释为一个脚本串行显示?这种情况的表示是,如果消息显示的速度在N = 0到9之间不会变化,但是对于所有N> 20而言变化不同。如果N以毫秒为单位,您可能无法确认这一点。