Перейти из форума на сайт.


Система IP-видеонаблюдения "Линия". Скачать бесплатную демо-версию для 16 камер. НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).

Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].

     
    И старайтесь, чтобы ваш код не попал сюда

  • Всего записей: 3891 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: data man, 02:45 31-12-2010
    kpv19820

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    А если там столько нету? Выбирать нужно меньшее: или Count, или размер буфера

    Я выше писал каких размеров приходят пакеты. все разных размеров. Начиная от 15 байт. Так что же мне размер 10 байт делать?
     

    Цитата:
    Кроме того, у вас не обрабатывается ситуация, когда два кадра слипаются и приходят вместе.

     
    В смысле слипаются?
     
     
     

    Всего записей: 35 | Зарегистр. 07-12-2007 | Отправлено: 17:19 18-11-2017 | Исправлено: kpv19820, 17:22 18-11-2017
    XenoZ



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    kpv19820

    Цитата:
    есть два варианта передачи в hex И ASCII, если в hex передавать, тогда есть контрольная сумма, в ASCII нету

    Отсутствие контрольной суммы в кадре - потенциальный мусор в данных. Если протоколом это допускается, тогда вопросов нет.

    Цитата:
    Вот код приходит кусками, я его не смогу обработать пока не соберу воедино и потом обрабатываю, второй пакет может не сразу начать прилетать, а через минуту где-то, может меньше

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

    ----------
    А оно мне надо?..

    Всего записей: 4927 | Зарегистр. 29-03-2006 | Отправлено: 20:54 18-11-2017
    kpv19820

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Обработка - по кадрам, сомневаюсь, что допускается временной разрыв внутри кадра.

     
    Я вот получил все данные, пока на аппарате запустят следующие проверки, пройдет время.

    Всего записей: 35 | Зарегистр. 07-12-2007 | Отправлено: 22:03 18-11-2017
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Я выше писал каких размеров приходят пакеты. все разных размеров. Начиная от 15 байт. Так что же мне размер 10 байт делать?

    В Count написано, сколько реально пришло, но больше размера буфера вы за раз прочесть не сможете. Так что присмотритесь к тому, что передаете в ComPort.Read, и вызывайте ее несколько раз, если надо.
     

    Цитата:
    В смысле слипаются?

    Винда не риалтайм система, так что нету никакой гарантии, что все не подвиснет на пару секунд/минут/часов. И в итоге ваша программа получит на вход не один, а сразу несколько кадров.

    Всего записей: 2090 | Зарегистр. 24-05-2007 | Отправлено: 00:40 19-11-2017
    kpv19820

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    В Count написано, сколько реально пришло, но больше размера буфера вы за раз прочесть не сможете. Так что присмотритесь к тому, что передаете в ComPort.Read, и вызывайте ее несколько раз, если надо.

     
    Так CPort сам читает автоматом без циклов. Пришел пакет он его прочитал, а я жду пока придет последний пакет с символом конца кадра.
     
    Добавлено:
    А как быть с такой ситуацией:
     
    Данные полученные с порта я отдаю через функцию на обработку. Допустим, обработка заняла длительное время и за это время пришло ещё несколько пакетов, которые не обработались получается из-за функции.
     
    Вот как сделать так, чтобы во время работы функции, программа могла продолжить принимать данные, если вдруг функция не успела обработать данные.
     
    Добавлено:
    Я так понимаю, видимо с аппаратом должна работать библиотека и отдавать данные в программу.
     
    Добавлено:
    Или повесить чтение данных на таймер?

    Всего записей: 35 | Зарегистр. 07-12-2007 | Отправлено: 13:30 19-11-2017
    VitaliM



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpv19820
    Читаю и диву даюсь, а вы не слышали про асинхронную работу СОМ порта и, соответственно, асинхронный прием данных? Вам СОМ порт сам данные отдаст, сохранить нужно только.

    Всего записей: 1979 | Зарегистр. 12-01-2005 | Отправлено: 17:18 19-11-2017
    kpv19820

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Хмм, я с асинхронным не работал, думал это для приема-передачи одновременно, сейчас буду пробовать. Спасибо

    Всего записей: 35 | Зарегистр. 07-12-2007 | Отправлено: 17:28 19-11-2017
    VitaliM



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpv19820
    Что за компонент работы с СОМ портом? Ссылку на инфу дайте. Я работаю с этим.

    Всего записей: 1979 | Зарегистр. 12-01-2005 | Отправлено: 17:32 19-11-2017
    kpv19820

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я тоже с ним работаю. ) Ссылку на какую инфу?

    Всего записей: 35 | Зарегистр. 07-12-2007 | Отправлено: 17:56 19-11-2017
    VitaliM



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ну я имел ввиду на инфу по компоненту...
    Этот компонент позволяет настроить получение пакетов, имеющих признак начала и конца. Тогда не придется выискивать, как отличить один пакет от другого. И получать будете сразу весь пакет для обработки. Если обработка слишком сложная (длительная по времени), накапливайте пакеты в независимом буфере и обрабатывайте пакеты в отдельном потоке.

    Всего записей: 1979 | Зарегистр. 12-01-2005 | Отправлено: 18:14 19-11-2017
    kpv19820

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот так делаю. Дело в том, что мне надо в БД данные потом закинуть, а следующий поток может быть через неизвестное время от нескольких десятков секунд до нескольких минут. Через какой промежуток будет запускаться аппарат я не знаю, а данные должны быть занесены в базу(а то буду ждать неизвестно чего с накоплением)  
     
    Подробнее...
     
    Добавлено:
    Можете подсказать как правильно настроить этот компонент для признаков?

    Всего записей: 35 | Зарегистр. 07-12-2007 | Отправлено: 18:23 19-11-2017 | Исправлено: kpv19820, 18:35 19-11-2017
    VitaliM



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Используйте TComDataPacket.OnCustomStart и TComDataPacket.OnCustomStop для определения начала и  конца пакета.
     

    Всего записей: 1979 | Зарегистр. 12-01-2005 | Отправлено: 18:33 19-11-2017
    kpv19820

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо. Можно пример?

    Всего записей: 35 | Зарегистр. 07-12-2007 | Отправлено: 18:38 19-11-2017
    VitaliM



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А вы сами можете попробовать разобраться? Очень похоже.

    Всего записей: 1979 | Зарегистр. 12-01-2005 | Отправлено: 19:50 19-11-2017
    kpv19820

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Уже вроде разобрался, процедуру надо делать. Тупанул конкретно ))) Компонент не повесил на форму )))
     
    Добавлено:
    Что-то я ни хрена не разобрался ((( теперь какие-то левые пакеты валятся с асинхронной передачей и не понятно как использовать OnCustomStart OnCustomStop для чего???

    Всего записей: 35 | Зарегистр. 07-12-2007 | Отправлено: 19:56 19-11-2017 | Исправлено: kpv19820, 20:02 19-11-2017
    VitaliM



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Там все относительно просто. Либо вы задаете два свойства StartString и StopString, которые жестко задают строку с которой начинается и заканчивается пакет, либо делаете два обработчика событий, описанных ранее, в которых в потоке данных ищите либо начало, либо конец пакета. Сами данные получаете по событию OnPacket. При этом обработчики компонента TComPort  OnRxBuf или OnRxChar, при использовании TComDataPacket, не используются.

    Всего записей: 1979 | Зарегистр. 12-01-2005 | Отправлено: 00:37 20-11-2017 | Исправлено: VitaliM, 00:38 20-11-2017
    kpv19820

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    При этом обработчики компонента TComPort  OnRxBuf или OnRxChar, при использовании TComDataPacket, не используются.

     
    Вот я и думаю, почему не работает. Это я уже утром допер, что нужно было OnPacket обрабатывать...
     
    Добавлено:
    задаю в StartString:=#$B, StopString:=#$1C и другие значения пробовал #0B, #1C, #11, #28 никакой не работает.
     
    И ничего не выдает. Если эти строки сделать пустыми, тогда идут пакеты.  
     
    Я так понимаю, что по идею, он должен определить в строке начальный символ и если он есть начать считывать до конечного символа.
     
    OnCustomStart  тоже мало что дает, ну нашел он символ и что дальше? Снова глобальная переменная и в неё все собирать.
     
    Короче говоря бесполезные функции, все равно писать обработчик, хоть в OnRxChar, хоть в любом другом.

    Всего записей: 35 | Зарегистр. 07-12-2007 | Отправлено: 08:58 20-11-2017
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

    Имя:
    Пароль:
    Сообщение

    Для вставки имени, кликните на нем.

    Опции сообщенияДобавить свою подпись
    Подписаться на получение ответов по e-mail
    Добавить тему в личные закладки
    Разрешить смайлики?
    Запретить коды


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2017

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru