0

我有一个包装器类,它包装.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
}

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

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

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

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

4

1 回答 1

0

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

于 2011-12-07T03:37:18.857 回答