VFP MSComm32 컨트롤을 사용하여 이진 데이터 전송 및 받기

이 문서에서는 MSComm32.ocx 컨트롤을 사용하여 모뎀 없이 RS-232 케이블을 통해 이진 데이터를 수신하고 전송하는 방법을 설명합니다.

원래 제품 버전: Visual FoxPro
원본 KB 번호: 154741

요약

이 문서에서는 모뎀 없이 RS-232 케이블을 통해 이진 데이터를 수신하고 전송하기 위해 MSComm(Visual FoxPro 3.0 Communications) 컨트롤을 사용하는 몇 가지 기술을 보여 줍니다.

추가 정보

communications 컨트롤, MSCOMM32. OCX는 전송 버퍼에 대한 문자 문자열만 허용되는 직렬 포트를 통해 데이터를 전송하고 수신할 수 있도록 하여 애플리케이션에 대한 직렬 통신을 제공합니다. 이 기능은 텍스트 기반 파일만 전송하도록 제한합니다.

이 문서에서는 MSComm 컨트롤을 사용하여 RS-232 케이블을 사용하여 이진 데이터를 전송하고 수신하는 방법을 보여 줍니다. (이 문서의 기술은 모뎀에서도 작동합니다.) 이진 데이터는 한 번에 1바이트를 문자로 변환한 다음 전송해야 합니다. 수신되면 데이터를 문자에서 한 번에 1바이트의 이진 데이터로 다시 변환해야 합니다.

DBCS 지원 운영 체제(더블 바이트 문자 집합 중 하나를 사용하는 운영 체제 소프트웨어 실행)에서 이진 값 중 하나가 DBCS 잠재 고객 문자와 일치하는 경우 이진 데이터가 손상됩니다. MSComm 컨트롤은 이 바이트와 다음 바이트를 하나의 더블 바이트 문자로 해석하고 해당하는 ASCII 문자에 대해 1 바이트만 반환합니다. 이 문제를 resolve 위해 1 바이트를 3자의 ASCII 크기로 변환하여 주인공을 유지해야 합니다.

샘플 코드

다음 코드에서는 이 프로세스를 보여 줍니다.

경고

이 문서에 제공된 샘플 코드의 사용은 사용자 고유의 위험입니다. Microsoft는 특정 목적에 대한 상품성 및/또는 적합성에 대한 묵시적 보증을 포함하지만 이에 국한되지 않는 표현 또는 묵시적 보증 없이 이 샘플 코드를 "있는 그대로" 제공합니다.

* 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 이벤트를 트리거하려면 속성을 0이 아닌 값(기본값)으로 설정 Rthreshold 해야 합니다. 속성에 RThreshold 대한 가장 일반적인 설정은 1입니다. 즉, 입력 버퍼에서 최소 한 문자가 대기 중인 경우 OnComm 이벤트가 트리거됩니다. 이 문서에서는 한 번에 세 문자가 전송되기 때문에 3을 속성 값 RThreshold 으로 사용하고 있습니다.