HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Технические вопросы (https://hlfx.ru/forum/forumdisplay.php?forumid=20)
-- COM порт не открывается (https://hlfx.ru/forum/showthread.php?threadid=3515)
Отправлено AntiPlayer 06-07-2012 в 12:50:
COM порт не открывается
В общем, суть вопроса вот в чем. Я открываю СОМ порт.
C++ Source Code:
condev = CreateFile(portName.c_str(), GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); |
if (condev == INVALID_HANDLE_VALUE) { CloseHandle(condev); ShowMessage("Не удалось открыть порт"); } else бла бла остальной код программы{ |
Так вот, после перезагрузки компьютера моя программа отказывается открывать COM порт до тех пор, пока я не открою порт и пошлю посылку какой-нибудь сторонней прогой. Например COM Port Toolkit . В чем моет быть проблема ума не приложу. После того как воспользовался сторонней программой, моя начинает всё открывать, посылать и принимать посылки. Подскаите пожалуйста.__________________
I tell you to enjoy life
Отправлено XaeroX 06-07-2012 в 13:39:
Цитата:
AntiPlayer писал:
portName.c_str()
Чему равно точно?__________________
Отправлено Дядя Миша 06-07-2012 в 13:42:
Помнится с комами был аналогичный занятный глюк модемов. То есть зависнет, пока не перезагрузишь - фиг зайдешь в интернет.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено AntiPlayer 06-07-2012 в 14:53:
Цитата:
XaeroX писал:
Чему равно точно?
C++ Source Code:
const AnsiString portName = "COM"+IntToStr(i); |
Соответственно в моей программе эта переменная от COM1 до COM9.
Запись кода в виде:
C++ Source Code:
condev = CreateFile("COM3",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); |
не дает никаких результатов.
Добавлено 06-07-2012 в 18:53:
Цитата:
Дядя Миша писал:
Помнится с комами был аналогичный занятный глюк модемов. То есть зависнет, пока не перезагрузишь - фиг зайдешь в интернет.
Там глюк с модемами, а у меня именно с моей программой. Две аналогичные программы цепляются без проблем.
По каким то причинам порт возвращает INVALID_HANDLE_VALUE.
Я вообще за С++ недавно. Пришлось по работе. Еще и в RAD Studio. Азов мне немного не хватает, очевидно. Как я намучался с unsigned char. Если посоветуете заодно литературу грамотную, буду благодарен.__________________
I tell you to enjoy life
Отправлено XaeroX 06-07-2012 в 15:05:
Может, дело в OPEN_EXISTING? Что если убрать?
Цитата:
AntiPlayer писал:
Еще и в RAD Studio
Так это же Delphi...__________________
Отправлено AntiPlayer 06-07-2012 в 15:28:
Цитата:
XaeroX писал:
Так это же Delphi...
В дистре CodeGear RAD Studio 2009 разом идет Delphi и C++ Builder.
Цитата:
XaeroX писал:
Может, дело в OPEN_EXISTING? Что если убрать?
Надо будет попробовать. Вот только теперь до прибора добраться надо.
Просто самое интересное, что я даже приблизительно не могу понять какой может быть затык. Потому что медот работы с портами стандартен до невозможного.__________________
I tell you to enjoy life
Отправлено XaeroX 06-07-2012 в 15:31:
AntiPlayer
Возможно, проблема вовсе не в том коде, что ты привёл.
А может быть, проблема вообще в системе.
__________________
Отправлено PomanoB 06-07-2012 в 15:31:
Мб ты его не закрываешь....
Отправлено AntiPlayer 06-07-2012 в 16:38:
Цитата:
XaeroX писал:
А может быть, проблема вообще в системе.
Было бы очень классно. Протестирую на эмуляторе КОМ порта.
Я просто думал, может кто-то знает, что такого могут делать прочие программы с портом, что моя программа после них начинает работать
Цитата:
PomanoB писал:
Мб ты его не закрываешь....
Как это не тупо, я закрываю его, даже если он не открывается.
CloseHandle(condev);.__________________
I tell you to enjoy life
Отправлено XaeroX 07-07-2012 в 05:22:
Цитата:
AntiPlayer писал:
Я просто думал, может кто-то знает, что такого могут делать прочие программы с портом, что моя программа после них начинает работать
Первая мысль - инициализировать 
Может, в него надо какие-то управляющие команды заслать сначала?__________________
Отправлено AntiPlayer 07-07-2012 в 11:04:
XaeroX
Скорее всего ты прав. Буду шаманить с настройками dcb.
__________________
I tell you to enjoy life
Отправлено Дядя Миша 07-07-2012 в 12:54:
Цитата:
XaeroX писал:
Может, в него надо какие-то управляющие команды заслать сначала?
Совершенно верно. Только не управляющие команды, а донейт. И не в ком-порт, а дяде Мише, и не сначала, а регулярно.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено PomanoB 07-07-2012 в 19:48:
Цитата:
AntiPlayer писал:
Как это не тупо, я закрываю его, даже если он не открывается.
Я имею ввиду после предыдущего открытия..
У меня так было, когда программа вылетела и не закрыла порт потом уже не открывается
Отправлено AntiPlayer 08-07-2012 в 00:01:
PomanoB
А ну так это, глюк проявляется сразу после перезагрузки компа. То есть порт никто и не открывал, не вижу смсла его закрывать. Но ради эксперимента попробую.
__________________
I tell you to enjoy life
Отправлено AntiPlayer 09-07-2012 в 10:45:
В общем разобрался.
Порт действительно надо инициализировать. Но по каким-то причинам инициализация порта не происходила при сохранении параметров командой SetCommState. Почему - не знаю, уже не было времени отлавливать баг. Но его придется отлавливать позже.
пришлось в принудительном порядке конфигурировать порт с помощью cmd команд. В итоге при запуске программы запускается .bat файл с командами:
mode com% baud=9600 stop=2 data=8 parity=n
Костыли, такие костыли. Не удивлюсь если это "прикол" собственно RAD Studio
__________________
I tell you to enjoy life
Отправлено XaeroX 09-07-2012 в 10:53:
AntiPlayer
Зачем бат-файл? Выполни команды прям из программы, вызовом командного процессора (что-то типа "system").
__________________
Отправлено AntiPlayer 09-07-2012 в 11:32:
Цитата:
XaeroX писал:
Зачем бат-файл? Выполни команды прям из программы, вызовом командного процессора (что-то типа "system").
Просто так как мои познания в RAD Studio и С++ малы, пришлось сделать так, как знаю. Время то поджимало. Спасибо, за совет. Сделаю так!__________________
I tell you to enjoy life