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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Теперь нужно поменять местами байты, например:
     
    Дано(и так длинная строка hex)
    4D 0B 48 53 5E 7C
     
    Надо преобразовать вот так(поменять местами всю строку)
    0B 4D 53 48 7C 5E
     
     
     
     
    Добавлено:

    Цитата:
    документация на протокол аппарата есть или ты реверсишь?

     
    Документация есть, поменяли протокол в аппарате, теперь нужно перевернуть hex данные

    Всего записей: 55 | Зарегистр. 07-12-2007 | Отправлено: 11:25 16-11-2017
    NeoAnomaly

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpv19820, т.е. word swap нужен? Ну так или в лоб по строке в цикле или в цикле swap по данным с преобразованием(HexToBin). В зависимости от требований к скорости и к тому, что с данными дальше происходит.

    Всего записей: 418 | Зарегистр. 23-03-2010 | Отправлено: 13:01 16-11-2017 | Исправлено: NeoAnomaly, 13:05 16-11-2017
    kpv19820

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    всё, проблема решилась. Взял другой компонент для работы с com (CPort), теперь все норм. Считываю в байтный буфер и каждый байт прогоняю через IntToHex. Единственное как лучше сделать, поток данных большой (несколько килобайт) как из лучше считывать и обрабатывать, что бы мало ли чего не потерять.

    Всего записей: 55 | Зарегистр. 07-12-2007 | Отправлено: 14:31 16-11-2017 | Исправлено: kpv19820, 14:34 16-11-2017
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpv19820
    IntToHex используйте только для отладки или вывода чего-нибудь на экран. Для данных с фиксированными размерами полей используйте packed record. А для переменных array of byte или string.
    Подробнее: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=844 http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1388 http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1206

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

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

    Цитата:
    IntToHex используйте только для отладки или вывода чего-нибудь на экран

     
    Для обработки потом функцией HexToString и уже работой со строкой данных

    Всего записей: 55 | Зарегистр. 07-12-2007 | Отправлено: 16:53 16-11-2017
    kpv19820

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Такая проблема.
     
    Читаю с com порта через ComPort Lib через ComPortRxChar. Мне данные с аппарата приходят кусками. Чтобы считать в буфер весь кадр целиком, я завел глобальную переменную и в неё все сливаю, Если использовать переменную в процедуре ComPortRxChar, то она постоянно обнуляется.
     
    Это правильный вариант или есть другой выход?
     
    Вот по столько байт он мне кидает 15;869;754;271;310;227;214;211;END; это все один кадр с данными. И я его "склеиваю" потом

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    kpv19820
    Покажите код, тогда можно будет что то сказать.

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

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

    Всего записей: 55 | Зарегистр. 07-12-2007 | Отправлено: 15:02 17-11-2017 | Исправлено: kpv19820, 15:03 17-11-2017
    Frodo_Torbins

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

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Сейчас это Buf в неё я пишу с com порта, но если её перенести в ComPortRxChar, тогда она обнуляется

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

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

    Цитата:
    15;869;754;271;310;227;214;211;END;

    Если эти цифры - размер блоков с данными, то все сообщение в Buf не влезет.

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

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Так они у меня в s1 string накапливаются.

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

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

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 19:49 17-11-2017 | Исправлено: Frodo_Torbins, 19:55 17-11-2017
    kpv19820

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

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    У вас хватает других глобальных переменных, поэтому буфер я бы сделал локальным. Да и вообще, наружу не стоит выставлять ничего лишнего, иначе привыкнете. А такая привычка на сложном проекте быстро приведет к тому, что вы начнете писать монстров, в которых никто не может разобраться, и которые имеют непредсказуемое поведение.
    И еще у вас там есть проблема. Что будет, если однажды вам придут два пакета вместе, и Count будет больше 1024? Количество считываемых за раз байт нужно ограничить.

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



    Gold Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    kpv19820
    Если используется формат кадра, описанный на пред. стр., то возникает вопрос, почему в коде нет его обработки?

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

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

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

    Цитата:
    Что будет, если однажды вам придут два пакета вместе, и Count будет больше 1024? Количество считываемых за раз байт нужно ограничить.

     
    Хорошо, поставлю 1024
     

    Цитата:
    Если используется формат кадра, описанный на пред. стр., то возникает вопрос, почему в коде нет его обработки?

     
    Здесь я его не указал, как оказалось формат кадра другой, тот формат для передачи данных в аппарат. Принимает совсем по другому 0x0B данные 0x1C 0x0D. Обрабатываю после того как получу все данные. Или лучше на лету?

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



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

    Цитата:
    Принимает совсем по другому 0x0B данные 0x1C 0x0D

    Без контрольной суммы?
    Обрабатывать лучше на лету. Если протоколом обеспечивается обратная связь, то при ошибочном кадре делать повторный запрос.

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

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

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

    Цитата:
    Без контрольной суммы?

     
    без, есть два варианта передачи в hex И ASCII, если в hex передавать, тогда есть контрольная сумма, в ASCII нету ((. Обратная связь только 1 запрос(как я понял) проверить включен аппарат или нет.  
     
    Вот приходит в ASCII данные
    Подробнее...
     
    Вот так приходит в hex ASCII(я так и не понял как с ним работать) формат передачи big-endian значащий байт имеет приоритет при передаче
    Подробнее...
     
    Добавлено:

    Цитата:
    Обрабатывать лучше на лету

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

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

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

    Цитата:
    Хорошо, поставлю 1024

    А если там столько нету? Выбирать нужно меньшее: или Count, или размер буфера.
    Кроме того, у вас не обрабатывается ситуация, когда два кадра слипаются и приходят вместе.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 14:36 18-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 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