|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
||||||
Подключить устройство через COM-порт и отправить на него данные31.03.2010, 17:05. Показов 57239. Ответов 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
|
|
|
106 / 74 / 16
Регистрация: 16.11.2018
Сообщений: 342
|
|||||||
| 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 порт и вывести ответ Принять данные с одного порта, распарсить и отправить на другой порт Удалённое устройство или ресурс не принимает подключения через порт Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|