SerialPort.Read()与BaseStream.Read():直接读BaseStream会丢数据吗?
建议改用
SerialPort.Read() 直接给结论:是的,你应该改用SerialPort.Read()来读取串口数据,原因如下:
- SerialPort类内部维护了独立的输入缓冲区,串口硬件接收的数据会先被这个缓冲区接管,而非直接保留在
BaseStream中。如果你直接调用BaseStream.Read(),那些已经被SerialPort缓冲的字节是无法通过BaseStream访问到的,这就会导致你“丢失”这部分数据。 SerialPort.Read()是官方设计的串口数据读取方法,它会从SerialPort的内部缓冲区读取数据,能确保你获取到所有已接收的字节,完全规避缓冲层级不一致带来的数据遗漏问题。- 即便你没有使用
BytesToRead属性,SerialPort的缓冲机制依然在后台运行。BaseStream和SerialPort的缓冲属于两个独立的层级,混用BaseStream的读取操作等于绕开了SerialPort的缓冲管理,必然存在数据不一致的风险。
内容的提问来源于stack exchange,提问作者Andrew Stephens
相关产品推荐
相关产品推荐

