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

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

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

ShIvADeSt



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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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



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

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

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

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



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

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

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

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



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

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

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

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



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

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

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

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



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

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

    Всего записей: 40 | Зарегистр. 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);

    Всего записей: 1455 | Зарегистр. 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

    Компьютерный форум 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-2018

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru