首页 > 解决方案 > SerialPort.DiscarInBuffer():是否应该花一些时间让操作完成?

问题描述

请多多包涵。C# 中的串行端口处理对我来说一直是一个痛苦的话题,直到今天,我仍然遇到一些性能问题。

该方法DiscardInBuffer()部分丢弃Write()方法的回复是否合理?

考虑这个原型函数:

void Write(string command)
{
    lock(_locker)
    {
        mySerialPort.DiscardOutBuffer();
        mySerialPort.DiscardInBuffer();
        mySerialPort.Write(command);
    }
}

我用它来向端口写一些东西。最初,在写入之前清除两个缓冲区似乎是个好主意。但是,我(经常)从设备中获取不完整的数据。

就我而言,设备通信很容易。我发送命令并收到回复,作为字符串,类似于“OK”或“NOT OK”。但是,我的应用程序的日志文件指出,有时我会得到“K”或“T OK”等。似乎有些数据丢失了。

我最好的猜测是性能提高了删除mySerialPort.DiscardInBuffer();和使用mySerialPort.ReadExisting();,这也意外地清除了缓冲区(通过 PowerShell 测试)。

我在想当写操作开始时缓冲区清除操作仍在进行中,因此,回复被部分丢弃。是否有意义?

我可以实施什么样的检查来继续mySerialPort.DiscardInBuffer();在函数中使用,但确信事情不会丢弃回复?

标签: c#.netserial-port

解决方案


推荐阅读