2 / 2 / 0
Регистрация: 04.11.2013
Сообщений: 101
|
||||||
1 | ||||||
Нежелательное обнуление счётчика в цикле при достижении значений 4077, 8157. Последовательный порт. Метод Read()29.10.2018, 09:07. Показов 3452. Ответов 16
Метки нет (Все метки)
Доброго времени суток!
Читаю порт в цикле по три байта, все отлично. Нужно выводить номера измерений (одно измерение - три байта). Для этого вывожу номер каждого прохода цикла, но каждый раз после числа 4077 происходит обнуление счётчика. Дальше идёт нормально, всего 15000, доходит до самого конца, т.е. на выходе вижу 1...4077 1...10920. Иногда сброс происходит на числе 8157. Пробовал ставить разный размер буферов ReadBufferSize и WriteBufferSize - результат тот же. Сам цикл:
Прошу Вашей помощи! Спасибо.
0
|
29.10.2018, 09:07 | |
Ответы с готовыми решениями:
16
Нежелательное обнуление переменных в цикле Обнуление логического поля по достижении определённой даты Обнуление счетчика Как запретить уменьшение формы при достижении определённых значений? |
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
29.10.2018, 22:11 | 2 |
Сообщение было отмечено Usaga как решение
Решение
Не расчитывайте на свойство BytesToRead - оно возвращает количество байт во входящем буфере на момент его вызова. Это количество может увеличиться.
Так же не рассчитывайте на то, что метод Read запишет то количество байт, которое вы указали - на деле может быть меньше. Проверяйте возвращаемое значение - в нем будет фактически записанное кол-во байт. Если вы читаете по 3 байта, то держите один массив на 3 элемента и в цикле вызывайте Read пока он не заполнится.
1
|
2 / 2 / 0
Регистрация: 04.11.2013
Сообщений: 101
|
|
30.10.2018, 14:09 [ТС] | 3 |
kolorotur, большое спасибо!
А можно вот это немного подробнее: "Проверяйте возвращаемое значение - в нем будет фактически записанное кол-во байт."?
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
||||||||||||||||
30.10.2018, 14:15 | 4 | |||||||||||||||
Например, если вам нужно заполнить массив на 1024 байтов, то правильный код заполнения будет не таким:
1
|
2 / 2 / 0
Регистрация: 04.11.2013
Сообщений: 101
|
|
31.10.2018, 09:30 [ТС] | 5 |
kolorotur, я правильно понимаю, что массив buffer, это дополнительный массив к существующему byteArray?
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
31.10.2018, 09:33 | 6 |
Нет, это я его просто так в примере обозвал — печатать меньше
Главное не инициализируйте byteArray значением свойства BytesToRead. Делайте его фиксированного размера — в зависимости от потребностей.
1
|
2 / 2 / 0
Регистрация: 04.11.2013
Сообщений: 101
|
||||||
31.10.2018, 14:02 [ТС] | 7 | |||||
kolorotur, сделал как Вы писали, но похоже как-то не так.
1024 1024 1024 1008 1009 1024 1024 1024 1024 992 993 1024 1024 1024 1024 992 993 1024 1024 1024 1024 976 977 1024 1024 1024 664
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
31.10.2018, 14:07 | 8 |
Код наверное где-то в цикле вызывается?
Ну и скопируйте фактический код, а не переписывайте на форум вручную.
1
|
2 / 2 / 0
Регистрация: 04.11.2013
Сообщений: 101
|
||||||
01.11.2018, 07:11 [ТС] | 9 | |||||
kolorotur, нет, код вызывается просто на событии приема. Скопировать, к сожалению, не могу, таковы ограничения, постарался все проверить на ошибки.
Вот весь код:
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
01.11.2018, 09:11 | 10 |
Teterichev, приведенный код опять не скомпилируется, но вывод вроде как в порядке.
Что смущает?
1
|
2 / 2 / 0
Регистрация: 04.11.2013
Сообщений: 101
|
|
01.11.2018, 09:35 [ТС] | 11 |
kolorotur, все также:
На выходе первый richTextBox содержит элементы нашего массива, а второй это: 1024 1024 1024 1008 1009 1024 1024 1024 1024 992 993 1024 1024 1024 1024 992 993 1024 1024 1024 1024 976 977 1024 1024 1024 664 Добавлено через 21 секунду kolorotur, все также: На выходе первый richTextBox содержит элементы нашего массива, а второй это: 1024 1024 1024 1008 1009 1024 1024 1024 1024 992 993 1024 1024 1024 1024 992 993 1024 1024 1024 1024 976 977 1024 1024 1024 664
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
01.11.2018, 09:40 | 12 |
Так а в чем проблема-то?
Ну да, второй текст содержит количества считанных из порта байтов. И?
1
|
2 / 2 / 0
Регистрация: 04.11.2013
Сообщений: 101
|
|
01.11.2018, 09:51 [ТС] | 13 |
kolorotur, да, прошу прощения, все верно. Просто изначально была задача выводить номер каждого измерения (одно измерение - три байта) пока идёт передача данных. Вот и подумал что это взамен моего цикла.
Получается, что мне теперь вместо переменной count в цикле for (которая содержит BytesToRead, первый пост) нужно просто использовать нашу переменную received?
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
01.11.2018, 10:16 | 14 |
0
|
2 / 2 / 0
Регистрация: 04.11.2013
Сообщений: 101
|
|
01.11.2018, 10:20 [ТС] | 15 |
kolorotur, да, именно так. Я делал просто в цикле k = k + 1, а когда обнаружил оглашенную выше проблему, стал просто выводить i.
0
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
||||||
01.11.2018, 10:32 | 16 | |||||
Teterichev, ну уменьшите размер буфера до трех байт и всего делов (если хотите частое обновление):
1
|
2 / 2 / 0
Регистрация: 04.11.2013
Сообщений: 101
|
|||||||||||
02.11.2018, 09:53 [ТС] | 17 | ||||||||||
kolorotur, я встроил этот код в свой, где находится главный буфер (использую его, так как не знаю сколько байт будет принято, знаю только что меньше 5КБ). Все работает, но опять до достижения того самого значения 4077 переменной i, только теперь происходит не сброс значения, а остановка программы с исключением System.IO.IOException "Операция ввода/вывода была прервана из-за завершения потока команд по запросу приложения", в строке:
0
|
02.11.2018, 09:53 | |
02.11.2018, 09:53 | |
Помогаю со студенческими работами здесь
17
Сделать неактивными элементы навигации при достижении предельных значений Обнуление счётчика $result Обнуление счётчика по условию Обнуление счетчика, сортировка Обнуление счетчика ОВЕН СИ8 Обнуление счетчика активации Windows 7 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |