Дорогие друзья.
Возникла в моей жизни проблема работы с COM-портами.
Информации по этому вопросу в и-нете достаточно, особенно на этом сайте.
Гл. вопрос который передо мной стоял: получение инфы с ком порта. Для этого я написал 2 приложения (отправляющее и принимающее(двух-поточное!!!)) используя функции WIN Api.
Соединил непосредственно порты кабелем, один с другим и стал тестить все это дело.
К моему удивлению то что отправляла одна программа, вторая с успехом принимала. *** После 5-10 запусков этих программ - принимающая перестала работать. А винда стала выдавать след. ошибку:
System Error - Code : 1400 Недопустимый дескриптор окна.
Зашел я под другой операционкой и запустил эти же самые приложения. Далее начиная с ***^)
В чем дело? прог хватает всего на неск. сессий.
И еще вопрос: уверен что Win API не самый простой способ работы с портами и наслышан о некой библиотеке TMS Async32 и даже ее скачал, но вот беда, понятия не имею как с ней работать, ибо в английском не особо. Быть может есть документация на русском или же кто нить из вас уважаемые подскажет осн. принципы работы с ней.
Заранее благодарен, извиняюсь за ламерские вопросы если что:)
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
07-11-2005 08:05 | Комментарий к предыдущим ответам
Самое грамотное - программировать работу с СОМ-портом (как и с любым другим "железом")индивидуально под конкретную задачу. Для этого читаем про порт на уровне DOS (чтобы понимать как работать с микросхемой на уровне прерываний, дабы знать, что и когда в принципе делает виндовый драйвер), изучаем возможности API и...вперед.
Попытки пользовать "чужое" хороши для темпа обмена до 600 байт/сек.
Работа с Com-портом очень хорошо описана в статье О.Титова.
Она есть в Королевстве - doc, а также на www.rs232.ru - html.
Это - теория, а практика - Turbo power AsyncPro.
Практически все с Com-портом, а также модемом, факсом и др.
можно и нужно делать его средствами. Все там сделано грамотно - как учат,
масса дополнительных возможностей, подробная документация (увы - на английском).
Поставляется в исходных текстах - можно поучиться.
Загрузить можно с sourceforge.net или citkit.ru. Эти ссылки я нашел на
delphi.icm.edu.pl - очень полезный сайт для дельфистов, а еще есть www.torry.net. Пример применения для Вашего случая могу прислать.
Вполне возможно, что в одной из API функций передается Application.Handle или хэндл формы, а когда программа запущена из под Delphi это может глючить. Например
ShellExecute(application.Handle,'print','c:\1.txt',nil,nil,sw_show);
в режиме отладки дает "интереснейшие" результаты.
Так никто из отвечающих и не посмотрел, что такое ошибка 1400. А на самом деле это ERROR_INVALID_WINDOW_HANDLE и возникает она ТОЛЬКО при работе с окнами (SendMessage,GetWindowRect итд), так что к портам это ни малейшего отношения не имеет, просто совпадение. А автору не помешало бы кинуть кусок кода где возникает ошибка, иначе тут вообще не о чем говорить.
System Error - Code : 1400 Недопустимый дескриптор окна - это значит, что указанный Вами в качестве первого параметра хэндл порта таковым не является. Варианты:
1. Вы не проверяете открылся ли порт при CreateFile (это самое вероятное) по значению возвращаемого хэндла. Возможно, что из-за некорректных закрытия порта и "заваливания" обслуживающего порт потока.
2. В процессе работы в переменную, хранящую хэндл, попадает "мусор" из-за ошибки в Вашем коде.
3. Все!!!
привет
если это VARIAN ASYNC32 COMPONENT, то:
1. устанавливаем DeviceName := 'COM1'
2. скорость обмена BaudRate := 19200
3. четность Parity := paNone
4. стопбиты Stopbits := sb10
5. бит в байте Databits := da8
6. открывает порт Open
7. ловим в собитии OnRxChar приходящие данные
8. пищем методом Write уходящие данные
9. закрываем порт Close
20-10-2005 02:36 | Вопрос к автору: запрос дополнительной информации
В API функциях часто приходится передавать Handle, возможно именно в этих функциях и проблема.
Как запускается принимающая программа? Из Delphi(в режиме отладки) или отдельно?
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.