2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
|
|||||||||||
1 | |||||||||||
Циклическое чтение информации через RS232 с использованием goto13.05.2017, 20:21. Показов 2850. Ответов 18
Метки нет Все метки)
(
Всем доброго времени суток!
Перейду сразу к делу, есть два фотоприемника (ФП), которые считывают данные при засветки их лазером. Оба ФП подключены к блоку управления, тот в свою очередь подключается к ПК по Com порту. Задача импульсно в течении определенного времени считывать данные с ФП и передавать через Com порт и записывать в массив данных. Сам процесс считывания уже реализован, но по всей видимости неверно. Есть так же уже реализованное ПО для той же самой задачи но на Cи, нужно переписать функцию для С++ либо написать свою. Я попробовал написать свою и столкнулся с проблемой использования так называемых "меток" и оператора goto. Зачем, собственно, использовать те самые метки. Отвечаю - обмен данными через ком порт идет следующим образом: с ПК отсылается байт из 9 битов, в ответ приходит такой же байт но с измененными (если это нужно) данными. А оператор goto нужен для того чтобы постоянно отправлять байты, до тех пор пока блок не откликнется прислав в ответном байте измененный бит (8 бит), это даст нам понять что он готов передать данные, потом отправляем ему пустой байт по определенному адресу (0xdb) и в ответ прилетает такой же байт, но с нужными данными, затем работа устройства повторяется указанное пользователем время и количество замера данных. Основная проблема в том, что я, как новичек, не совсем понимаю как работать с goto, а обычный цикл здесь не воспринимается устройством (мы зависим от его быстродействия), ну и в уже работающей программе на Си как раз используются эти "метки". Прошу помощи в выявлении ошибок в коде, на основании логов (во вложенных файлах - логи обмена данными по RS232 во время проведения эксперимента) Write и Read логов записанных в порт и считанных с него соответственно. А так же прилагаю код правильной и рабочей реализации этой задачи на Си и неправильно работающий код на С++. Рабочий код на Си:
Логи read C++ и С.docx
0
|
13.05.2017, 20:21 | |
13.05.2017, 20:21 | |
Ответы с готовыми решениями:
18
Чтение информации с весов через COM порт
Циклическое чтение из файла |
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
|
|
13.05.2017, 20:51 [ТС] | 2 |
Добавлю к комментариям которые показывают с какой строки ошибка:
//Ошибка в том что с данной строки цикл должен повторятся и привязываться к тому что условие выполнения цикла //это то что в ответном байте от блока по адресу 0хd6 8 бит с каждым шагом цикла увеличивается на 1цу в 16 системе
0
|
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
|
|
13.05.2017, 21:15 [ТС] | 4 |
Да, есть конечно:packet_laz_stend.doc
0
|
![]() ![]() |
|
13.05.2017, 21:35 | 5 |
Описание вполне адекватное, не считая что слово "slave" в данном контексте переводится не как "раб", а как "ведомый".
goto не нужен, хватило бы и цикла do-while или while. Чтение и запись регистров необходимо вынести в отдельные методы. Потом уже ими оперировать.
1
|
шКодер самоучка
![]() |
||||||
13.05.2017, 21:38 | 6 | |||||
![]() Решение
переписал сишный код goto на do-while
1
|
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
|
|
13.05.2017, 21:45 [ТС] | 7 |
Rius, спасибо попробую
Добавлено через 39 секунд Max Dark, а можно его в c++шном коде использовать?
0
|
![]() ![]() |
||||||
13.05.2017, 21:50 | 8 | |||||
Хоть где можно, но сами исходные коды (оба) подлежат уничтожению...
Сделайте для примера нечто вроде такого:
1
|
шКодер самоучка
![]() |
|
13.05.2017, 21:52 | 9 |
Теоретически можно, но нужно будет перетаскивать всю обвязку - использованные глобальные переменные, функции и так далее.
Вот, например, как объявлена функция Send_Pack ? А массивы Write_Data , Read_Data ?
1
|
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
|
|
13.05.2017, 21:53 [ТС] | 10 |
Rius, эти методы я так понял использовать для записи и считывания регистров, в замен СИшного Send_Pack(Write_Data, Read_Data)? А по сути, что от этого меняется? те же операции, только метом, или я что то недопонял?
0
|
![]() ![]() |
|
13.05.2017, 21:57 | 11 |
Krounis, от это меняется читаемость, отлаживаемость и сопровождаемость. В лучшую сторону.
И это далеко не предел. Ещё можно пару уровней создать поверх, и весь обмен сведётся к Код
настроить считывать, пока не настроилось. считать результат. ![]()
2
|
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
|
||||||
13.05.2017, 22:12 [ТС] | 12 | |||||
Max Dark, прошу прощения, реализации этих методов были в другом файле, могли бы вы глянуть?
вот файл целиком:
Rius, Вы правы) собственно это и видно из Си-шного кода) поэтому, наверное, мне его трудно было читать(( Эх, еще учиться и учиться) Благодарю за советы) Добавлено через 1 минуту Max Dark, можно ли использовать в с++ этот метод Send_Pack(...) целиком как есть?
0
|
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
|
|
13.05.2017, 22:23 [ТС] | 14 |
Max Dark, наверное проще будет свой метод написать, потому что в плюсах я хоть могу это сделать), а Си для меня непривычен и не понятен, если только с Вашей помощью
![]() ![]() ![]()
0
|
шКодер самоучка
![]() |
|
15.05.2017, 00:00 | 15 |
Krounis, мне тут было нечем заняться и я набросал реализацию по вашему описанию протокола
Код довольно сырой + вам нужно будет реализовать собственно чтение/запись в com-порт, так как у меня прописано только формирование и расшифровка пакета
1
|
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
|
|
15.05.2017, 11:59 [ТС] | 16 |
Спасибо большое, гляну
Добавлено через 55 минут Max Dark, эта реализация на С++? А где именно, в каком методе нужно реализовать чтение/запись в com-порт?
0
|
шКодер самоучка
![]() |
|
15.05.2017, 12:10 | 17 |
да.
Вам нужно реализовать интерфейс PortInterface и переопределить в нем методы read и write .Они принимают указатель на буфер и размер буфера. Пример реализации интерфейса смотрите в DummyPort.hpp/DummyPort.cpp Пример использования - в demo.cpp P.S.: еще раз предупреждаю, что код сырой, и скорее всего его нужно дорабатывать.
0
|
2 / 2 / 1
Регистрация: 10.11.2016
Сообщений: 94
|
||||||
16.05.2017, 11:12 [ТС] | 18 | |||||
Max Dark, мне сегодня удалось все-таки добить свой код, т.е. теперь логи от использования моей программы совпадают с логами рабочей программы на 100%.
Получилось так: Кликните здесь для просмотра всего текста
Вскоре постараюсь переделать весь этот колхоз, под Ваши методы. Но осталось одна проблема, возможно она есть и у Вас в коде. В момент считывания данных с устройства переменные expRes1 и expRes2, те что отвечают за полученные результаты эксперимента после выполнения определенного шага цикла, постоянно перезаписываются. А как выгружать или куда-то записывать данные, которые постоянно меняются в процессе эксперимента?
0
|
Байт
|
17.08.2017, 21:26
Циклическое чтение информации через RS232 с использованием goto
#19
|
Не по теме: Krounis, Прошу меня извинить, но в этой теме я ничего толкового сказать не могу
0
|
17.08.2017, 21:26 | |
17.08.2017, 21:26 | |
Помогаю со студенческими работами здесь
19
Чтение данных с COM/RS232 порта Чтение из последовательного порта по протоколу RS232 Циклическое чтение данных из нескольких файлов .txt
Циклическое чтение системного времени и очистка экрана в заданный момент Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
![]() |
Опции темы | |
|
Новые блоги и статьи
![]() |
||||
Контейнер std::map в C++
bytestream 09.02.2025
Контейнер std::map в C++ - один из наиболее мощных инструментов стандартной библиотеки, предназначенный для хранения пар ключ-значение. Каждый элемент в map состоит из уникального ключа и связанного. . .
|
Как в Python сделать вывод с print без перевода строки и пробела
hw_wired 09.02.2025
Функция print в Python обеспечивает гибкие возможности для вывода информации в консоль. При стандартном использовании эта функция автоматически добавляет символ перевода строки в конце выводимого. . .
|
Как в Python проверить, что у объекта есть атрибут
hw_wired 09.02.2025
В Python существует несколько встроенных способов проверки наличия атрибутов у объектов. Наиболее распространенным является использование функции hasattr(), которая позволяет безопасно определить. . .
|
Как удалить экспортированную переменную окружения в Linux
hw_wired 09.02.2025
В Linux работа с переменными окружения - важная часть системного администрирования и разработки. Экспортированные переменные окружения отличаются от обычных локальных переменных тем, что они доступны. . .
|
Ошибка Error: error:0308010C:digital envelope routines::unsupported
hw_wired 09.02.2025
Ошибка "error:0308010C:digital envelope routines::unsupported" чаще всего появляется при работе с Node. js приложениями и связана с изменениями в системе безопасности криптографических алгоритмов. . . .
|
В чем отличие между .prop() и .attr()
hw_wired 09.02.2025
В jQuery методы . prop() и . attr() часто вызывают путаницу, поскольку на первый взгляд предназначены для похожих целей. Однако между ними существуют принципиальные различия в работе с DOM-элементами и. . .
|
В чем отличие SCSS и SASS
hw_wired 09.02.2025
SCSS и SASS появились как решение проблем, связанных с ограничениями обычного CSS при разработке крупных веб-проектов. Традиционный CSS, несмотря на свою простоту, не предоставлял разработчикам. . .
|
Как найти дубликаты в таблице базы данных
hw_wired 09.02.2025
Дублирование записей в таблицах баз данных может возникать по разным причинам: ошибки при вводе данных, некорректная работа систем импорта, слияние данных из разных источников или неправильная. . .
|
Как удалить дубликаты из массива в JavaScript
hw_wired 09.02.2025
Самый простой и современный способ удаления дубликатов в JavaScript - использование структуры данных Set в сочетании с Array. from. Set автоматически хранит только уникальные значения, а Array. from. . .
|
Go Protobuf: новый Opaque API
hw_wired 09.02.2025
Protocol Buffers (protobuf) давно зарекомендовал себя как эффективный формат сериализации данных, широко используемый в микросервисных архитектурах и распределенных системах. Однако существующая. . .
|