Как да изпращате и получавате двоични данни с помощта на контролата за VFP MSComm32


Обобщена информация


Тази статия илюстрира някои техники, използващи контролата за визуална FoxPro 3,0 Communications (MSComm) за получаване и предаване на двоични данни през кабел РС-232 (без модеми).

Повече информация


Управлението на комуникациите, MSCOMM32. OCX предоставя серийни съобщения за вашето приложение, като позволява изпращането и получаването на данни през сериен порт, където се разрешава само низ от знаци за предаване на буфера. Тази функция ви ограничава до предаване само на базирани на текст файлове. Тази статия показва как да използвате контролата MSComm, за да предавате и получавате двоични данни с помощта на 232 кабел за КОМПАКТДИСКОВЕ. (Техниките в тази статия също ще работят с модеми.) Двоичните данни трябва да бъдат конвертирани един байт в даден момент към даден знак и след това да бъдат предадени. Когато получите данни, данните трябва да бъдат конвертирани от знак обратно в двоични данни с един байт едновременно. При базирани на DBCS операционни системи (софтуер за операционна система, използващ един от двубайтовите набори от знаци) двоичните данни ще бъдат повредени, ако една от двоичните стойности съвпада с DBCS оловен знак. Контролата MSComm ще интерпретира този байт и следния байт като един двубайтов знак и ще върне само един байт за еквивалентния ASCII знак. За да отстраните този проблем, трябва да преобразувате един байт в 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 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-----------------------
Техниката, задвижвана от Event генерира събитие OnComm, когато има знаци, които чакат във входния буфер. Освен това свойството CommEvent ще съдържа числова 2. За да се задейства събитието OnComm, трябва да зададете свойството Rthreshold на стойност, различна от нула (по подразбиране). Най-често срещаната настройка за свойството RThreshold е 1, което означава, че събитието OnComm се задейства, ако най-малко един знак изчаква във входния буфер. В тази статия 3 се използва като стойност на свойството RThreshold, защото се изпращат 3 знака в даден момент.