On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение



Пост N: 106
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 23.04.09 08:24. Заголовок: Работа с Com-портом?


Понадобилось переделать Клиппер-программу работающую с 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()

Как мне победить ком-порт по Харбором?



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 2 [только новые]


moderator


Пост N: 171
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 23.04.09 09:30. Заголовок: Ничего не знаю про ф..


Ничего не знаю про функции работы с 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 );
}



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 39
Зарегистрирован: 19.12.06
ссылка на сообщение  Отправлено: 23.04.09 09:32. Заголовок: в дистрибутиве от xh..


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


Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 33
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет