微软已更新API,可以实现相对简单的异步读写操作。请注意,您不需要实现同步事件处理程序,而只需在期望通过COM端口接收数据时调用此函数:
public async Task<Stream> ReceiveData()
{
var buffer = new byte[4096];
int readBytes = 0;
SerialPort port = new SerialPort();
using (MemoryStream memoryStream = new MemoryStream())
{
while ((readBytes = await port.BaseStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, readBytes);
}
return memoryStream;
}
}
这里有另一种备选实现方法(见
http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport),作者解释了SerialPort的、和其他API成员存在的问题。他建议使用
BaseStream
代替SerialPort API,因为他认为其设计、实现和测试都不好。请参考该方法。
Action kickoffRead = null;
kickoffRead = delegate {
port.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate (IAsyncResult ar) {
try {
int actualLength = port.BaseStream.EndRead(ar);
byte[] received = new byte[actualLength];
Buffer.BlockCopy(buffer, 0, received, 0, actualLength);
raiseAppSerialDataEvent(received);
}
catch (IOException exc) {
handleAppSerialError(exc);
}
kickoffRead();
}, null);
};
kickoffRead();
请注意,我使用 BCL 与 BaseStream 获得的性能提升比使用 SerialPort API 快几个数量级。
SerialPort
是.NET框架中用于与COM端口通信的类。@user1957413,请展示您将如何使用这些数据,除非您解释您试图做什么,否则我们无法告诉您如何操作。请在问题中更新一个不使用async/await的示例,我们将向您展示如何使用异步API。 - Scott Chamberlain