Автор | Сообщение |
|
| |
Пост N: 3182
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.05.13 15:40. Заголовок: Com порт и сканер
Вот такой код работает в Clipper 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 А в Harbour сканер выдает полную лажу. Пробовал вместо CT библу hbtpathy , результат такой же. Куда копать ?
|
|
|
Ответов - 8
[только новые]
|
|
|
| |
Пост N: 3183
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.05.13 15:54. Заголовок: Проехали , заюзал HB..
Проехали , заюзал HBWIN и заработало
|
|
|
|
| |
Пост N: 3184
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.05.13 18:19. Заголовок: Помогите разобраться..
Помогите разобраться. Накидал самодостаточный пример. Что ей надо ? ;) #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
|
|
|
|
| |
Пост N: 103
Зарегистрирован: 19.05.05
|
|
Отправлено: 30.05.13 19:44. Заголовок: Похоже, дело в твое..
Похоже, дело в твоей функции TESTIK . Я заремил ее у меня программа встала в ожидание ввода с com-порта. Очевидно повторная инициализация com-порта, чего-то там рушит.
|
|
|
|
| |
Пост N: 3185
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.05.13 19:55. Заголовок: nick_mi Да я тоже п..
nick_mi Да я тоже понял что что то ломается , как понять что и как это обойти. В реальной задаче есть бровс который читает данные с COM порта и из этого бровса я могу вызвать другой бровс который так же читает данные из COM порта , при выходе их последнего бровса , первый падает на строке oWinPort:Read
|
|
|
|
| |
Пост N: 104
Зарегистрирован: 19.05.05
|
|
Отправлено: 30.05.13 20:01. Заголовок: Сделай oWinPort - pu..
Сделай oWinPort - public и не переоткрывай его, или по цепочке передай параметром в функцию.
|
|
|
|
| |
Пост N: 3188
Зарегистрирован: 17.05.05
|
|
Отправлено: 31.05.13 10:32. Заголовок: nick_mi пишет: Сдел..
nick_mi пишет: цитата: | Сделай oWinPort - public и не переоткрывай его |
| Так и сделал добавив соответствующие проверки , заработало нормально , падать перестало. Спасибо за идею. PS У меня сложность еще в том что по COM портам может использоваться другое оборудование в частности весы , принтер , правда там я использую функции COM из HBCT. Отдал прогу на тест вообщем.
|
|
|
|
| |
Пост N: 3190
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.06.13 14:45. Заголовок: В общем глюк не поня..
В общем глюк не понятный при работе с COM1 Перегружаем комп и запускаем вот такой тест у меня он сразу виснет , хз почему #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 Но если хотя бы раз в самом начале вызвать вот такой "клин" то до следующей перезагрузки все работает нормально if COM_OPEN(1) // это из HBCT if COM_INIT(1,19200,"N",8,1) com_read(1) endif com_close(1) endif
|
|
|
|
| |
Пост N: 3191
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.06.13 10:09. Заголовок: 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).
|
|
|
|