2010-08-19 62 views
0

这次很简单的问题。我有一个应用程序与另一台机器上的另一个应用程序副本通信。一个应用程序发送一个相当稳定的数据流,另一个接收它。改善串口连接

发送数据的代码看起来是这样的(其中serialPort是在C#.NET 2.0 System.IO.Ports.SerialPorts类的实例):

private void bgDataWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e){ 
    try{ 
     string tempStr = Convert.ToString(String.Format("{0:0.000000}", data)); 
     serialPort.Write(tempStr); // Write "data" out to 6 decimal places 
    } 
    catch (TimeoutException){ } 
    catch (InvalidOperationException err){ // Port is obstructed or closed 
     this.Invoke((MethodInvoker)delegate{ 
      MessageBox.Show(this, "Couldn't send wireless data:\n\n" + 
          err.ToString(), "NanoMETER - Wireless Error (Data)", 
          MessageBoxButtons.OK, MessageBoxIcon.Error); 
      Global.remoteEna = false; 
      serialPort.Close(); 
      usingBT = false; 
     }); 
    } 
} 

它被称为一个计时器。接收的代码更是直截了当:

private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { 
    string buffer = serialPort.ReadExisting(); 
    HandleInput(buffer); 
} 

数据被发送和处理,这一切都很好,很正常,但有一些不必要的抖动现象,其中它要么不可靠以恒定的速率发送数据,或者它没有拿起一切。我不确定这是否可以在我的代码中修复,或者只是有几台慢速机器和一个可能的Shakey蓝牙连接的性质。有什么建议么?

+0

为什么在定时器上调用它?不应该由事件触发吗? – Fosco 2010-08-19 14:47:20

+0

从定时器调用Bgw DoWork()吗? – 2010-08-19 14:51:37

+0

@Fosco:由于计时器中的事件,数据不断变化。但我认为我得到的是你建议在数据值更新后应该立即调用它。顺便说一句,它仍然是一个计时器,可能没有什么区别,但我理解逻辑。注意:我正在将一个旧的VB6程序改编为C#(一种我不知道2个月前的语言)来实习......因此可能会期望WTF。 – KChaloux 2010-08-19 15:40:07

回答

1

将实习生分配到将旧代码转换为新平台的情况并不少见。

您可以进行一些改进。

1)当通过端口发送的字节意图以块(例如命令)解释时,以下策略是好的。你有什么协议?某些内容决定了您要发送的消息的格式。例如,一个特定的分隔符来表示即将到来的命令的开始和长度。这使您可以快速确定该命令是否仅发送了一半,或者是否存在缺少的字节。更好的是在最后添加一个CRC。

2)不要读取定时器,而要根据串口对象标记的事件。下面是我用的一个例子:

//OnReceive event will only fire when at least 9 bytes are in the buffer. 
    serialPort.ReceivedBytesThreshold = 9; 
    //register the event handlers 
    serialPort.DataReceived += new SerialDataReceivedEventHandler(OnReceive); 
    serialPort.PinChanged += new SerialPinChangedEventHandler(OnPinChanged); 

在上面的代码,我设置的9门限,你应该改变,要任何适合您的环境。此外,Pinchanged事件可以很好地监控,它可以让您快速识别电缆是否断开。有关CTSChanged的更多信息,但如果您有兴趣,可以查看它。

最后,如果这无助于您进一步了解,请展示发生问题的示例,以便在此处的peolpe可以为您提供更多帮助。

+0

感谢您的帮助。当然,这个答案值得赞赏,但不幸的是,它太迟了,所以我错过了看到它。实习在您发布解决方案的时候已经结束。感谢您的意见,无论如何。 – KChaloux 2011-02-01 22:50:32