何在C#.NET中使用等待异步以异步模式从COM端口读取数据?

时间:2016-02-11 10:07:50

标签: c# .net asynchronous

我的应用程序适用于某些外围设备。我必须从COM端口接收字节数组。以下是从我的应用程序同步执行的代码片段:

// COM-port used.
private SerialPort _serialPort;
// Buffer for bytes received from COM-port.
private Byte[] _inputOutputBuffer;
// Buffer for instances of Point.
private List<Point> _linePoints = new List<Point>();

此方法可以使COM端口工作。

// Prepaires COM-port.
void PrepareComPort()
{
    if (this._serialPort == null)
          this._serialPort = new SerialPort(this.SelectedAvailableComPortsName);
    this._serialPort.BaudRate = 115200;
    this._serialPort.Parity = Parity.None;
    this._serialPort.DataBits = 8;
    this._serialPort.StopBits = StopBits.One;
    this._serialPort.Handshake = Handshake.None;
    this._serialPort.ReadTimeout = SerialPort.InfiniteTimeout
    this._serialPort.WriteTimeout = 1000;
    if (!this._serialPort.IsOpen)
           this._serialPort.Open();
}

此方法通过COM端口获取字节数组。

// Gets bytes from device via COM-port.
void recieveBytesFromDevice()
{
    // Get bytes array at whole from COM-port.
    while (this._serialPort.BytesToRead < 4006) { ; }
    this._inputOutputBuffer = new Byte[this._serialPort.BytesToRead];
    this._serialPort.Read(this._inputOutputBuffer, offset: 0, count: this._serialPort.BytesToRead);
}

此方法填充Point的实例列表。

    // Fills list of instances of Point.
    void FillPointsList()
    {
        for (int i = 0, j = 0; i <= this._inputOutputBuffer.Length - 8; i++)
        {
            Int16 shortValue = 0;
            if (i % 2 == 0)
            {
                Byte[] bytes = new Byte[] { this._inputOutputBuffer[i], this._inputOutputBuffer[i + 1] };
                Array.Reverse(bytes);
                shortValue = BitConverter.ToInt16(bytes, startIndex: 0);
                _linePoints.Add(new Point(j, shortValue));
                j++;
             }

        }
   }

我的应用程序通过COM端口向外围设备发送数据请求,外围设备总是只发送4006个字节作为我的应用程序必须接收的回复。如果外围设备发送4006字节没有任何延迟,应用程序工作正常。但是,当发送4006字节之前外围设备有一些延迟比我的应用程序挂起。如何将上述PrepareComPort和FillPointsList方法实现为使用等待异步的异步工作的一种方法?

0 个答案:

没有答案