|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
||||||
Работа с COM-портом в асинхронном режиме02.09.2015, 08:40. Показов 23658. Ответов 19
Метки нет (Все метки)
Пробую разобраться с работой COM порта. Получилось запустить в синхронном режиме. Стало ясно, что в этом режиме, вызывая функцию чтения данных ReadFile(), я не знаю заранее есть ли данные для чтения. Можно циклически проверять их наличие, но это приводит к дополнительным расходам времени ЦП. Поэтому на практике часто удобней использовать асинхронный режим.
Я нашел вот такую статью http://piclist.ru/S-COM-THREAD... US.html#22 и решил попробовать написать похожую программу в C++ Builder 6. Код такой:
При запуске программы, отправка вроде работает, но на входе ничего нет. Мне кажется, что ошибка где-то в функции DWORD WINAPI ReadThread(LPVOID), а именно не выполняется условие if(signal == WAIT_OBJECT_0). Подскажите, где я накосячил?
0
|
||||||
| 02.09.2015, 08:40 | |
|
Ответы с готовыми решениями:
19
COM-порт в асинхронном режиме Не работает Com порт в асинхронном режиме работа с COM портом |
|
19 / 19 / 4
Регистрация: 27.05.2013
Сообщений: 119
|
|
| 22.10.2015, 11:28 | |
|
Прошелся бы отладчиком по коду и дал больше данных.
Насколько я помню FILE_FLAG_OVERLAPPED это как раз синхронный режим а не асинхронный. И кажется не нужно тогда signal = WaitForSingleObject(overlapped.hEvent, INFINITE); И написать не помешало как обмен происходит, через виртуальный порт или провода куда то идут.
0
|
|
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
|
| 27.10.2015, 08:11 [ТС] | |
|
Обмен происходит через замкнутые между собой выводы RX и TX в разъёме COM-порта на ПК.
0
|
|
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
|
| 27.10.2015, 10:57 [ТС] | |
|
Я принципиально хочу решить задачу средствами WINAPI. Это невозможно?
0
|
|
|
|
|||||||
| 27.10.2015, 11:20 | |||||||
|
Добавлено через 2 минуты Ибо так делать (отсутствует синхронизация с VCL) нельзя:
0
|
|||||||
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
||
| 20.01.2016, 14:48 [ТС] | ||
|
0
|
||
|
1 / 0 / 1
Регистрация: 21.01.2016
Сообщений: 7
|
|
| 22.01.2016, 15:50 | |
|
Alexey9891, и где собака порылась? напиши своё решение плз..
0
|
|
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
|
| 22.01.2016, 23:38 [ТС] | |
|
С тех пор как я создал эту тему, прошло много времени. Я уже точно и не помню в чем там был косяк, помню что какой-то тривиальный. Щас уже лень искать его в старом коде. Если интересует моя программа обращайтесь в личку.
0
|
|
|
0 / 0 / 2
Регистрация: 28.10.2015
Сообщений: 36
|
|
| 25.01.2016, 13:57 | |
|
Alexey9891, здравствуйте,можно код программы?)
0
|
|
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
||
| 26.01.2016, 08:00 [ТС] | ||
|
0
|
||
|
0 / 0 / 2
Регистрация: 28.10.2015
Сообщений: 36
|
|
| 27.01.2016, 15:04 | |
|
Alexey9891, мне нужно посмотреть код инициализации порта и принятия данных. У меня асинхронный режим, только принятие.
0
|
|
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
||||||||||||
| 28.01.2016, 13:37 [ТС] | ||||||||||||
Поток чтения данных:
Добавлено через 3 минуты А классный форум, сам написал вопрос, а теперь сам на него овечаю
0
|
||||||||||||
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
|
| 28.01.2016, 13:52 [ТС] | |
|
0
|
|
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
||
| 01.02.2016, 10:06 [ТС] | ||
|
Одно из отличий заключается в том, что в потоках WINAPI можно использовать обращение к графическим компонентам и файлам, так как сообщения потоков WINAPI ставятся в очередь сообщений главного потока процесса. Таким образом избегаются конфликты между потоками при обращении к разделяемым компонентам или файлам. А вот в TThread для этого используется метод Synchronize(), который выполняет то же самое – ставит сообщения в очередь главного потока процесса, за счёт чего можно избежать конфликтов между потоками.
0
|
||
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
|
| 25.04.2016, 08:24 [ТС] | |
|
Возник новый вопрос. Изначально программа работы с COM-портом использовалась для общения с микроконтроллером (далее МК). COM-порт компьютера (далее ПК) соединялся с МК через преобразователь MAX 3232. Все работало на ура.
Одно уточнение: при общении с ПК, микроконтроллер отправлял на ПК различное количество байт, и программа на ПК не знает заранее сколько придет байт от МК. Когда МК делал одну отправку (например 7 байт), программа на ПК один раз исполняла главную функцию потока void __fastcall ReadThread::Execute(), где за один вход в эту функцию считывала все байты (все 7 за раз) и далее за один раз выводила все принятые байты в Memo. Все работало хорошо. Затем решил подключить МК к ПК другим образом. В МК имеется приемо/передатчик UART, выводы которого я подключаю к преобразователю интерфейса (буферу) RS-485, от преобразователя выходит витая пара, которая подключается к преобразователю MOXA UPort1130, а он, в свою очередь, соединен с ПК. Преобразователи UPort от компании MOXA подключаются к USB-порту компьютера и предназначены для создания в компьютере дополнительных последовательных портов в операционных системах Windows. Короче говоря, соединил МК с ПК не через COM-порт, а через RS-485. И вот тут возникла странность. Раньше, при отправке с МК нескольких байт (например 7 байт), программа на ПК воспринимала данные как одну посылку из нескольких байт (один раз выполняла функцию void __fastcall ReadThread::Execute() и считывала все 7 байт), теперь же программа ту же посылку воспринимает как несколько отдельных посылок по 1-му байту (функция void __fastcall ReadThread::Execute() выполняется 7 раз для каждого байта). Соответственно и вывод в Memo производится несколько раз (7 раз по одному байту). С чем это связано? Как это исправить? Пробовал поиграться с таймаутами: ReadIntervalTimeout; ReadTotalTimeoutMultiplier; ReadTotalTimeoutConstant - не дало результата. Как это исправить?
0
|
|
|
0 / 0 / 0
Регистрация: 11.12.2015
Сообщений: 41
|
|||||||||||
| 25.04.2016, 09:39 | |||||||||||
|
Здравствуйте! хотел создать новую тему, но вопрос схож с данной темой
У меня та-же проблема при приеме, при передачи все нормально. Попробовал два примера методом winapi и TThread
на рисунке в рамочке виден перенос, но иногда вижу и пропуск байтов
0
|
|||||||||||
|
-11 / 0 / 1
Регистрация: 02.09.2015
Сообщений: 76
|
|||||||||||
| 25.04.2016, 16:20 [ТС] | |||||||||||
Добавлено через 3 часа 1 минуту Решил проблему "ЗАПЛАТКОЙ". Сделал задержку (функция wait(3000000) перед выполнением функции ClearCommError(COMport, &temp, &comstat):
0
|
|||||||||||
| 25.04.2016, 16:20 | |
|
Помогаю со студенческими работами здесь
20
Работа с Com портом Работа с COM портом Работа с COM портом Работа с COM-портом Работа с COM портом и вообще... Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
|
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|