В категории Serial I/O находятся описания функций для
коммуникации посредством COM-портов. Эти функции основаны на
многоплатформной библиотеке EZV24 http://libezV24.sourceforge.net/.
Для использования необходимо линковать библтотеку clip-com:
clip -e test.prg -lclip-com
COM_COUNT() | Определяет число доступных символов в буфере приема. |
COM_DTR() | Запрашивает/устанавливает сигнал Data Terminal Ready (DTR). |
COM_FLUSH() | Очищает буфер приема. |
COM_HARD() | Включает/выключает аппаратное управление потоком символов (CTS/RTS). |
COM_INIT() | Инициализирует параметры порта. |
COM_NUM() | Возвращает кол-во доступных COM-портов. |
COM_OPEN() | Открывает порт и инициализирует буффер. |
COM_READ() | Читает символы из буфера приема. |
COM_RTS() | Запрашивает/устанавливает сигнал RTS. |
COM_SEND() | Передача данных. |
COM_SFLUSH() | Очищает буфер передачи. |
COM_SOFT() | Запрашивает статус или устанавливает программное управление потоком (XON/XOFF). |
COM_TIMEOUT() | Установливает таймаут операций в единицах 1/10 секунды. |
nTotalCharacters := COM_COUNT(<nComPort>)
Возвращает число доступных символов в буфере приема.
Эта функция позволяет узнать число доступных символов в буфере приема. Это позволяет определить, сколько символов может быть прочитано функцией COM_READ().
Если функция вызывается для закрытого порта, возвращается -1.
nCharacter := COM_COUNT(1) // Number of characters-port 1 IF nCharacter > 0 COM_READ(1, 1) // Read 1 character ENDIF
ITK,Paul
Не зависит от платформ
lOldDTRStatus := COM_DTR(<nComPort>,[<lNewDTRStatus>])
Возвращается .T. если DTR активен, .F. если нет. Если задан параметр <lNewDTRStatus>, возвращается значение сигнала перед вызовом функции.
COM_DTR() запрашивает или устанавливает статус сигнала DTR. Если второй параметр не указан, статус сигнала не изменяется.
Функция COM_CLOSE() сбрасывает сигнал DTR. Однако, COM_OPEN не устанавливает DTR автоматически.
lComOk := COM_OPEN(1) // Open COM1 IF lComOk COM_DTR(1, .T.) // Activate DTR Port 1 * ... ENDIF
ITK,Paul
Не зависит от платформ
lClear := COM_FLUSH(<nComPort>)
В случае успеха возвращает .T..
Эта функция позволяет очистить все символы в буфере приема.
COM_FLUSH() гарантирует полную очистку буфера приема. Однако, новые символы могут быть приняты между вызовом COM_COUNT() и COM_READ().
cHayes := "ATZ" // Hayes modem reset command COM_SEND(1, cHayes) // Issue Hayes command INKEY(1) // Wait one second COM_FLUSH(1) // Reject modem reply messages
ITK,Paul
Не зависит от платформ
lOldHandshake := COM_HARD(<nComPort>,<lNewHandshake>,[<lDTR/DSR>])
Когда функция вызывается только с параметром <nComPort>, возвращается .T. если аппаратное управление потоком включено, и .F. если выключено. Когда передается параметр <lNewHandshake>, функция возвращает предыдущий статус.
Размер буфера приема всегда ограничен. Для того чтобы предотвратить переполнение и потерю символов, используется аппаратое или программное управление потоком. При аппаратном управлении, порт использует сигнал RTS для остановки передачи. Когда аппаратный буфер приемника наполняется до 75%, RTS активизируется и останавливает передачу. Как только заполнение буфера снижается до 50%, сигнал RTS сбрасывается и разрешает передачу. Некоторые принтеры используют другой сигнал (DTR) вместо RTS и DSR вместо CTS. В этом случае необходимо установить параметр <lDTR/DSR> в .T.
Функция работает как при приеме, так и при передаче.
Если вы используете аппаратное управление потоком, сигнал RTS не должен устанавливаться вручную с использованием функций COM_RTS() или COM_MCR().
COM_OPEN(2) // Open COM2 COM_HARD(2, .T.) // RTS/CTS Hardware handshake
ITK,Paul
Не зависит от платформ
lInitialized := COM_INIT(<nComPort>,[<nBaudRate>],[<cParity>], [<nDataLength>],[<nStopBits>])
<nComPort> | - Определяет номер порта для инициализации |
<nBaudRate> | - Определяет битовую скорость для порта. Возможные значения 300, 600, 1200, 2400, 4800, 9600 19200 38400 бод Значение по умолчанию 9600 |
<cParity> | - Задает четность в виде: (E)ven, (O)dd, (M)ark, (S)pace, or (N)one. Значение по умолчанию (N)one. |
<nDataLength> | - Определяет число бит данных; возможные значения 7 или 8 бит. Значение по умолчанию - 8. |
<nStopBits> | - Определяет число стоп битов; 1 или 2. Значение по умолчанию 1. |
Если порт успешно инициализирован, возвращает .T.
Для иницализации открытого порта требуется четыре параметра. Это скорость порта в бодах (бит в секунду), число битов данных, четность, и число стоп-битов. По умолчанию выбираются следующие параметры: 9600 бод, 8 бит данных, проверка на четность отсутствует, 1 стоп-бит. Важно отметить, что любой из этих параметров может быть изменен, пока порт не закрыт. При использование этой функции данные и регистры статуса модема (DTR и другие) не затрагиваются.
Порт должен быть предварительно открыт. Инициализация не открытого порта невозможна.
Если любые из четырех параметров порта не заданы, либо заданы некорректно, используются значения по умолчанию: 9600 бод, без проверки на четность, 8 бит данных, 1 стоп-бит.
nBuff_size := 4000 // 4000 character buffer lComOk := COM_OPEN(1, nBuff_size) // Open port IF lComOk lInitOk := COM_INIT(1, 1200, "N", 8, 1) IF .NOT. lInitOk ? "Port cannot be initialized !" ENDIF ENDIF
ITK,Paul
Не зависит от платформ
nMaxCom := COM_NUM()
No arguments
Возвращает кол-во доступных COM-портов.
Эта функция позволяет узнать максимальное число последовательных портов в системе. Однако, она не гарантирует доступность портов. Например, если функция вернула 3, то COM2 может отсутствовать или быть недоступен. Реальная доступность порта проверяется функциями COM_OPEN() или COM_INIT().
? COM_NUM() // e.g. 4
ITK,Paul
Не зависит от платформ
lStatus := COM_OPEN(<nComPort>,<notused>,<notused>,<notused>, [<lRTSCTS>],[<lXONXOFF>],[<lDebug>])
Возвращает .T. если порт был успешно открыт.
Эта функция открывает порт последовательного интерфейса.
IF COM_NUM() > 0 ComOk := COM_OPEN(1) // Open COM1 IF .NOT. ComOk ? "Port cannot be opened !" ENDIF ENDIF
ITK,Paul
Не зависит от платформ
cData := COM_READ(<nComPort>,[<nLength>])
Возвращается строка, содержащая заданное число принятых символов.
Принимаемые символы запоминаются во внутреннем буфере. Существует возможность определить число символов в буфере, и чтения одного, нескольких, или всех символов. Если не задан параметр <nLength>, то читаются все доступные символы.
Учтите, что порт может принять дополнительные символы между вызовами COM_COUNT() и COM_READ().
DO WHILE COM_COUNT(1) < 10 // Wait until 10 characters in buffer *... ENDDO cInput := COM_READ(1, 10) // Read in 10 characters ? cInput
ITK,Paul
Не зависит от платформ
lOldRTSStatus := COM_RTS(<nComPort>,[<lNewRTSStatus>])
Возвращается .T. если RTS активен, .F. если нет. Если задан параметр <lNewRTSStatus>, возвращается значение сигнала перед вызовом функции.
COM_RTS() запрашивает или устанавливает статус сигнала RTS. Если второй параметр не указан, статус сигнала не изменяется.
Функция COM_CLOSE() сбрасывает сигнал RTS. Однако, COM_OPEN не устанавливает RTS автоматически.
lComOk := COM_OPEN(1) // Open COM1 IF lComOk COM_RTS(1, .T.) // Activate RTS Port 1 * ... ENDIF
ITK,Paul
Не зависит от платформ
nLength := COM_SEND(<nComPort>,<cString>)
Если передача была успешной, возвращает 0. Если передача была неполной, возвращает число непереданных символов.
Передает один или более символов через выбранный порт.
COM_OPEN(1) // COM_HARD(.T.) // Hardware handshake ACCEPT "Please input name " TO cInput nRest := COM_SEND(1, cInput) // 1st attempt to transmit DO WHILE nRest > 0 cInput := RIGHT(cInput, nRest) // Characters not yet sent nRest := COM_SEND(1, cInput) ENDDO
Не зависит от платформ
lDeleted := COM_SFLUSH(<nComPort>)
В случае успеха возвращает .T..
Эта функция удаляет все символы из буфера передачи, которые еще не переданы.
cHayes := "ATZ" // Hayes modem reset command COM_SEND(1, cHayes) // Issue Hayes command INKEY(1) // Wait one second COM_SFLUSH(1) // Reject modem reply messages
Не зависит от платформ
lOldHandshake := COM_SOFT(<nComPort>,[<lNewHandshake>],[<cXONchar>],[<cXOFFchar>])
<nComPort> | - Определяет номер порта. |
<lNewHandshake> | - Включает (.T.) или выключает (.F.) программное управление потоком. Если этот параметр опущен, функция возвращает текущие установки. |
<cXONchar> | - Определяет символ, используемый как XON. Значением по умолчанию является ASCII 19 - Ctrl-S. |
<cXOFFchar> | - Определяет значение символа, используемого как XOFF. Значением по умолчанию является ASCII 17 - Ctrl-Q. |
Функция возвращает предыдущее значение.
При использовании модемного соединения, а также в некоторых других случаях, аппаратное управление потоком не всегда возможно. Поэтому в таких случаях применяется программная реализация. Когда буфер приема заполняется на 75%, передается XOFF символ. При приеме которого удаленная станция должна приостановить пердачу.Как только наполнение буфера снижается до 50%, передается XON символ, разрешающий передачу удаленной станции.
Когда вы передаете бинарные данные, программное управление потоком должно быть отключено.
COM_OPEN(1) // Open port COM_SOFT(1, .T.) // Software handshake COM1
Не зависит от платформ
nOldTimeout := COM_TIMEOUT(<nComPort>[,<nTimeout>])
Возвращает предыдщее значение таймаута.
Все фукции чтения могут использовать механизм таймаута при ожидании символов. Если таймаут первышен, функция обрывает ожидание.
Длительность таймаута определяется параметром TenthOfSeconds. Значение задается в десятых долях секунды.
COM_OPEN(2) COM_TIMEOUT(6000)
Не зависит от платформ
Пред. | Начало | След. |
TERMINAL/IO | Уровень выше | TASK |