|
15 / 14 / 2
Регистрация: 24.09.2009
Сообщений: 68
|
||||||
Подключить устройство через COM-порт и отправить на него данные31.03.2010, 17:05. Показов 56953. Ответов 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
|
|
|
95 / 63 / 14
Регистрация: 16.11.2018
Сообщений: 297
|
|||||||
| 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 порт и вывести ответ Принять данные с одного порта, распарсить и отправить на другой порт Удалённое устройство или ресурс не принимает подключения через порт Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла:
Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
|
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет
Новости компьютерного мира и их обсуждение (4)
Салют, шампанское, овации!
:drink:
|
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр.
Дословно, отклонённая. . .
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
|