Обработка приостановки COM, пока Windows приостанавливается

Я пишу приложение службы Windows в.NET v4.6.1, которое связывается с беспроводным сканером штрих-кода через VirtualCOM. После изменения кода, основанного на событиях, для этого. Если вам необходимо использовать.NET System.IO.Ports.SerialPort, у моей службы возникнут проблемы с обработкой приостановки com-порта при блокировке / приостановке Windows. Я пытаюсь установить соединение, и если COM-порт открыт, но Windows закрывается, и COM-порт приостановлен. Я также отключаю управление питанием USB от Windows в диспетчере устройств.

public void RunScanner() 
{
    if (_serialPort.IsOpen) 
    {
        _serialPort.Close();
    }

    try 
    {
        _serialPort.Open();
        StartReadingData();
    }
    catch (System.Exception e) 
    {
        _serialPort.Close();
        LoggingHelper.LogEvents(e.StackTrace, EventLogEntryType.Error, 9999);
    }
}

private void StartReadingData() 
{
    byte[] buffer = new byte[128];
    Action kickOffRead = null;
    kickOffRead = delegate {
        _serialPort.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate (IAsyncResult ar) 
            {
                ReadDataFromComPort(ar, buffer);
                if (!_serialPort.IsOpen) 
                {
                    ReopenPort();
                }
                kickOffRead();
            }, null);
        };

    kickOffRead();
}

private void ReadDataFromComPort(IAsyncResult ar, byte[] buffer) 
{
    try 
    {
        if (_serialPort.IsOpen) 
        {
            int actualLength = _serialPort.BaseStream.EndRead(ar);
            byte[] received = new byte[actualLength];
            Buffer.BlockCopy(buffer, 0, received, 0, actualLength);
            _splitter.OnIncomingBinaryBlock(received);
        }
    } 
    catch (IOException exc) 
    {
        LoggingHelper.LogEvents(exc.Message, EventLogEntryType.Error, 9696);
    }
}

Это код, ответственный за чтение из COM. После блокировки у меня есть System.InvalidOperationException, “The BaseStream is only available when the port is open, Кто-нибудь может мне помочь с этой проблемой?

РЕДАКТИРОВАТЬ

ReopenPort код метода:

private void ReopenPort() 
{
        if (_serialPort.IsOpen) 
        {
            return;
        } 
        else 
        {
            try 
            {
                _serialPort.Open();
            } 
            catch (System.Exception e) 
            {
                LoggingHelper.LogEvents(e.StackTrace, EventLogEntryType.Error, 9999);
            }
        }
    }

0 ответов

Другие вопросы по тегам