Форум » Clipper » Чем работать с модемом? Нид хелп! » Ответить

Чем работать с модемом? Нид хелп!

dr_yanson: Самое элементарное: как снять трубу, набрать номер, и т.д. Какая есть подходящая библиотека для работы с КОМ-портами, Заработает ли с Вин-модемом? Специалисты, отзовитесь!

Ответов - 5

Dima: C:\CLIPPER\CT3B\CTSOURCE\ Копай Clipper Tools Введение ------------------------------------------------------------------------------ Существует ряд способов использования последовательного порта. Модемы, считыватели штрихового кода и многие другие устройства передают данные через последовательный порт или управляются им. Несмотря на существующие стандарты, в каждом отдельном случае применяется свой тип связи. Функции, описываемые в этой главе, предназначены для обеспечения передачи данных и воздействия на разряды управляющих регистров последовательных портов. Они не поддерживают конкретные протоколы или специфические системы. Однако для некоторых применений, подобных протоколу XMODEM, можно многое почерпнуть в примерах программ, входящих в комплект поставки Clipper Tools II/5.0 (CT II). Параметры порта Такие параметры порта, как скорость передачи, четность, длина символа и количество стоповых битов, могут корректироваться, причем, без закрытия порта. Таким образом, скорость передачи можно изменять без потери содержимого буфера или прерывания установленного соединения (DTR-сигнал). Передача данных Функции CT II позволяют одновременно использовать до четырех последовательных портов, для которых могут быть выделены буферы приема и передачи размером до 64 Кбайтов каждый. В режиме фоновой передачи символы помещаются программой в буфер передачи, а принимаемые через порт символы с помощью обработчика прерываний записываются в буфер приема. Из Clipper-программы можно определять количество поступивших в буфер приема символов, а также управлять количеством символов, считываемых из него. Буфер передачи может осуществлять управление программой с помощью функций специального управления. Кроме того, в фоновом режиме возможна реализация как программной, так и аппаратной приостановки передачи. Приостановка передачи CT II-функции поддерживают как аппаратную, так и программную приостановку передачи. При угрозе переполнения буфера приема передающей стороне посылается сигнал о том, что дальнейшая передача данных должна быть приостановлена. Выбор метода приостановки зависит от используемого режима передачи данных. Аппаратная приостановка передачи обычно использует сигналы RTS (Request To Send - запрос на передачу или, иначе, запрос приемника внешнего устройства на передачу ему данных) и CTS (Clear To Send - готовность к передаче или, иначе, готовность к приему данных внешним устройством). Поэтому эти сигналы не могут одновременно использоваться CT II-функциями при работе с модемом. Обычно модемы не могут обеспечивать передачу этих сигналов управления непосредственно по установленному телефонному соединению. В таких случаях должна применяться программная приостановка передачи. Программный вариант приостановки передачи для управления потоком данных использует символы из ASCII-кода. Существует стандарт, определяющий код символа XOFF (приостановка передачи данных) как CHR(19) и код символа XON (сброс приостановки) как CHR(17). Эти символы можно ввести с клавиатуры: CHR(19) соответствует комбинации клавиш <Ctrl><S>, а CHR(17) - комбинации <Ctrl><Q>. Для управления потоком данных путем приостановки передачи обе стороны должны программно проверять заполнение буфера приема, чтобы либо деактивизировать CTS-сигнал, либо послать XOFF-символ. В свою очередь, на передающем конце должна постоянно осуществляться проверка деактивизации CTS-сигнала от удаленной (принимающей) станции или получения XOFF-символа. В любом из этих случаев передача должна быть немедленно приостановлена. Поскольку обычно нет уверенности, что передающая станция при получении XOFF-символа приостановит передачу немедленно, то сигнал неготовности к приему выдается при заполнении буфера на 75%. Если передающая станция игнорирует это предупреждение, то устанавливаемого по умолчанию размера буфера в 100 байтов (резерв в 25 байтов) может быть недостаточно. Описанные методы приостановки передачи полностью управляются средствами CT II и не касаются интерфейсных адаптеров или Универсальных Асинхронных Приемопередатчиков (УАПП - Universal Asinchronous Reseiver Transmitters - UARTs). Достаточно активизировать желаемый метод, чтобы позволить прикладной программе регулировать состояние буферов приема и передачи. Протоколы Как упоминалось выше, удаленная передача данных (с использованием модема), обычно осуществляется с реализацией программной приостановки. Существенным недостатком этого метода является то, что символы управления потоком, CHR(19) и CHR(17), не должны встречаться в исходных данных. Поскольку это делает невозможным передачу двоичных файлов, то для последних, должны использоваться специальные протоколы передачи. В поставляемые с CT II примеры программ включены XMODEM-процедуры, написанные на Clipper. Используя CT II-функции последовательного интерфейса и эти примеры в качестве основы, можно легко создать и другие протоколы. Поскольку реализация на Clipper стандартизованных протоколов не предоставляет реальных преимуществ, то они не включены в CT II. Управляющие сигналы Все важные управляющие сигналы последовательного порта, такие как CD (Carrier Detect - определение несущей), DTR (Data Terminal Ready - готовность терминала или, иначе, готовность передатчика внешнего устройства к передаче данных) и т.д., можно установить и опросить. С целью упрощения программирования для этих сигналов CT II обеспечивает отдельные функции, а для управляющих и контрольных сигналов, используемых реже, предоставляется возможность непосредственной записи в соответствующие регистры УАПП и считывания из них. Прямой доступ к аппаратным средствам Все CT II-функции последовательного интерфейса адресуются непосредственно к аппаратным средствам. Работа через вызовы BIOS или DOS не практикуется. Поэтому для нормального функционирования необходимо полное соответствие технических средств стандартам для IBM PC. Для правильного функционирования последовательных портов необходимо использование в них УАПП типа 8250 или совместимого с ним типа 16450. При использовании УАПП 8250, передача, управляемая прерываниями, возможна со скоростью до 2400 бод. Технические детали, относящиеся к портам и регистрам УАПП, можно найти в соответствующих инструкциях, таких как техническое руководство IBM. Адреса ввода/вывода и запросы прерываний Исходно в CT II установлены следующие значения для четырех обслуживаемых портов: Установочные значения для последовательных портов -------------------------------------------------------------------- Порт Адрес ввода/вывода IRQ (линия запроса прерывания) -------------------------------------------------------------------- COM1: 3F8H 4 (в соответствии с соглашениями) COM2: 2F8H 3 (в соответствии с соглашениями) COM3: 3E8H 4 (нет принятых соглашений) COM4: 2E8H 3 (нет принятых соглашений) -------------------------------------------------------------------- В отличие от COM1 и СОМ2 адреса ввода/вывода и линии запроса прерываний для других портов часто не совпадают с приведенными выше. При использовании неполностью совместимых аппаратных средств необходимо применять дополнительные функции COM_SETIO() и COM_SETIRQ(), позволяющие установить желаемые значения адресов ввода/вывода и линий запроса прерываний для программ обслуживания портов. Однако неправильные установки, если они входят в конфликт с установками для других аппаратных средств, могут привести к потере данных или повреждению аппаратуры. Правильные установочные значения для аппаратных средств можно найти в их документации. Возможные конфликты установок аппаратных средств CT II-функция COM_NUM() по четырем упомянутым выше адресам распознает наличие установленных портов от СОМ1 до СОМ4. Если, например, компьютер имеет встроенный ArcNet-адаптер, то это может привести к конфликту адресов ввода/вывода. Обращение внутренней функции CT II по адресу 02EAh как к последовательному порту, который по управлению отличается от ArcNet-адаптера, может нарушить существующие сетевые связи. В таких случаях может помочь вызов функции COM_SETIO() с заданием 0 в качестве адреса ввода/вывода: COM_SETIO(<nComPort>,0) После выполнения этого вызова во внутренней таблице будут уничтожены соответствующие стандартные адреса и конфликтующие аппаратные средства будут защищены от доступа со стороны CT II-функций. Однако это возможно лишь при условии, что функция COM_NUM() еще не вызывалась, поскольку иначе порт будет уже помечен как используемый ("in use"). Дополнительные замечания Как видно из приведенной выше таблицы установочных значений, CT II поддерживает совместно используемые прерывания, т.е. использование одной и той же линии запроса прерывания для нескольких портов. Однако стандартные аппаратные средства последовательного интерфейса обычно не поддерживают совместно используемые прерывания. Для этой цели производителями аппаратуры выпускаются специальные многопортовые адаптеры. Внимание! Работа с совместно используемыми прерываниями не гарантируется. CT II поддерживает до 4 портов, каждый из которых имеет свои буфера приема и передачи объемом до 64 Кбайтов и может передавать информацию со скоростью до 19200 бод. Однако это не означает, что все ресурсы могут использоваться одновременно на верхнем пределе возможностей. Выделение 8 буферов по 64 Кбайта невозможно, так как они обслуживаются по прерываниям и поэтому должны располагаться в основной (реальной) памяти. Кроме того, количество портов и максимально реализуемая ими скорость зависят от типа используемого компьютера. Отличия от других систем программирования CT II-функции COM_OPEN() и COM_INIT() не влияют на управляющие сигналы в отличие от аналогичных функций других языков, например BASIC. Для управления модемом через последовательный порт с использованием Clipper необходимо устанавливать DTR и другие сигналы, применяя соответствующие CT II-функции.

Pasha: На оазисе есть какая-то либа zmodem

gfilatov: dr_yanson пишет: Какая есть подходящая библиотека для работы с КОМ-портами Поищи библиотеку IOLib.lib version 1.2r1 Functions For IOLib Values for INIT_PORT can be seen in IOLib.ch Version 1.2r1 ******************************************************************************* INIT_PORT(Nx_port,Nbaud,Ndata,Nparity,Nstop,Nirq,@cIn_buffer) => log Initializes the communication port and sets up the input bufferd stream Pass: Nx_port= base port value see IOLib.ch Nbaud= The baud rate divisor see IOLib.ch for standard bauds Ndata=data bits 5 to 8 Nparity= Parity value see IOLib.ch Nstop=number of stop bits Nirq=Interrupt number cIn_buffer= a public String variable 512 bytes or larger, no more than 32k, ie <Public cIn_buffer:=SPACE(4000) > This option may change in the future to a numeric value for buffer size. ****************************************************************** OUTC(nVar,[nPort]) Sends a value out the communication port, default port is the one used by INIT_PORT(), optional any port. This function will wait a short time for the port to become available. nVar= a numeric value 0 to 255 nPort=hardware Port number to send the value NOTE: nPort not available in BETA version. ****************************************************************** OUTCHR(@cString) =log Spools a string out the Initialized port cString must not be larger than 32k, and no smaller than 1 byte, it may contain imbeded null bytes. The cString must remain public and can not be cleared until the buffer is clear see OUTBUFSIZE() Returns False if another stream is still spooling. ******************************************************************* INCHR(nVar) => cVar Returns one or more bytes communication port input buffer. Maximum is INITSIZE-1 Note: Returns NIL if no byte available do not mistake with chr(0) Example: cVar:=INCHR(1) do case case cVAR=NIL * do nothing case cVar=chr(0) * received break otherwise ?? cVar endcase *************************************************************** UNINT_PORT() returns NIL Uninitializes the communication port, this MUST be done before exiting program. Best use the following function. EXIT PROCEDURE cleanup() CLS UNINT_PORT() ? "Port Uninitialized, program terminating............." RETURN ********************************************************* ISWORKING() =>Log Returns TRUE if IRQ is working, the byte is set by the input/ouput spooler. ******************************************************** ISONLINE() => log Returns True if modem online ********************************************************* IOLIB_VER() =>cString Returns character string of IO version ********************************************************** SETDTR([lVar]) =>log returns .t. if DTR has been set, otherwise false optional lVar will set the DTR . EXAMPLE: LOCAL l_DTR l_DTR:=SETDTR(.T.) ************************************************************************* SETRTS([lvar]) => log returns .t. if RTS has been set, otherwise false optional lVar will set the RTS . EXAMPLE: LOCAL l_RTS l_DTR:=SETRTS(.T.) ************************************************************************** DSR() => log Returns .T. if DSR set better than Xon/Xoff ************************************************************************** CTS() => log Returns .T. if CTS set better than Xon/Xoff ************************************************************************** Note: You may use DTR/DSR as a Hardware version of Xon/Xoff or you may use RTS/CTS. Or none. If changing the IRQ, you must use UNINT_PORT() before using INIT_PORT() ************************************************************************** INBUFSIZE() => Num Returns a numeric value of how many characters remain in the inbuffer. Input buffer can hold up to one less than the init size. ************************************************************************** OUTBUFSIZE() => Num Returns a numeric value of how many characters remain in the ouput stream. ************************************************************************** INBUFCLR() clears the input buffer, all waiting characters are lost. ************************************************************************** OUTBUFCLR() clears the output buffer, all waiting characters are lost. ************************************************************************** CHKCRC(cString)=> cCrc Returns a 3 byte string pertaining to passed string. First byte is the checksum Second and third are a 16 bit CRC


gfilatov: /* MODEM.PRG is a sample use of the IOLib.LIB Standard ports list and their IRQs Com port HEX DECIMAL IRQ COM1: 3F8h 1016 4 COM2: 2F8h 760 3 COM3: 3E8h 1000 4 or 7 COM4: 2E8h 744 3 or 5 or 7 COM 3 and 4 may use another IRQ. Any IRQ from 2 to 7 may be used. IRQ 8 to 15 is also available but requiers an AT286 or higher IRQ15 may not be available to many 286 systems. SOME IRQs have other uses like your FLOPPY AND HARD drives see your ROMBIOS hand book. */ #include "IOLib.ch" PUBLIC nkey,cChr,IRQ3 PUBLIC inbuf,fgcl:=10,bgcl:=0 *EXIT PROCEDURE cleanup SETCANCEL(.f.) SET CONFIRM ON CLS EscSpool:="" GotEsc:=.f. IRQ3:=3 SET CURSOR ON *4K BUFFER *inbuf:=space(4000) IF !INIT_PORT(COM2,BPS57600,EIGHT_DATA_BITS,NO_PARITY,; ONE_STOP_BIT,IRQ3,8192) ? "No init! Wrong data" QUIT ENDIF IF ISWORKING() setcolor("10/") ? "Interrupt is working!" ELSE ? "Nothing yet..." ENDIF ? "" minit="ATX3E1&C1M1W1"+CHR(13) OUTCHR(@minit) *inkey(2) *minit:=REPLICATE("test ",30) *OUTCHR(@minit) FOR tmp = 1 to 20 *@ ROW(),0 say OUTBUFSIZE() IF OUTBUFSIZE()=0 EXIT ENDIF INKEY(.1) NEXT nkey:=0 setcolor(TRIM(STR(fgcl))+"/"+TRIM(STR(bgcl))) mr=ROW() mc=COL() SET CURSOR OFF mline:=ISONLINE() @ MAXROW(),0 SAY " "+IF(ISONLINE()=.t.,"OnLine ","OffLine")+" ¦ "+IOLIB_VER()+" ¦ DTR "+IF(SETDTR()=.t.,"on ","off")+"Alt-H=Help " COLOR "W+/R" @ mr,mc SAY "" SET CURSOR ON do while !nkey=301 && Alt-X nkey:=INKEY() IF nKey=18 &&PgUp XMODEM_TX() ELSEIF nKey=3 &&PgDn XMODEM_RX() ELSEIF nkey>0 .and. nkey<256 OUTC(nkey) ELSEIF nKey=291 && Alt-H mscr:=SAVESCREEN(5,5,20,65) @ 5,5,20,65 box "г=¬¦-=L¦ " color "w+/b" @ 5,25 say "[ ClipModem Help ]" color "w+/b" @ 6,7 say "KEY | Command Snytax" color "w+/b" @ 7,7 say "Alt-X | Exit program" color "w+/b" @ 8,7 say "Alt-D | Dial directory?" color "w+/b" @ 9,7 say "PgDn | Receive file" color "w+/b" @ 10,7 say "PgUp | Send file" color "w+/b" @ 12,7 say "IN-Buffer MAX size= "+LTRIM(STR(SIZEO()-1)) color "w+/b" @ 14,8 say "This is a sample only, don't do much.... " color "w+/b" @ 19,7 SAY "Press Any Key to return to terminal......" color "15*/9" set cursor off do while INKEY()=0 @ 6,35 say "Current status is "+IF(ISONLINE()," ONLINE","OFFLINE") color "w+/b" @ 7,35 say " DTR = "+IF(SETDTR(),"ON","OFF") color "w+/b" @ 8,35 say " RTS = "+IF(SETRTS(),"ON","OFF") color "w+/b" @ 9,35 say " DSR = "+IF(DSR(),"ON","OFF") color "w+/b" @ 10,35 say " CTS = "+IF(CTS(),"ON","OFF") color "w+/b" @ 11,35 say "BUFFER = "+LTRIM(STR(INBUFSIZE()))+" " color "w+/b" ENDDO set cursor on RESTSCREEN(5,5,20,65,mscr) ENDIF cChr:=INCHR(1) IF !cChr=NIL IF ASC(cChr)=10 .and. ROW()>MAXROW()-2 SCROLL(0,0,MAXROW()-1,79,1) ELSEIF ASC(cChr)=27 EscSpool:=chr(27) gotEsc:=.T. ELSEIF gotEsc EscSpool:=EscSpool+cChr IF ISALPHA(cChr) ANSI(EscSpool,cChr) gotEsc:=.F. ELSEIF LEN(EscSpool)>15 .or. !SUBSTR(EscSpool,2,1)=="[" gotEsc:=.f. ?? EscSpool ENDIF ELSE * IF COL()=MAXCOL() .AND. ROW()=MAXROW()-1 * SCROLL(0,0,MAXROW()-1,79,1) * @ ROW(),0 SAY "" * ENDIF ?? cChr ENDIF ENDIF IF ROW()=MAXROW() .OR. !mline=ISONLINE() mr=ROW() mc=COL() SET CURSOR OFF @ MAXROW(),0 SAY " "+IF(ISONLINE()=.t.,"OnLine ","OffLine")+" ¦ "+IOLIB_VER()+" ¦ DTR "+IF(SETDTR()=.t.,"on ","off")+"Alt-H=Help " COLOR "W+/R" IF mr=MAXROW() mr=MAXROW()-1 ENDIF @ mr,mc SAY "" SET CURSOR ON mline:=ISONLINE() ENDIF enddo QUIT ******************************************* * ANSI() may have bugs * * * FUNCTION ANSI(cString,cterm) LOCAL x,cSpec,nRow:=ROW(),nCol:=COL(),cfg:=NIL,cbg:=NIL LOCAL nfg:=NIL,nbg:=NIL,cbuf:="" LOCAL cClrs:={},lBright:=.f. *@ 24,70 SAY cString COLOR "w+/r" cString:=SUBSTR(cString,3) DO CASE CASE cString=="2J" @ 0,0 CLEAR TO MAXROW()-1,MAXCOL() nRow:=0 nCol:=0 CASE cString=="0m" fgcl:=7 bgcl:=0 setcolor("7/0") CASE cterm=="p" *^&*$(^ trying to remap your keyboard! CASE cString=="A" nRow:=nRow-1 CASE cString=="B" nRow:=nRow+1 CASE cString=="C" nCol:=nCol+1 CASE cString=="D" nCol:=nCol-1 CASE cString=="H" .or. cString=="f" nRow:=0 nCol:=0 CASE cString=="K" @ nRow,nCol CLEAR TO nRow,MAXCOL() CASE cterm=="A" nRow:=nRow-VAL(cString) CASE cterm=="B" nRow:=nRow+VAL(cString) CASE cterm=="C" nCol:=nCol+VAL(cString) CASE cterm=="D" nCol:=nCol-VAL(cString) CASE cterm=="H" .OR. cterm=="f" nRow:=VAL(cString) cString:=SUBSTR(cString,AT(";",cString)+1 ) nCol:=VAL(cString) CASE cterm=="m" && change color cbuf:=SUBSTR(cString,1,LEN(cString)-1) x=1 DO WHILE LEN(cbuf)>0 AADD(cClrs,VAL(cBuf)) IF AT(";",cbuf)=0 EXIT ENDIF cBuf:=SUBSTR(cBuf,AT(";",cbuf)+1) ENDDO bright:=IF(fgcl>7,.T.,.F.) blink:=IF(bgcl>7,.T.,.F.) FOR x=1 to LEN(cClrs) DO CASE CASE cClrs[x]==NIL CASE cClrs[x]==0 bright:=.f. blink:=.f. bgcl:=0 CASE cClrs[x]==1 bright:=.t. CASE cClrs[x]==5 blink:=.t. CASE cClrs[x]==7 nFg:=NIL nbg:=NIL fgcl:=0 bgcl:=7 bright:=.f. blink:=.f. EXIT CASE cClrs[x]>39 nBg:=ASCAN({40,44,42,46,41,45,43,47}, (cClrs[x]))-1 CASE cClrs[x]>29 nFg:=ASCAN({30,34,32,36,31,35,33,37} ,cClrs[x])-1 ENDCASE NEXT fgcl:=IF(nfg=NIL,fgcl,nfg) fgcl:=IF(bright .and. fgcl<8 ,fgcl+8,fgcl) bgcl:=IF(nbg=NIL,bgcl,nbg) bgcl:=IF(blink .and. bgcl<8 ,bgcl+8,bgcl) setcolor(TRIM(STR(fgcl))+IF(blink,"*/","/")+TRIM(STR(bgcl))) OTHERWISE * @ 24,10 say " "+ cString+" " ENDCASE nRow:=IF(nRow=MAXROW(),MAXROW()-1,nRow) nRow:=IF(nRow<0,0,nRow) nCol:=IF(nCol>MAXCOL(),MAXCOL(),nCol) nCol:=IF(nCol<0,0,nCol) @ nRow,nCol SAY "" RETURN NIL EXIT PROCEDURE cleanup() @ MAXROW(),0 say "" IF ISWORKING() ? "Interrupt is working!" ELSE ? "It did not work!" ENDIF UNINT_PORT() ? "Port Uninitialized............." RETURN

sasha2: В свое время тоже долго перебирал разные библиотеки для работы с COM портами для клиент-банка... Правда мне обязательно был нужен протокол zmodem. В конце концов све сделал с помощью TELEPATHY VERSION 2.1 от Extrasensory Software. Там есть все, однако про Winmodem под DOS можно забыть (забить). Определенные проблемы могут возникнуть и с USB модемами. Все зависит от поставляемых драйверов. Если будет надо, откликнись. Библа в RARе 640К, PRG из клиент-банка вообще копейки..



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