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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 119 120 121 122 123 124 125

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

ShIvADeSt



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

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


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


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    kpv19820

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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



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

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

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

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



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

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

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

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



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

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

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

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



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

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

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

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



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

    Всего записей: 2180 | Зарегистр. 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, хоть в любом другом.

    Всего записей: 55 | Зарегистр. 07-12-2007 | Отправлено: 08:58 20-11-2017
    GRom V

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Здравствуйте.
    Подскажите пожалуйста... есть такая штука (поиск файла, папки по маске):
    procedure ScanDir(StartDir: string; Mask: string; List: TStrings);
    var
      SearchRec: TSearchRec;
    begin
      if Mask = '' then
        Mask := '*.*';
      if StartDir[Length(StartDir)] <> '\' then
        StartDir := StartDir + '\';
      if FindFirst(StartDir + Mask, faAnyFile, SearchRec) = 0 then
      begin
        repeat Application.ProcessMessages;
          if (SearchRec.Attr and faDirectory) <> faDirectory then
            List.Add(StartDir + SearchRec.Name)
          else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.')then begin
            List.Add(StartDir + SearchRec.Name + '\');
          ScanDir(StartDir + SearchRec.Name + '\', Mask, List);
      end;
    until FindNext(SearchRec) <> 0;
    FindClose(SearchRec);
    end;
    end;
     
    //Пример вызова, параметры 1. имя папки 2. маска, по умолчанию *.* 3. хранилище для резульатат, любой наследник от TString, например TStringList
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ListBox1.Items.Clear;
      ScanDir('d:\soft\Borland\Delphi7\Projects\', 'имя искомого файла, папки', ListBox1.Items);
      Label1.Caption := IntToStr(ListBox1.Items.Count);
    end;
     
    Но как быть если нужно найти папку с именем 0.9.21.0?
    Если можно подробней...
    Заранее спасибо!

    Всего записей: 466 | Зарегистр. 31-10-2006 | Отправлено: 15:51 12-01-2018
    Alexzzy

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

    Цитата:
    Но как быть если нужно найти папку с именем 0.9.21.0?  

    ScanDir('d:\soft\Borland\Delphi7\Projects\', '0.9.21.0', ListBox1.Items);

    Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 16:52 12-01-2018 | Исправлено: Alexzzy, 16:53 12-01-2018
    GRom V

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

    Цитата:
    ScanDir('d:\soft\Borland\Delphi7\Projects\', '0.9.21.0', ListBox1.Items);  

     
    Как бы не так!!! Не найдет он папку, я подозреваю что имя папки должно быть  стринг!  
    Вопрос по прежнему актуален!

    Всего записей: 466 | Зарегистр. 31-10-2006 | Отправлено: 03:49 13-01-2018
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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 119 120 121 122 123 124 125

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


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru