Форум » [x]Harbour » Com порт и сканер » Ответить

Com порт и сканер

Dima: Вот такой код работает в Clipper [pre2] do while inkey(0.1)#27 if COM_OPEN(1) if COM_INIT(1,19200,"N",8,1) millisec(120) wean_kod:=com_read(1) if len(wean_kod)#0 com_close(1) nkey:=1255 exit endif endif com_close(1) endif enddo [/pre2] А в Harbour сканер выдает полную лажу. Пробовал вместо CT библу hbtpathy , результат такой же. Куда копать ?

Ответов - 8

Dima: Проехали , заюзал HBWIN и заработало

Dima: Помогите разобраться. Накидал самодостаточный пример. Что ей надо ? ;) [pre2] #include "hbwin.ch" proc main LOCAL cString := space(32) LOCAL oWinPort := win_com():Init( "COM1", WIN_CBR_19200, WIN_NOPARITY, 8, WIN_ONESTOPBIT ) if oWinPort:Open() TESTIK() if valtype(oWinPort)#"O" // вбил клин но не помог oWinPort := win_com():Init( "COM1", WIN_CBR_19200, WIN_NOPARITY, 8, WIN_ONESTOPBIT ) endif ? oWinPort:errortext() // CreateFile Error 5 oWinPort:Read( @cString, 32 ) // вот тут упадет ? cString oWinPort:Close() endif return ************** Func TESTIK() LOCAL cString := space(32) LOCAL oWinPort := win_com():Init( "COM1", WIN_CBR_19200, WIN_NOPARITY, 8, WIN_ONESTOPBIT ) if oWinPort:Open() oWinPort:Read( @cString, 32 ) ? cString oWinPort:Close() endif return [/pre2]

nick_mi: Похоже, дело в твоей функции TESTIK . Я заремил ее у меня программа встала в ожидание ввода с com-порта. Очевидно повторная инициализация com-порта, чего-то там рушит.


Dima: nick_mi Да я тоже понял что что то ломается , как понять что и как это обойти. В реальной задаче есть бровс который читает данные с COM порта и из этого бровса я могу вызвать другой бровс который так же читает данные из COM порта , при выходе их последнего бровса , первый падает на строке oWinPort:Read

nick_mi: Сделай oWinPort - public и не переоткрывай его, или по цепочке передай параметром в функцию.

Dima: nick_mi пишет: Сделай oWinPort - public и не переоткрывай его Так и сделал добавив соответствующие проверки , заработало нормально , падать перестало. Спасибо за идею. PS У меня сложность еще в том что по COM портам может использоваться другое оборудование в частности весы , принтер , правда там я использую функции COM из HBCT. Отдал прогу на тест вообщем.

Dima: В общем глюк не понятный при работе с COM1 Перегружаем комп и запускаем вот такой тест у меня он сразу виснет , хз почему [pre2] #include "hbwin.ch" proc main LOCAL cString := space(32) LOCAL oWinPort := win_com():Init( "COM1", WIN_CBR_19200, WIN_NOPARITY, 8, WIN_ONESTOPBIT ) if oWinPort:Open() do while inkey()#27 ? oWinPort:errortext() oWinPort:Read( @cString, 32 ) // висяк пока "клин" не забить ? cString enddo oWinPort:Close() endif return [/pre2] Но если хотя бы раз в самом начале вызвать вот такой "клин" то до следующей перезагрузки все работает нормально [pre2] if COM_OPEN(1) // это из HBCT if COM_INIT(1,19200,"N",8,1) com_read(1) endif com_close(1) endif [/pre2]

Dima: Dima пишет: Перегружаем комп и запускаем вот такой тест у меня он сразу виснет , хз почему #include "hbwin.ch" proc main LOCAL cString := space(32) LOCAL oWinPort := win_com():Init( "COM1", WIN_CBR_19200, WIN_NOPARITY, 8, WIN_ONESTOPBIT ) if oWinPort:Open() do while inkey()#27 ? oWinPort:errortext() oWinPort:Read( @cString, 32 ) // висяк пока "клин" не забить ? cString enddo oWinPort:Close() endif return Добавил после oWinPort:Open() строку oWinPort:TimeOuts(,5) , виснуть перестало. А какой таймаут по умолчанию ? PS Интересно что виснет не на всякой машине если не использовать oWinPort:TimeOuts(,5).



полная версия страницы