2011-08-31 56 views
0

我有一个包装类,它包装了.Net的SerialPort类来执行调制解调器操作和数据流。当我从SerialPort对象读取数据时,先前写入端口的数据位于接收缓冲区中。这是我可以用SerialPort对象改变的行为吗?我还没有找到阻止我的传出数据在接收缓冲区中结束的类的属性。SerialPort数据写入结束于接收缓冲区

我用SerialPort.Write()写数据,这是我做的读取数据

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    Task.Factory.Startnew(() => WriteToBuffer()); 
} 

// ... 

private void WriteToBuffer() 
{ 
    string data = string.Empty; 

    lock(_serialPort) 
    { 
     StringBuilder sb = new StringBuilder(); 

     while(_serialPort.BytesToRead > 0) 
     { 
      sb.Append(_serialPort.ReadExisting()); 
     } 

     data = sb.ToString(); 
    } 

    // .. then do some additional processing 
} 

我在非阻塞的方式读取数据,因为我宁愿是偏执狂,而不是什么错过任何接收到的数据事件并让客户端代码认为存在某种类型的超时。

我可以通过发送ATE0来防止Hayes AT命令被复制到接收缓冲区,但是在调制解调器连接到远程调制解调器后,我发送的任何数据仍在蠕变到接收缓冲区。

有什么我可以做的吗?很难只检查并看看我最后写入缓冲区的内容并忽略它,因为有时我一次读取一个字节,并且是返回的数据的一部分。例如,如果我发送“ID 123”之类的东西,我可能会用while循环读取“ID”,并发现有0个字节要读取,因此它停在那里。我知道我可以每次调用Thread.Sleep(),但我认为这不是一个好习惯。

我可以期待所有调制解调器中的回声行为吗?如果是这样,那么我可以添加代码来过滤我写入的数据。

+0

听起来像你有'回声'的东西。我无法回想,如果'SerialPort'类可用,但大多数应用程序都有这个选项。看看你是否可以关闭它。 – leppie

+0

是的,这是我的问题,我可以“关闭”的唯一事情就是回应AT命令。其他一切都会回来。我试图将该行为添加到我的应用中,这就是问题所在。 – jlafay

+0

它被称为“全双工”模式。无论您与哪个设备通话,都必须配置为半双工。这是无法猜测的,请查看设备手册。编写代码来过滤echo-ed命令当然也是可以的。 –

回答

0

我尝试了一些其他调制解调器和输入缓冲区中返回的写入数据,就像我尝试的原始调制解调器模型一样。我的解决方案是过滤掉写入的数据以正确读取来自远程调制解调器的其他数据。