Время ожидания или Timeout

Просмотр 9 сообщений - с 46 по 54 (из 54 всего)
  • Автор
    Сообщения
  • #27192
    manjey73
    Участник

    Да вам и не надо выходить из While — у вас его ПРОСТО не будет…

    buf_in = new byte[300];
    readCnt1 = Connection.Read(buf_in, 0, 3, PollingOptions.Timeout, ProtocolFormat.Hex, out logText); //считать значение из порта
    
    if (buf_in[1] > 0x80)
    {
    // Ошибка, взвести флаг ошибки для дальнейшей обработки
    readcnt2 = Connection.Read(buf_in, 3, 3, PollingOptions.Timeout, ProtocolFormat.Hex, out logText); //считать значение из порта
    }
    else
    {
    readcnt2 = Connection.Read(buf_in, 3, buf_in[2]+2, PollingOptions.Timeout, ProtocolFormat.Hex, out logText);
    }
    readCnt = readCnt1+readCnt2;
    
    // Дальше  ваш буфер  в Билдер лога его
    Log.WriteLine(BuildReadLogText(buf_in, 0, readCnt, ProtocolFormat.HEX));
    
    /// <summary>
            /// Builds a log text about reading data.
            /// </summary>
            protected static string BuildReadLogText(byte[] buffer, int offset, int readCnt, ProtocolFormat format)
            {
                return $"{CommPhrases.ReceiveNotation} ({readCnt}): " +
                    ScadaUtils.BytesToString(buffer, offset, readCnt, format == ProtocolFormat.Hex);
            }
    • Этот ответ был изменен 1 неделя, 3 дня назад от manjey73.
    • Этот ответ был изменен 1 неделя, 3 дня назад от manjey73.
    #27195
    manjey73
    Участник

    Вы считываете столько байт, сколько есть в ответе после получения первых 3-х.
    Если произойдет обрыв связи, только тогда и возникнет Timeout. Все.

    #27196
    manjey73
    Участник

    А так как вы знаете длину ответа, то возникновения Timeout-а и не происходит. Это один из вариантов, когда timeout не мешает кроме случаев отсутствия или обрыва связи

    #27197
    JurasskPark
    Участник

    То есть вы предлагаете вместо 1 запроса делать несколько? Зачем? Ради чего? Почему нельзя отправить один запрос и получить один ответ? Без всяких дополнительных.

    #27200
    Mikhail
    Модератор

    Количество полученных данных больше нуля.

    Это означает, что чтение должно быть завершено после получения 1 байта, что неверно.
    Скорее всего, сначала нужно считать то количество байт, которое всегда приходит. Затем проанализировать их и вычислить, сколько ещё байт должно прийти.

    #27201
    manjey73
    Участник

    @JurasskPark именно так реализовано в Modbus, чтение заголовка, в котором указано количество байт блока данных.

    А ваш цикл While думаете будет проще? та же песня только под другим соусом.

    #27202
    manjey73
    Участник

    @Mikhail не, если меньше нуля то штатный Timeout, если >0 то timeout уменьшается на время пары символов и так по кругу в цикле.

    Но тогда и остановка по сути всегда по таймауту и никак иначе.

    #27203
    manjey73
    Участник

    @JurasskPark запрос как был один, так и останется один, Вы чтение разбиваете на несколько этапов, в вашем случае на 2 всего. Приняли часть, быстренько проверили и принимаете вторую часть дальше, уже зная, сколько вам надо

    #27204
    manjey73
    Участник

    Как говорится вы попробуйте, у меня есть вообще остановка по нескольким массивам байт вынуждено от протокола.
    Есть реальная плавающая длина ответа в другом протоколе — вот где ваш механизм был бы кстати, но вполне справляется и с контролем остановки по массиву.

Просмотр 9 сообщений - с 46 по 54 (из 54 всего)
  • Вы должны авторизироваться для ответа в этой теме.