改进SerialPort连接

时间:2010-08-19 14:42:06

标签: c# performance bluetooth serial-port wireless

这次非常简单的问题。我有一个应用程序与另一台机器上的另一个应用程序副本通信。一个应用程序发送一个非常恒定的数据流,另一个应用程序接收它。

发送数据的代码如下所示(其中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蓝牙连接的本质。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

将实习生分配给将旧代码转换为更新的平台并不罕见。

您可以进行一些改进。

1)当通过端口发送的字节意图以块(例如命令)解释时,以下策略是好的。你有某种协议吗?指示您发送的消息格式的东西。例如,一个特定的分隔符,用于指示即将发出的命令的开始和长度。这使您可以快速确定命令是否只发送了一半,或者是否丢失了字节。更好的是在最后添加CRC。

2)而不是阅读计时器,而是根据您的serialport对象标记的事件。这是我使用的一个例子:

    //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还有更多内容,但如果您有兴趣,可以查阅。

最后,如果这对您的帮助没有帮助,请展示发生问题的示例,以便此处的人员可以为您提供更多帮助。