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


Аннотация


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

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


Управление связью MSCOMM32. OCX обеспечивает последовательное взаимодействие для вашего приложения, разрешая передачу и прием данных через последовательный порт, в котором разрешена только строка символов для буфера передачи. Эта функция ограничивает возможности передачи только текстовых файлов. В этой статье показано, как использовать элемент управления MSComm для передачи и приема двоичных данных с помощью кабеля RS-232. (Методики, описанные в этой статье, также будут работать с модемами.) Двоичные данные должны быть преобразованы в каждый момент времени на один байт и переданы. При получении данные должны быть преобразованы обратно в двоичные данные за один байт. В операционных системах с поддержкой DBCS (работающей операционной системы, в которой используется один из двухбайтовых наборов знаков) двоичные данные будут повреждены, если одно из двоичных значений соответствует символу "код сотрудника" в ДВУХБАЙТОВОЙ кодировке. Элемент управления MSComm интерпретирует этот байт и следующий байт как один двухбайтовый символ и возвращает только один байт для эквивалентного символа ASCII. Чтобы устранить эту проблему, вам нужно преобразовать один байт в 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 OleControl1RThreshold = 1     * triggers when at least one char is on the bufferSThreshold = 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 OleControl1RThreshold = 3-----------------------
Технология, управляемая событиями, создает событие oncomm, если в буфере ввода находятся символы, ожидающие обработки. Кроме того, свойство CommEvent будет содержать число 2. Для инициирования события oncomm необходимо установить для свойства Rthreshold значение, отличное от нуля (по умолчанию). Наиболее распространенным значением свойства RThreshold является 1, что означает, что событие oncomm инициируется, если в буфере ввода ожидается минимум один символ. В этой статье 3 используется как значение свойства RThreshold, так как отправляется 3 символа за один раз.