SerialPort数据写入最终在接收缓冲区中

时间:2011-08-31 12:58:11

标签: c# serial-port modem telecommunication

我有一个包装类,它包装.Net的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(),但我认为这不是一个好习惯。

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

1 个答案:

答案 0 :(得分:0)

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