Тайм-ауты SerialPort в автономном режиме - PullRequest
1 голос
/ 11 января 2010

У меня странное поведение в моем приложении.

Я открываю COM-порт для связи с устройством через Bluetooth. Я делаю следующие шаги:

  1. Открыть виртуальный COM-порт;
  2. Переключение удаленного Bluetooth в командный режим;
  3. Выполнить несколько команд (например, прочитать серийный номер удаленного устройства);
  4. Переключение удаленного Bluetooth в режим данных;
  5. Отправка данных на устройство;
  6. Чтение байта ответа (ReadByte () из класса SerialPort);

    Устройство работает нормально и сразу отвечает, и все нормально, пока я запускаю свое приложение в режиме отладки через visual studio.

Но когда я пытаюсь запустить его напрямую (без привязки visual studio и adebugger - но все же скомпилированный с опцией "Debug"), я получаю исключение тайм-аута на этапе 6.

Ошибка полностью воспроизводима (без тайм-аутов в Visual Studio, и каждый раз без него).

У кого-нибудь есть идеи, которые могут вызвать такое поведение?

Вот код из шага 6

    private byte[] ReadResponse() {

        try {
            int bytes2Read = 6;
            do {
                this.buffer.Append((byte)ReadByte()); // <- there the timeout occurs

                if (this.buffer.Length == 6) { // header receiver
                    // bytes 2 and 3 contain message length
                    bytes2Read = this.buffer[2] + (this.buffer[3] << 8);
                }
            } while (this.buffer.Length < bytes2Read);

            return this.buffer.ToArray();
        } finally {
            this.buffer.Clear();
        }
    }

Метод находится в классе, производном от класса SerialPort.

Ответы [ 4 ]

2 голосов
/ 11 января 2010

Когда вы отлаживаете, вы даете драйверу порта много времени для получения байта. Таймер таймаута не запускается, пока вы не перешагнете вызов ReadByte (), драйвер, вероятно, уже получил байт, поэтому ReadByte () немедленно возвращается. Этого не происходит, когда вы бежите на полной скорости.

Увеличить значение свойства ReadTimeout. Также рассмотрите возможность использования события DataReceived.

1 голос
/ 10 мая 2011

Кажется, есть ошибка в некоторых виртуальных COM-портах с немедленным таймаутом сразу после записи. Вы можете частично обойти это, вставив задержку после записи (попробуйте 10-20 миллисекунд), но я пока не нашел хорошего решения.

Здесь обсуждается ошибка в виртуальном com- порту Ethernet-> RS232

0 голосов
/ 11 января 2010

звучит как проблема синхронизации. В режиме отладки программа работает медленнее, чем без подключенного отладчика. Должна быть проблема времени

0 голосов
/ 11 января 2010

Тайм-аут - нормальное поведение для SerialPort. Это предотвращает остановку вашего приложения.

Вы должны иметь возможность изменить свойство ReadTimeout, чтобы увеличить время, необходимое для тайм-аута.

http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readtimeout.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...