Стартовая страница › Форумы › Разработка и интеграция › Время ожидания или Timeout
- В этой теме 53 ответа, 3 участника, последнее обновление 1 неделя, 3 дня назад сделано
manjey73.
-
АвторСообщения
-
24.01.2023 в 15:32 #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); }
24.01.2023 в 15:34 #27195manjey73
УчастникВы считываете столько байт, сколько есть в ответе после получения первых 3-х.
Если произойдет обрыв связи, только тогда и возникнет Timeout. Все.24.01.2023 в 15:36 #27196manjey73
УчастникА так как вы знаете длину ответа, то возникновения Timeout-а и не происходит. Это один из вариантов, когда timeout не мешает кроме случаев отсутствия или обрыва связи
24.01.2023 в 15:45 #27197JurasskPark
УчастникТо есть вы предлагаете вместо 1 запроса делать несколько? Зачем? Ради чего? Почему нельзя отправить один запрос и получить один ответ? Без всяких дополнительных.
24.01.2023 в 15:56 #27200Mikhail
МодераторКоличество полученных данных больше нуля.
Это означает, что чтение должно быть завершено после получения 1 байта, что неверно.
Скорее всего, сначала нужно считать то количество байт, которое всегда приходит. Затем проанализировать их и вычислить, сколько ещё байт должно прийти.24.01.2023 в 15:58 #27201manjey73
Участник@JurasskPark именно так реализовано в Modbus, чтение заголовка, в котором указано количество байт блока данных.
А ваш цикл While думаете будет проще? та же песня только под другим соусом.
24.01.2023 в 16:00 #27202manjey73
Участник@Mikhail не, если меньше нуля то штатный Timeout, если >0 то timeout уменьшается на время пары символов и так по кругу в цикле.
Но тогда и остановка по сути всегда по таймауту и никак иначе.
24.01.2023 в 16:02 #27203manjey73
Участник@JurasskPark запрос как был один, так и останется один, Вы чтение разбиваете на несколько этапов, в вашем случае на 2 всего. Приняли часть, быстренько проверили и принимаете вторую часть дальше, уже зная, сколько вам надо
24.01.2023 в 16:04 #27204manjey73
УчастникКак говорится вы попробуйте, у меня есть вообще остановка по нескольким массивам байт вынуждено от протокола.
Есть реальная плавающая длина ответа в другом протоколе — вот где ваш механизм был бы кстати, но вполне справляется и с контролем остановки по массиву. -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.