|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
||||||
Подключить устройство через COM-порт и отправить на него данные31.03.2010, 17:05. Показов 57194. Ответов 38
Метки нет (Все метки)
Всем доброго времени суток.
Потребовалось подключить устройство через COM-порт, и чтобы программа считывала и отправляла не него данные. Начал разбираться в теме и нашел примерно такой код:
ошибки все из разряда "missing storage-class or type specifiers" и "missing ';' before identifier" что-то у меня совсем нет идей как с этим бороться. Подскажите пожалуйста куда копать. Спасибо!
1
|
||||||
| 31.03.2010, 17:05 | |
|
Ответы с готовыми решениями:
38
Подскажите как отправить пакет 10 байт на устройство через com порт Можно ли подключить USB устройство через COM-порт?
|
|
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
|
|
| 03.04.2010, 21:36 | |
|
но, ведь ReadThread в бесконечном цикле!! в нем надо выход оттуда по какому-либо условию))
Добавлено через 3 минуты тебе кста писали условие с event-ами)
1
|
|
|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
||||||
| 04.04.2010, 07:17 [ТС] | ||||||
|
Да, еще немного поправил код. Вот при таком варианте все работает как надо:
И еще я не могу понять механизм выполнения потоковой функции? Она ведь вроде как должна выполнятся все эти 5 секунд, разве нет?
0
|
||||||
|
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
|
||||||||||||||||||||||||||
| 04.04.2010, 16:21 | ||||||||||||||||||||||||||
|
В общем, проблема не в том, что потоковая функция зависает в цикле, а в том, что зависает сама ReadFile, ожидая чего-нибудь от ком-порта. Для того, чтобы прервать ожидание, из основного потока перед
Добавлено через 5 минут хотя это тоже не до конца правильно решение.... Добавлено через 20 минут правильное решение: 1.
1
|
||||||||||||||||||||||||||
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
| 04.04.2010, 18:21 | |
|
Есть еще более правильное и несложное решение: использовать функцию SetCommTimeouts(). В случае, если за установленный таймаут в порт ничего не придет, функция ReadFile() тихо-мирно завершится, прочитав 0 байт. Разумеется, таймаут на завершение потока должен быть заведомо больше, чем таймаут на чтение, чтобы функция ReadFile заведомо успела завершиться - успешно или неуспешно.
2
|
|
|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
||||||
| 04.04.2010, 20:15 [ТС] | ||||||
|
Да, установка таймаутов помогла, спасибо!
у меня еще один вопрос: почему функция чтения вызывается 2ой раз, после окончания ожидания, перед закрытием порта?
0
|
||||||
|
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
|
|
| 04.04.2010, 22:52 | |
|
а чего бы ей второй раз не вызывается? она ж в цикле!
0
|
|
|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
|
| 05.04.2010, 07:50 [ТС] | |
|
хм.. если я правильно понимаю, то функция ReadThread() должна завершиться за секунду до окончания задержки..
Добавлено через 56 минут и еще кстати заметил, если при отладке ставить breakpoint на функцию ReadThread(), то программа выполняется чуть-чуть по другому: за то время пока я в режиме отладки "прохожу" по функции ReadThread() заканчивается время задержки (причем независимо от времени всегда на вызове ReadFile), в результате прога ничего на экран не выводит, потом " *** End waiting.", а потом новый проход по циклу и вывод "0 bytes" причем за все это время не происходит выхода из ReadThread() как-то это смущает.. вообще если на то пошло, то "лишний" здесь второй (до "End waiting") вывод результатов чтения, а не первый.
0
|
|
|
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
|
|
| 05.04.2010, 10:02 | |
|
она завершается за секунду до окончания задержки и в цикле запускается заново.
при отладке всегда будет работать не так, как в реале)) а вообще, многопоточность в данной программе в том виде, в каком она (программа) есть, не нужна
0
|
|
|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
||||||
| 09.05.2010, 14:30 [ТС] | ||||||
|
Вот, на данный момент имеется следующая программа...
От многопоточности я избавился по совету Lolcht0 (еще давно), а потом решил написать пакетную передачу. Вобщем вроде программа работает... Но меня смущает сильно один момент: Пакет объявлеятся как структура из трех элементов. И все бы было здорово, но функция WriteFile() принимает для передачи только const * void. И для того, чтобы передать заголовок и контрольную сумму приходится их насильно преобразовывать в string (а потом еще и в const * char) который съедается функцией WriteFile(). И вот не уверен я, что это нормально. Собственно вопрос: есть ли какие-нибудь другие варианты решения этой проблемы с типами? Спасибо!
0
|
||||||
|
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
|
||||||
| 09.05.2010, 20:51 | ||||||
|
на самом деле можно сразу приводить &Pack к типу (void *)
ну, типа
2
|
||||||
|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
|||||||
| 10.05.2010, 09:39 [ТС] | |||||||
смысл в том, чтобы отправить сперва заголовок и когда контроллер его идентифицирует, он сразу отправит сигнал компьютеру и переключится в нужный режим приема либо команды, либо данных. т.е. отправлять всю структуру нет необходимости.. вообще ее можно было даже не создавать.. она нужна скорее для внутреннего удобства а насколько корректно будет выглядеть такая запись?
0
|
|||||||
|
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
|
||||||
| 10.05.2010, 14:34 | ||||||
|
э, ну ты же не думаешь, что со стороны контроллера поток данных будет отличаться хоть каким либо образом при отправке хоть за раз, хоть 10ю порциями?
да, только вот string в моем случае нужно заменить, конечно, на char [N] По последнему вопросу, собственно,
0
|
||||||
|
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 10
|
||||||
| 03.02.2013, 19:10 | ||||||
|
Пожалуйста помогите!!!!
вот мой код: Код C++
Необработанное исключение в "0x5458d540 (msvcr100d.dll)" в "KUKA_PULT_V1.0.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000". вылазит он не в обычном поле ошибок, а отделным окном(у меня VS 2008 express edition ) P.S. И подскажите как поставить аватарку
0
|
||||||
|
229 / 76 / 9
Регистрация: 03.02.2013
Сообщений: 311
|
||||||||||||||||
| 05.02.2013, 17:55 | ||||||||||||||||
|
Shadow_i, вот... Ошибка была в том, что buffer_in указывал хрен пойми куда.
Да, и ещё... Ошибку я вам исправил, но программа от этого рабочей не стала. Всё дело в том что, когда вы вызываете
0
|
||||||||||||||||
|
1 / 0 / 4
Регистрация: 10.04.2015
Сообщений: 58
|
|
| 17.04.2015, 11:27 | |
|
Добрый день! Не могли бы посоветовать еще литературы по работе с COM-портами?
0
|
|
|
1 / 1 / 0
Регистрация: 01.04.2015
Сообщений: 16
|
|
| 19.04.2015, 13:11 | |
|
1
|
|
| 14.09.2024, 00:58 | |
|
Десятый - пятнадцатый годы =)
Поднимем тему? Мне нужно отравить одну переменную (любую) на COM3. Без разницы каким языком. Есть что попроще? Почему так много функций? Может быть batch? Но хотелось бы на плюсах, с кнопочкой =) Подскажите куда копать, пожалуйста.
0
|
|
|
102 / 70 / 15
Регистрация: 16.11.2018
Сообщений: 326
|
|||||||
| 14.09.2024, 08:34 | |||||||
1
|
|||||||
|
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
|
|
| 14.09.2024, 10:50 | |
|
Для получения числа байт при чтении из COM порта используется функция ClearCommError (попробуй -
догадайся по названию !) . Эта функция возвращает структуру COMSTAT https://learn.microsoft.com/en... se-comstat В этой структуре содержится cbInQue - The number of bytes received by the serial provider but not yet read by a ReadFile operation. Таким образом можно читать COM порт не по одному байту с непонятными трюками, а нормально всю очередь байт. Аналогично - с ожиданием готовности при передаче в COM порт.
1
|
|
| 14.09.2024, 10:50 | |
|
Отправить данные на открытый порт Отправить данные на открытый порт Отправить данные на COM порт и вывести ответ Принять данные с одного порта, распарсить и отправить на другой порт Удалённое устройство или ресурс не принимает подключения через порт Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|