这次非常简单的问题。我有一个应用程序与另一台机器上的另一个应用程序副本通信。一个应用程序发送一个非常恒定的数据流,另一个应用程序接收它。
发送数据的代码如下所示(其中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 :(得分: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还有更多内容,但如果您有兴趣,可以查阅。
最后,如果这对您的帮助没有帮助,请展示发生问题的示例,以便此处的人员可以为您提供更多帮助。