В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик
Делаете буфер, в 100 байт, например.
1. Читаете порт, пока не встретите FF
2. По его получению, начинаете заполнять буфер.
3. По получению FFFF (FFFE) - прекращаете заполнять буфер, переходите к №5
4. Если за 100 байт FFFF не встречен, переходите на №1
5. Рассчитываете CRC.
6. если совпадает с указанным в пакете, переходите №7, иначе №1
7. Разбираете остальные данные пакета.
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик
1. Проверяете, что вы считали с порта байт, столько же, либо меньше, чем длинна буфера (в моем примере буфер = 100байт).
2. Буфер порта обычно 1500-1600 байт. Можете раз в 200 мс выполнить приведенный мной алгоритм, но раз вам не важны все данные, а только самые свежие, надо будет добавить пункт 0 - Сброс буфера COM порта (Flush). 200ms при потребности данных в 1s выбран для того, что бы иметь запас по времени (пропуск пакета, пакеты передаются с ошибкой).
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик
Последний раз редактировалось Raikkonen; 28.05.2022 в 21:57.
Clear bufer. Возможно в данной библиотеке он по другому называется.
Как "лайфхак" - закрыть и открыть порт заново. При этом обчно буфер очищается.
Или в вашем случае, открывать порт каждый раз перед опросом. Да, возможно в начале будет "хвост" какой-то посылки, но следующую вы точно отловите.
Не совсем. Вы стараетесь считывать каждое сообщение от весов, я же предлагаю, "выдёргивать" пакет из потока, именно тогда, когда вам необходимо.
1. При подходе, который я вам предложил, не будет.
2. Даже если очистка буфера не предусмотрена в команде Com.Open (в чем я сомневаюсь, общепринята практика очистки буфера при открытии порта), вы получите данные не старше, чем глубина буфера.
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик
Я прошу прощения, забыл спросить, у вас дозирование или взвешивание?
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик
Какой интервал между посылками?
50 мс цикл может быть маловат!
Я бы сдела кольцевой буфер, указатель чтения и записи.
И ходил бы по ниму искал пакеты