串行端口数据写入在接收缓冲区中结束

本文关键字:缓冲区 结束 数据 串行端口 | 更新日期: 2023-09-27 18:07:13

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

我能在所有调制解调器中期望这种响应行为吗?如果是这样,那么我可以添加代码来过滤我写的数据。

串行端口数据写入在接收缓冲区中结束

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