VFP MSComm32 denetimini kullanarak ikili verileri iletme ve alma

Bu makalede, ikili verileri modemsiz bir RS-232 kablosu üzerinden almak ve iletmek için MSComm32.ocx denetiminin nasıl kullanılacağı açıklanmaktadır.

Orijinal ürün sürümü: Visual FoxPro
Özgün KB numarası: 154741

Özet

Bu makalede, IKILI verileri RS-232 kablosu üzerinden (modem olmadan) almak ve iletmek için Visual FoxPro 3.0 Communications (MSComm) denetiminin kullanıldığı bazı teknikler gösterilmektedir.

Daha fazla bilgi

İletişim denetimi, MSCOMM32. OCX, iletme arabelleğine yalnızca bir karakter dizesine izin verilen bir seri bağlantı noktası üzerinden verilerin iletilmesine ve alınmasına izin vererek uygulamanız için seri iletişim sağlar. Bu özellik yalnızca metin tabanlı dosyaları iletmenizi sınırlar.

Bu makalede, RS-232 kablosu kullanarak ikili verileri iletmek ve almak için MSComm denetiminin nasıl kullanılacağı gösterilmektedir. (Bu makaledeki teknikler modemlerle de çalışır.) İkili veriler bir kerede 1 bayt karaktere dönüştürülmeli ve sonra iletilmelidir. Veriler alındığında, bir karakterden bir kerede ikili veri 1 bayt'a dönüştürülmelidir.

DBCS özellikli işletim sistemlerinde (çift baytlık karakter kümelerinden birini kullanan işletim sistemi yazılımı çalıştırıldığında), ikili değerlerden biri DBCS baş karakteriyle eşleşirse ikili veriler bozulur. MSComm denetimi bu bayt ve aşağıdaki bayt değerini bir çift bayt karakter olarak yorumlar ve eşdeğer ASCII karakteri için yalnızca 1 bayt döndürür. Bu sorunu çözmek için, baş karakteri korumak için 1 bayt'ı üç karakterlik ASCII boyutuna dönüştürmeniz gerekir.

Örnek kod

Aşağıdaki kodda bu işlem gösterilmektedir.

Uyarı

BU MAKALEDE SAĞLANAN ÖRNEK KODUN KULLANıMı KENDI RISKI ALTıNDADıR. Microsoft bu örnek kodu, satılabilirlik ve/veya belirli bir amaca uygunlukla ilgili zımni garantiler dahil ancak bunlarla sınırlı olmamak üzere, açık veya zımni herhangi bir garanti olmadan "olduğu gibi" sağlar.

* 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
-----------------------

Olay temelli teknik, giriş arabelleğinde bekleyen karakterler olduğunda bir OnComm olayı oluşturur. Ayrıca, CommEvent özelliği sayısal 2 içerir. OnComm olayının tetiklenebilmesi için özelliğini sıfırdan (varsayılan) farklı bir değere ayarlamanız Rthreshold gerekir. Özelliği için RThreshold en yaygın ayar 1'dir, yani giriş arabelleğinde en az bir karakter bekliyorsa OnComm olayının tetiklendiğini gösterir. Bu makalede, bir kerede üç karakter gönderildiğinden RThreshold , özellik değeri olarak 3 kullanılıyor.