Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Чтение информации из Com (перевод кода С на С++) |
Автор: krounis 13.5.2017, 21:07 | ||||
Нужно перевести с Си
Нужно перевести код который выше на код С++ (начало положено, но код работает с ошибками, что подтверждается логами см. вложения)
Полное описание проблемы: Всем доброго времени суток! Перейду сразу к делу, есть два фотоприемника (ФП), которые считывают данные при засветки их лазером. Оба ФП подключены к блоку управления, тот в свою очередь подключается к ПК по Com порту. Задача импульсно в течении определенного времени считывать данные с ФП и передавать через Com порт и записывать в массив данных. Сам процесс считывания уже реализован, но по всей видимости неверно. Есть так же уже реализованное ПО для той же самой задачи но на Cи, нужно переписать функцию для С++ либо написать свою. Я попробовал написать свою и столкнулся с проблемой использования так называемых "меток" и оператора goto. Зачем, собственно, использовать те самые метки. Отвечаю - обмен данными через ком порт идет следующим образом: с ПК отсылается байт из 9 битов, в ответ приходит такой же байт но с измененными (если это нужно) данными. А оператор goto нужен для того чтобы постоянно отправлять байты, до тех пор пока блок не откликнется прислав в ответном байте измененный бит (8 бит), это даст нам понять что он готов передать данные, потом отправляем ему пустой байт по определенному адресу (0xdb) и в ответ прилетает такой же байт, но с нужными данными, затем работа устройства повторяется указанное пользователем время и количество замера данных. Основная проблема в том, что я, как новичек, не совсем понимаю как работать с goto, а обычный цикл здесь не воспринимается устройством (мы зависим от его быстродействия), ну и в уже работающей программе на Си как раз используются эти "метки". Прошу помощи в выявлении ошибок в коде, на основании логов (во вложенных файлах - логи обмена данными по RS232 во время проведения эксперимента) Write и Read логов записанных в порт и считанных с него соответственно. А так же прилагаю код правильной и рабочей реализации этой задачи на Си и неправильно работающий код на С++. http://hdd.tomsk.ru/file/fptxcgrg http://hdd.tomsk.ru/file/hmvknqci http://hdd.tomsk.ru/file/hksjcbed http://hdd.tomsk.ru/file/ykhcsqrw http://hdd.tomsk.ru/file/llnfpzoz |
Автор: xvr 15.5.2017, 15:08 |
Во первых - вы поместили свой вопрос не в том разделе. COM в этом разделе - это Component Object Model, и не имет ничего общего с COM портом. Во вторых - программа на С ужастна. Никаких goto там не надо, а нужны обычные циклы (причем бесконечные). Похоже, что ее переписывали с Фортрана ![]() В третьих - GUI программы так не пишут - ваше чтение прибора начнется сразу после нажатия кнопки в GUI, при этом сама GUI зависнет и будет висеть до окончания процесса. Вам нужен отдельный поток для чтения (Thread) |
Автор: tzirechnoy 15.5.2017, 21:35 |
1) Ваш код не компилируется. По очевидным причинам -- поскольку бОльшая часть его не приведена. Не думаю, что кому-нибудь из местных старожылов будет интересно телепатировать, что там было написано, потому помощи по коду Вы вряд ли дождётесь. (Прямым текстом: выделите минимальный компилирующийся пример, который показывает вашу проблему). 2) А зачем вам вообще переводить с т.н. "С" на т.н. "C++"? Заметная часть кода на C будет вполне работать на C++, остальное потребует минимальных косметических правок, на которые укажэт компилятор. Если для развлечения -- то... Ну, будем считать что поразвлекаться так у вас не получилось. А если там какая-то другая цэль -- то скажыте, можэт вы вообще не в ту сторону копаете. 3) По поводу goto -- его использование в оригинальном коде обусловлено только тем, что автор того кода не очень умел программировать. Ну, чуть лучшэ, чем Вы сейчас, но тожэ не очень. Это строго единственная причина. Более того, перевести приведённый код на цыкл while() можно дажэ без известной методологии по разбиению программы на блоки с одним входом и одним выходом и обрамления этого в конечный автомат -- а на одной только интуицыи. Там и так это goto стоит в концэ блока, можно ввести его условия в while() 3.5) Но это в общем вообще не проблема -- поскольку у вас не с goto как таковым проблема, а с тем, что Вы не очень понимаете, что делает оригинальная программа и что -- Ваша. Постарайтесь понять. Отладчик, профили и отладочная печать (не только данных, но и всего остального состояния программы, которое меняется) -- и работайте. Основная работа программиста в общем-то. 4) Никаких байтов из 9 битов у Вас, к счастью, нет. Не пугайте так -- тем более, что писишные чипы и драйвера этого и не поддержывают обычно. 5) И да, логи в .docx -- это конечно ужасно. Не делайте так большэ. То, что в jpeg было бы ещё хужэ -- это не оправдание. И, конечно, журналируйте отправку и приём в один файл -- ну там, с пометкой какой-нибудь, вот это всё. А то пытаться это сопоставить -- тожэ та ещё развлекуха. PS И да, тут говорят про threads, вопросы залипания итэрфейса... Не парьтесь пока, не до того Вам. |