Форум » [x]Harbour » Работа с Com-портом? » Ответить

Работа с Com-портом?

SADSTAR2: Понадобилось переделать Клиппер-программу работающую с Com-портами. Старая работала с 1997 на регистрации звонков оф.АТС в ДОС-сессии под 98. Наконец выделили машинку поновее. И с ХР. Программа работать перестала по ошибке NNN - работа с таймером. Обработал экзешник утилитой - стала запускаться но связи нет. Разбираться с клиппером посчитал нерациональным. Решил переделать по Харбор и МиниГУИ - меньше будет процессор грузить - не ДОС-сессия. Но при изучении исходников и примера HBComm не нашел функций управления режимами порта. В Клиппере были функции Com_hard, Com_soft, Com_DTR которые использовались так * Hand Shake Mode if aPar[8,1]='XON' Com_hard( aPar[1,1], .f.) Com_soft( aPar[1,1], .t.) elseif aPar[8,1]='DTR' Com_soft( aPar[1,1], .f.) Com_hard( aPar[1,1], .t., .t.) elseif aPar[8,1]='RTS' Com_soft( aPar[1,1], .f.) Com_hard( aPar[1,1], .t., .f.) endif Com_DTR(aPar[1,1],.t.) ...... Com_DTR(.f.) В HBComm я не нашел ничего подходящего. Да и система имен функций - не фонтан. Сравните. В клиппере - Com_hard, Com_soft, Com_DTR, Com_Open, Com_Init, Com_count, Com_read, Com_Close В HBComm - Init_Port(), OutBufClr(), IsWorking(), InChr(), InBufSize(), OutChr(), OutBufSize(), UnInt_Port() Как мне победить ком-порт по Харбором?

Ответов - 2

alkresin: Ничего не знаю про функции работы с COM-портом в Клиппере ( это, наверное, из Clipper Tools ? ), и никогда не пользовадся HBComm. Но я когда-то написал маленький модулек с такими функциями: commOpen(), commClose(), commRead(), commWrite(), commGetErr(), setRTS(), clrRTS() и этого вполне хватает для работы. По крайней мере, мне приходилось реализовывать связь с 4-5 разными видами удаленного оборудования - и ничего другого не понадобилось. Собственно, вот и он: #include <stdio.h> #include <windows.h> #include "hbapi.h" HANDLE hCom = INVALID_HANDLE_VALUE; DWORD dwError; unsigned char bInput; BOOL commOpen( char * portName ) { DCB dcb; COMMTIMEOUTS comtime; dwError = 0; hCom = CreateFile( portName, /* "COM1", */ GENERIC_READ | GENERIC_WRITE, 0, /* comm devices must be opened w/exclusive-access */ NULL, /* no security attrs */ OPEN_EXISTING, /* comm devices must use OPEN_EXISTING */ 0, /* not overlapped I/O */ NULL /* hTemplate must be NULL for comm devices */ ); if( hCom == INVALID_HANDLE_VALUE ) { dwError = GetLastError(); return 0; } if( !GetCommState(hCom, &dcb) ) { dwError = GetLastError(); return 0; } dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; dcb.fRtsControl = RTS_CONTROL_ENABLE; // RTS_CONTROL_TOGGLE; dcb.fDtrControl = DTR_CONTROL_DISABLE; if( !SetCommState(hCom, &dcb) ) { dwError = GetLastError(); return 0; } comtime.ReadIntervalTimeout = MAXDWORD; comtime.ReadTotalTimeoutMultiplier = MAXDWORD; comtime.ReadTotalTimeoutConstant = 200; comtime.WriteTotalTimeoutMultiplier = 0; comtime.WriteTotalTimeoutConstant = 0; if( !SetCommTimeouts(hCom,&comtime) ) { dwError = GetLastError(); return 0; } return 1; } void commClose( void ) { if( hCom != INVALID_HANDLE_VALUE ) CloseHandle( hCom ); } BOOL commRead( void ) { DWORD BytesRead = 0; dwError = 0; if( !ReadFile( hCom, &bInput, 1, &BytesRead, NULL ) ) { dwError = GetLastError(); return 0; } return( BytesRead>0 )? 1:0; } BOOL commWrite( unsigned char b ) { DWORD BytesToWrite = 1; DWORD BytesWritten; if( !WriteFile( hCom, &b, BytesToWrite, &BytesWritten, NULL ) ) { dwError = GetLastError(); return 0; } return 1; } DWORD commGetErr( void ) { return dwError; } HB_FUNC( COMMOPEN ) { hb_retl( commOpen( hb_parc(1) ) ); } HB_FUNC( COMMCLOSE ) { commClose(); } HB_FUNC( COMMREAD ) { if( commRead() ) hb_retni( (unsigned int) bInput ); else hb_ret(); } HB_FUNC( COMMWRITE ) { hb_retl( commWrite( *(hb_parc(1)) ) ); } HB_FUNC( COMMGETERR ) { hb_retnd( dwError ); } HB_FUNC( SETRTS ) { EscapeCommFunction( hCom,SETRTS ); } HB_FUNC( CLRRTS ) { EscapeCommFunction( hCom,CLRRTS ); }

k_dima: в дистрибутиве от xharbour.com есть ct3comm.lib c функциями com_hard, com_soft, etc. Скачай демо с xharbour.com, проверь как работает



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