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


Система 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 119 120 121

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

ShIvADeSt



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Всего записей: 39 | Зарегистр. 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; это все один кадр с данными. И я его "склеиваю" потом

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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