Передача и получение двоичных данных с помощью элемента управления VFP MSComm32

В этой статье описывается использование элемента управления MSComm32.ocx для получения и передачи двоичных данных по кабелю RS-232 без модемов.

Исходная версия продукта: Visual FoxPro
Исходный номер базы знаний: 154741

Сводка

В этой статье показаны некоторые методы, использующие элемент управления Visual FoxPro 3.0 Communications (MSComm) для получения и передачи двоичных данных по кабелю RS-232 (без модемов).

Дополнительная информация

Элемент управления Communications MSCOMM32. OCX обеспечивает последовательную связь для приложения, позволяя передавать и получать данные через последовательный порт, где разрешена только строка символов в буфер передачи. Эта функция ограничивает передачу только текстовых файлов.

В этой статье показано, как использовать элемент управления MSComm для передачи и получения двоичных данных с помощью кабеля RS-232. (Методы, описанные в этой статье, также будут работать с модемами.) Двоичные данные должны быть преобразованы по 1 байту в символ, а затем переданы. При получении данные должны быть преобразованы из символа обратно в двоичные данные 1 байт за раз.

В операционных системах с поддержкой DBCS (под управлением программного обеспечения операционной системы, использующего один из двухбайтовых символов) двоичные данные будут повреждены, если одно из двоичных значений соответствует символу клиента DBCS. Элемент управления MSComm интерпретирует этот байт и следующий байт как один двухбайтовый символ и возвращает только 1 байт для эквивалентного символа ASCII. Чтобы устранить эту проблему, необходимо преобразовать 1 байт в ASCII размером три символа, чтобы сохранить символ свинца.

Пример кода

Этот процесс показан в следующем коде.

Предупреждение

ИСПОЛЬЗОВАНИЕ ПРИМЕРА КОДА, ПРИВЕДЕННОГО В ЭТОЙ СТАТЬЕ, ОСУЩЕСТВЛЯЕТСЯ НА СВОЙ СТРАХ И РИСК. Корпорация Майкрософт предоставляет этот пример кода "как есть" без каких-либо гарантий, выраженных или подразумеваемых, включая, помимо прочего, подразумеваемые гарантии пригодности для торговли и (или) пригодности для определенной цели.

* Transmitter Code.

* INIT event of Comm OLE control
* 28800 baud, no parity, 8 data, and 1 stop bit.
* In RS-232, maximum speed of 28800 baud can be used

This.Settings = "28800,N,8,1"
This.InputLen = 1
This.CommPort = 1
This.PortOpen = .T.

* ONCOMM event of Comm OLE Control
* The following code is needed to make sure that next set of characters
* can be transmitted (CommEvent = 2 is triggered from the receiver side)

IF This.CommEvent = 2
This.input
IF gnTop <= gnEnd
gcString = FREAD(gnFileHandle, 1) && Store to memory
q=asc(gcstring)
* change ASCII to character (size of 3) to preserve the lead char
thisform.olecontrol1.output = str(q,3)
gnTop = gnTop + 1
ENDIF
ENDIF

* INIT event of form
PUBLIC gnFileHandle
PUBLIC gnEnd
PUBLIC gnTop
PUBLIC q
* You should replace 'c:\sample.hlp' with your own binary file
STORE FOPEN('c:\sample.hlp') TO gnFileHandle && Open the file
STORE FSEEK(gnFileHandle, 0, 2) TO gnEnd && Move pointer to EOF
STORE FSEEK(gnFileHandle, 0) TO gnTop && Move pointer to BOF
gntop=1
q=""
-----------------------
Property of OleControl1

RThreshold = 1 * triggers when at least one char is on the buffer
SThreshold = 3
----------------------

* Receiver Code.

* INIT event of OleControl1
* 28800 baud, no parity, 8 data, and 1 stop bit.

This.Settings = "28800,N,8,1"
This.InputLen = 3
This.CommPort = 1
This.PortOpen = .T.

* OnComm event

IF This.CommEvent = 2 AND This.InBufferCount > 0
qq=CHR(VAL(This.Input))
=FWRITE(gnFileHandle,qq)
this.output = CHR(26)
ENDIF
* INIT event of form
PUBLIC gnFileHandle
* You should replace 'c:\sample.hlp' with your own file name
IF FILE('c:\sample.hlp') && Does file exist?
gnErrFile = FOPEN('c:\sample.hlp',12) && If so, open read-write
ELSE
gnErrFile = FCREATE('c:\sample.hlp') && If not, create it
ENDIF
= FCLOSE(gnErrFile) && Close the file
STORE FOPEN('c:\sample.hlp',1) TO gnFileHandle && Open the file
* CLICK event of button
*This tells the transmitting side to start sending the file
Thisform.Olecontrol1.output = CHR(26)
-----------------------
Property of OleControl1
RThreshold = 3
-----------------------

Метод, управляемый событиями, создает событие OnComm, если во входном буфере ожидают символы. Кроме того, CommEvent свойство будет содержать число 2. Чтобы событие OnComm было активировано, необходимо задать Rthreshold для свойства значение, отличное от нуля (по умолчанию). Наиболее распространенным параметром RThreshold для свойства является 1, то есть событие OnComm активируется, если во входном буфере ожидается не менее одного символа. В этой статье 3 используется в качестве значения RThreshold свойства, так как одновременно отправляются три символа.