Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Системное программирование. Учебное пособие-1
.pdf
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {perror(MODEMDEVICE); exit(-1); }
/* ɫɨɯɪɚɧɢɬɶ ɬɟɤɭɳɢɟ ɧɚɫɬɪɨɣɤɢ ɩɨɪɬɚ */
tcgetattr(fd,&oldtio);
/* ɨɱɢɳɚɟɦ ɫɬɪɭɤɬɭɪɭ ɞɥɹ ɧɨɜɵɯ ɧɚɫɬɪɨɟɤ */
bzero(&newtio, sizeof(newtio));
/* BAUDRATE: ɭɫɬɚɧɚɜɥɢɜɚɟɬ ɫɤɨɪɨɫɬɶ ɩɟɪɟɞɚɱɢ ɞɚɧɧɵɯ ɜ
bps (ɛɨɞ ɜ ɫɟɤɭɧɞɭ).
CRTSCTS : ɚɩɩɚɪɚɬɧɨɟ ɭɩɪɚɜɥɟɧɢɟ ɜɵɜɨɞɧɵɦ ɩɨɬɨɤɨɦ
ɞɚɧɧɵɯ (ɢɫɩɨɥɶɡɭɟɬɫɹ, ɬɨɥɶɤɨ ɟɫɥɢ ɤɚɛɟɥɶ ɨɛɥɚɞɚɟɬ ɜɫɟɦɢ
ɧɟɨɛɯɨɞɢɦɵɦɢ ɫɢɝɧɚɥɶɧɵɦɢ ɥɢɧɢɹɦɢ.
CS8 : 8n1 (8 ɛɢɬ, ɛɟɡ ɱɟɬɧɨɫɬɢ, 1 ɫɬɨɩ-ɛɢɬ)
CLOCAL : ɥɨɤɚɥɶɧɨɟ ɩɨɞɤɥɸɱɟɧɢɟ, ɧɟɬ ɭɩɪɚɜɥɟɧɢɹ ɦɨ-
ɞɟɦɨɦ
CREAD : ɪɚɡɪɟɲɚɟɬ ɩɪɢɟɦ ɫɢɦɜɨɥɨɜ */ newtio.c_cflag
= BAUDRATE | CRTSCTS | CS8 |
CLOCAL | CREAD;
/* IGNPAR : ɢɝɧɨɪɢɪɨɜɚɬɶ ɛɚɣɬɵ ɫ ɨɲɢɛɤɚɦɢ ɱɟɬɧɨɫɬɢ
ICRNL : ɨɬɨɛɪɚɡɢɬɶ ɫɢɦɜɨɥ CR ɧɚ NL (ɢɧɚɱɟ ɜɜɨɞ CR
ɧɚ ɞɪɭɝɨɦ ɤɨɦɩɶɸɬɟɪɟ ɧɟ ɛɭɞɟɬ ɡɚɜɟɪɲɚɬɶ ɜɜɨɞ). ɂɧɚɱɟ
ɭɫɬɚɧɨɜɢɬɶ ɭɫɬɪɨɣɫɬɜɨ ɤɚɤ raw (ɧɟɬ ɨɛɪɚɛɨɬɤɢ ɜɜɨɞɚ) */
newtio.c_iflag = IGNPAR | ICRNL;
/* ȼɵɜɨɞ ɛɟɡ ɨɛɪɚɛɨɬɤɢ */
newtio.c_oflag = 0;
/* ICANON : ɪɚɡɪɟɲɢɬɶ ɤɚɧɨɧɢɱɟɫɤɢɣ ɜɜɨɞ, ɡɚɛɥɨ-
ɤɢɪɨɜɚɬɶ ɥɸɛɨɟ "ɷɯɨ", ɢ ɧɟ ɩɨɫɵɥɚɬɶ ɫɢɝɧɚɥɵ ɜɵɡɵɜɚɸɳɟɣ
ɩɪɨɝɪɚɦɦɟ */
newtio.c_lflag = ICANON;
/* ɢɧɢɰɢɚɥɢɡɚɰɢɹ ɜɫɟɯ ɭɩɪɚɜɥɹɸɳɢɯ ɫɢɦɜɨɥɨɜ ɡɧɚɱɟɧɢɹ
ɩɨ
ɭɦɨɥɱɚɧɢɸ ɦɨɝɭɬ ɛɵɬɶ ɧɚɣɞɟɧɵ ɜ in
/usr/include/termios.h */
newtio.c_cc[VINTR] = 0; /* Ctrl-c */
newtio.c_cc[VQUIT] = 0; /* Ctrl-\ */
newtio.c_cc[VERASE] = 0; /* del */
newtio.c_cc[VKILL] = 0; /* @ */
newtio.c_cc[VEOF] = 4; /* Ctrl-d */
newtio.c_cc[VTIME] = 0;
/* ɫɢɦɜɨɥɶɧɵɣ ɬɚɣɦɟɪ ɧɟ ɢɫɩɨɥɶɡɭɟɬɫɹ */
newtio.c_cc[VMIN] = 1;
/* ɛɥɨɤɢɪɨɜɚɧɢɟ ɱɬɟɧɢɹ ɩɨɤɚ ɩɨɫɬɭɩɚɟɬ
ɨɞɢɧ ɫɢɦɜɨɥ until 1 */
newtio.c_cc[VSWTC] = 0; /* '\0' */
newtio.c_cc[VSTART] = 0; /* Ctrl-q */
newtio.c_cc[VSTOP] = 0; /* Ctrl-s */
newtio.c_cc[VSUSP] = 0; /* Ctrl-z */
111

newtio.c_cc[VEOL] = 0; /* '\0' */
newtio.c_cc[VREPRINT] = 0; /* Ctrl-r */
newtio.c_cc[VDISCARD] = 0; /* Ctrl-u */
newtio.c_cc[VWERASE] = 0; /* Ctrl-w */
newtio.c_cc[VLNEXT] = 0; /* Ctrl-v */
newtio.c_cc[VEOL2] = 0; /* '\0' */
/* ɬɟɩɟɪɶ ɨɱɢɳɚɟɦ ɦɨɞɟɦɧɭɸ ɥɢɧɢɸ ɢ ɚɤɬɢɜɢɪɭɟɦ ɧɚɲɢ
ɭɫɬɚɧɨɜɤɢ ɩɨɪɬɚ */
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
/* ɬɟɪɦɢɧɚɥɶɧɵɟ ɭɫɬɚɧɨɜɤɢ ɜɵɩɨɥɧɟɧɵ, ɬɟɩɟɪɶ ɩɪɢɫɬɭɩɚ-
ɟɦ ɤ ɨɛɪɚɛɨɬɤɟ ɜɜɨɞɚ. ȼ ɷɬɨɦ ɩɪɢɦɟɪɟ, ɜɜɨɞ ɫɢɦɜɨɥɚ 'z'ɜ
ɧɚɱɚɥɟ ɫɬɪɨɤɢ ɛɭɞɟɬ ɡɚɜɟɪɲɚɬɶ ɪɚɛɨɬɭ ɩɪɨɝɪɚɦɦɵ. */
while (STOP==FALSE) {
/* ɰɢɤɥ ɞɨ ɬɟɯ ɩɨɪ, ɩɨɤɚ ɧɟ ɩɨɥɭɱɢɦ ɭɫɥɨɜɢɟ ɡɚ-
ɜɟɪɲɟɧɢɹ */
res = read(fd,buf,255);
buf[res]=0; /* ɭɫɬɚɧɨɜɢɜ ɡɚɜɟɪɲɢɬɟɥɶ ɫɬɪɨɤɢ ɬɚɤɢɦ
ɨɛɪɚɡɨɦ
,
ɦɵ ɦɨɠɟɦ ɜɵɩɨɥɧɹɬɶ
printf */
printf(":%s:%d\n", buf, res);
if (buf[0]=='z') STOP=TRUE; }
/* ɜɨɫɫɬɚɧɨɜɥɟɧɢɟ ɫɬɚɪɵɯ ɭɫɬɚɧɨɜɨɤ ɩɨɪɬɚ */
tcsetattr(fd,TCSANOW,&oldtio);
}
ɉɪɨɝɪɚɦɦɚ ɜɵɩɨɥɧɹɟɬ ɱɬɟɧɢɟ ɛɥɨɤɚ ɞɨ ɬɟɯ ɩɨɪ, ɩɨɤɚ ɧɟ ɛɭɞɟɬ ɩɨɥɭɱɟɧ
ɫɢɦɜɨɥ ɡɚɜɟɪɲɟɧɢɹ ɫɬɪɨɤɢ, ɞɚɠɟ ɟɫɥɢ ɧɚ ɜɜɨɞ ɩɨɥɭɱɟɧɨ ɛɨɥɟɟ 255 ɫɢɦɜɨɥɨɜ.
ȿɫɥɢ ɤɨɥɢɱɟɫɬɜɨ ɩɪɨɱɢɬɚɧɧɵɯ ɫɢɦɜɨɥɨɜ ɦɟɧɶɲɟ, ɱɟɦ ɤɨɥɢɱɟɫɬɜɨ ɞɨɫɬɭɩɧɵɯ
ɫɢɦɜɨɥɨɜ, ɬɨ ɩɨɫɥɟɞɭɸɳɟɟ ɱɬɟɧɢɟ ɜɨɡɜɪɚɬɢɬ ɨɫɬɚɜɲɢɟɫɹ ɫɢɦɜɨɥɵ. ȼ ɩɟɪɟɦɟɧɧɨɣ res ɛɭɞɟɬ
ɭɫɬɚɧɨɜɥɟɧɨ ɤɨɥɢɱɟɫɬɜɨ ɪɟɚɥɶɧɨ ɩɪɨɱɢɬɚɧɧɵɯ ɫɢɦɜɨɥɨɜ.
ȼ ɪɟɠɢɦɟ ɨɛɪɚɛɨɬɤɢ ɧɟɤɚɧɨɧɢɱɟɫɤɨɝɨ ɜɜɨɞɚ ɩɨɫɬɪɨɱɧɚɹ ɫɛɨɪɤɚ ɜɜɨɞɚ,
ɨɱɢɫɬɤɚ, ɭɞɚɥɟɧɢɟ ɫɥɨɜ ɢ ɩɪɨɱɢɟ ɨɩɟɪɚɰɢɢ ɧɟ ɩɪɨɢɡɜɨɞɹɬɫɹ. ɉɨɜɟɞɟɧɢɟɦ ɷɬɨɝɨ
ɪɟɠɢɦɚ ɭɩɪɚɜɥɹɸɬ ɞɜɚ ɩɚɪɚɦɟɬɪɚ: c_cc[VTIME] ɭɫɬɚɧɚɜɥɢɜɚɟɬ ɫɢɦɜɨɥɶɧɵɣ
ɬɚɣɦɟɪ, ɢ c_cc[VMIN] ɭɫɬɚɧɚɜɥɢɜɚɟɬ ɦɢɧɢɦɚɥɶɧɨɟ ɤɨɥɢɱɟɫɬɜɨ ɫɢɦɜɨɥɨɜ, ɤɨɬɨɪɵɟ ɧɟɨɛɯɨɞɢɦɨ ɩɪɢɧɹɬɶ ɞɥɹ ɭɞɨɜɥɟɬɜɨɪɟɧɢɹ ɨɩɟɪɚɰɢɢ ɱɬɟɧɢɹ.
ɤɨɥɢɱɟɫɬɜɨ ɫɢɦɜɨɥɨɜ,
ȿɫɥɢ MIN > 0 ɢ TIME = 0, ɬɨ MIN ɭɫɬɚɧɚɜɥɢɜɚɟɬ
ɤɨɬɨɪɵɟ ɧɟɨɛɯɨɞɢɦɨ ɩɪɢɧɹɬɶ ɞɥɹ ɜɵɩɨɥɧɟɧɢɹ ɨɩɟɪɚɰɢɢ ɱɬɟɧɢɹ. Ɍɚɤ ɤɚɤ TIME
ɭɫɬɚɧɨɜɥɟɧɨ ɜ ɧɭɥɶ, ɬɨ ɬɚɣɦɟɪ ɧɟ ɢɫɩɨɥɶɡɭɟɬɫɹ.
ȿɫɥɢ MIN = 0 ɢ TIME > 0, ɬɨ TIME ɬɪɚɤɬɭɟɬɫɹ, ɤɚɤ ɡɧɚɱɟɧɢɟ ɜɪɟɦɟɧɢ
ɨɠɢɞɚɧɢɹ. Ɉɩɟɪɚɰɢɹ ɱɬɟɧɢɹ ɛɭɞɟɬ ɡɚɜɟɪɲɟɧɚ ɭɫɩɟɲɧɨ, ɟɫɥɢ ɩɪɨɱɢɬɚɧ ɨɞɢɧɨɱɧɵɣ ɫɢɦɜɨɥ, ɢɥɢ ɡɧɚɱɟɧɢɟ TIME ɛɭɞɟɬ ɩɪɟɜɵɲɟɧɨ (t = TIME *0.1 ɫ). ȿɫɥɢ
ɛɭɞɟɬ ɜɨɡɜɪɚɳɟɧɨ ɧɢ ɨɞɧɨɝɨ ɫɢɦɜɨɥɚ.
ɡɧɚɱɟɧɢɟ TIME ɩɪɟɜɵɲɟɧɨ, ɬɨ
ɧɟ
ȿɫɥɢ MIN > 0 ɢ TIME > 0, ɬɨ TIME ɫɥɭɠɢɬ ɤɚɤ ɦɟɠɫɢɦɜɨɥɶɧɵɣ ɬɚɣɦɟɪ.
Ɉɩɟɪɚɰɢɹ ɱɬɟɧɢɹ ɫɱɢɬɚɟɬɫɹ ɡɚɜɟɪɲɟɧɧɨɣ, ɟɫɥɢ ɛɭɞɟɬ ɩɪɢɧɹɬɨ MIN ɫɢɦɜɨɥɨɜ,
112

ɢɥɢ ɜɪɟɦɹ ɦɟɠɞɭ ɩɟɪɟɞɚɱɟɣ ɞɜɭɯ ɫɢɦɜɨɥɨɜ ɞɨɫɬɢɝɥɨ TIME. Ɍɚɣɦɟɪ ɩɟɪɟɡɚɩɭɫɤɚɟɬɫɹ ɤɚɠɞɵɣ ɪɚɡ ɩɪɢ ɩɪɢɟɦɟ ɧɨɜɨɝɨ ɫɢɦɜɨɥɚ ɢ ɚɤɬɢɜɢɪɭɟɬɫɹ ɩɨɫɥɟ ɩɪɢɟɦɚ
ɩɟɪɜɨɝɨ ɫɢɦɜɨɥɚ.
ȿɫɥɢ MIN = 0 ɢ TIME = 0, ɬɨ ɱɬɟɧɢɟ ɛɭɞɟɬ ɡɚɜɟɪɲɟɧɨ ɧɟɦɟɞɥɟɧɧɨ. ɉɪɢ
ɷɬɨɦ ɨɩɟɪɚɰɢɹ ɱɬɟɧɢɹ ɜɟɪɧɟɬ ɱɢɫɥɨ ɮɚɤɬɢɱɟɫɤɢ ɞɨɫɬɭɩɧɵɯ ɫɢɦɜɨɥɨɜ ɢɥɢ ɱɢɫɥɨ
ɡɚɩɪɨɲɟɧɧɵɯ ɫɢɦɜɨɥɨɜ.
Ɋɚɫɫɦɨɬɪɢɦ ɪɟɚɥɢɡɚɰɢɸ ɧɟɤɚɧɨɧɢɱɟɫɤɨɝɨ ɜɜɨɞɚ ɧɚ ɩɪɢɦɟɪɟ
.
ɉɪɢɦɟɪ 3.34. ɇɟɤɚɧɨɧɢɱɟɫɤɢɣ ɜɜɨɞ ɱɟɪɟɡ COM-ɩɨɪɬ.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1
/* POSIX-ɫɨɜɦɟɫɬɢɦɵɣ ɢɫɬɨɱɧɢɤ */
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void main() {
int fd,c, res;
struct termios oldtio,newtio;
char buf[255];
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) {perror(MODEMDEVICE); exit(-1); }
tcgetattr(fd,&oldtio); /* ɫɨɯɪɚɧɟɧɢɟ ɬɟɤɭɳɢɯ ɭɫɬɚɧɨɜɨɤ
ɩɨɪɬɚ */
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL |
CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
/* ɪɟɠɢɦ ɜɜɨɞɚ: ɧɟɤɚɧɨɧɢɱɟɫɤɢɣ, ɛɟɡ «ɷɯɚ» */
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0; /* ɩɨɫɢɦɜɨɥɶɧɵɣ ɬɚɣɦɟɪ
ɧɟ ɢɫɩɨɥɶɡɭɟɬɫɹ */
newtio.c_cc[VMIN] = 5; /* ɛɥɨɤɢɪɨɜɤɚ ɱɬɟɧɢɹ ɞɨ
ɬɟɯ ɩɨɪ, ɩɨɤɚ ɧɟ ɛɭɞɭɬ ɩɪɢɧɹɬɵ 5 ɫɢɦɜɨɥɨɜ */
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
while (STOP==FALSE) { /* ɰɢɤɥ ɜɜɨɞɚ */
res = read(fd,buf,255); /* ɜɵɯɨɞ ɩɨɫɥɟ ɩɪɢɟɦɚ 5-ɬɢ
ɫɢɦɜɨɥɨɜ */
113

buf[res]=0; /* ɞɥɹ ɬɨɝɨ, ɱɬɨɛɵ ɦɵ ɦɨɝɥɢ ɢɫɩɨɥɶɡɨɜɚɬɶ
ɮɭɧɤɰɢɸ printf... */
printf(":%s:%d\n", buf, res);
if (buf[0]=='z') STOP=TRUE; }
tcsetattr(fd,TCSANOW,&oldtio);
}
ɇɢɠɟ ɪɚɫɫɦɨɬɪɟɧ ɩɪɢɦɟɪ ɚɫɢɧɯɪɨɧɧɨɝɨ ɜɜɨɞɚ.
ɉɪɢɦɟɪ 3.35. Ⱥɫɢɧɯɪɨɧɧɵɣ ɜɜɨɞ ɱɟɪɟɡ COM-ɩɨɪɬ.
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1
/* POSIX-ɫɨɜɦɟɫɬɢɦɵɣ ɢɫɬɨɱɧɢɤ */
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO(int status);
/* ɨɛɴɹɜɥɟɧɢɟ ɨɛɪɚɛɨɬɱɢɤɚ ɫɢɝɧɚɥɚ */
int wait_flag=TRUE; /* ɮɥɚɝ ɨɠɢɞɚɧɢɹ - TRUE, ɩɨɤɚ ɧɟ
ɩɨɥɭɱɟɧ ɫɢɝɧɚɥ */
void main() {
int fd,c, res;
struct termios oldtio,newtio;
struct sigaction saio;
/* ɨɛɴɹɜɥɟɧɢɟ ɞɟɣɫɬɜɢɹ ɫɢɝɧɚɥɚ (signal action) */
char buf[255];
/* ɨɬɤɪɵɜɚɟɦ ɭɫɬɪɨɣɫɬɜɨ, ɤɚɤ ɧɟ ɛɥɨɤɢɪɭɟɦɨɟ (ɜɵɡɨɜ
read ɜɨɡɜɪɚɬɢɬ
ɭɩɪɚɜɥɟɧɢɟ
ɧɟɦɟɞɥɟɧɧɨ) */
fd = open(MODEMDEVICE, O_RDWR |
O_NOCTTY | O_NONBLOCK);
if (fd <0) {perror(MODEMDEVICE); exit(-1); } /* ɭɫɬɚ-
ɧɚɜɥɢɜɚɟɦ ɨɛɪɚɛɨɬɱɢɤ ɫɢɝɧɚɥɚ ɩɟɪɟɞ ɭɫɬɚɧɨɜɤɨɣ ɭɫɬɪɨɣɫɬɜɚ
ɤɚɤ ɚɫɢɧɯɪɨɧɧɨɝɨ */
saio.sa_handler = signal_handler_IO;
saio.sa_mask = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
/* ɪɚɡɪɟɲɚɟɦ ɩɪɨɰɟɫɫɭ ɩɨɥɭɱɚɬɶ SIGIO */ fcntl(fd,
F_SETOWN, getpid());
114

/* ɞɟɥɚɟɦ ɮɚɣɥɨɜɵɣ ɨɩɢɫɚɬɟɥɶ ɚɫɢɧɯɪɨɧɧɵɦ */
fcntl(fd, F_SETFL, FASYNC);
/* ɫɨɯɪɚɧɹɟɦ ɬɟɤɭɳɢɟ ɧɚɫɬɪɨɣɤɢ ɩɨɪɬɚ */
tcgetattr(fd,&oldtio);
/* ɡɚɞɚɟɦ ɧɨɜɵɟ ɭɫɬɚɧɨɜɤɢ ɩɨɪɬɚ ɞɥɹ ɨɛɪɚɛɨɬɤɢ ɤɚ-
ɧɨɧɢɱɟɫɤɨɝɨ ɜɜɨɞɚ */
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 |
CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
/* ɰɢɤɥ ɨɠɢɞɚɧɢɹ ɜɜɨɞɚ. Ɂɞɟɫɶ ɦɨɠɧɨ ɩɪɨɢɡɜɨɞɢɬɶ ɞɪɭ-
ɝɢɟ ɨɩɟɪɚɰɢɢ */
while (STOP==FALSE) {
printf(".\n");usleep(100000);
/* ɩɨɫɥɟ ɩɨɥɭɱɟɧɢɹ SIGIO, wait_flag = FALSE, ɜɜɨɞ ɞɨ-
ɫɬɭɩɟɧ ɢ ɦɨɠɟɬ ɛɵɬɶ ɩɪɨɱɢɬɚɧ */
if (wait_flag==FALSE) {
res = read(fd,buf,255);
buf[res]=0;
printf(":%s:%d\n", buf, res);
if (res==1) STOP=TRUE; /* ɨɫɬɚɧɚɜɥɢɜɚɟɦ ɰɢɤɥ ɩɪɢ ɜɜɨ-
ɞɟ
ɫɢɦɜɨɥɚ
CR */
wait_flag = TRUE; /* ɠɞɟɦ ɧɨɜɨɝɨ ɜɜɨɞɚ */
}
}
/* ɜɨɫɫɬɚɧɚɜɥɢɜɚɟɦ ɫɬɚɪɵɟ ɧɚɫɬɪɨɣɤɢ ɩɨɪɬɚ */
tcsetattr(fd,TCSANOW,&oldtio); } /* ɨɛɪɚɛɨɬɱɢɤ ɫɢɝɧɚɥɚ.
ɭɫɬɚɧɚɜɥɢɜɚɟɬ wait_flag ɜ FALSE ɞɥɹ ɢɧɞɢɤɚɰɢɢ ɧɚɥɢɱɢɹ
ɩɪɢɧɹɬɨɝɨ ɫɢɦɜɨɥɚ */
void signal_handler_IO(int status) {
printf("received SIGIO signal.\n");
wait_flag = FALSE; }
3.3.4. ɉɪɨɝɪɚɦɦɢɪɨɜɚɧɢɟ USB [7, 8]
ɍɧɢɜɟɪɫɚɥɶɧɚɹ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɚɹ ɲɢɧɚ (Universal Serial Bus – USB) ɨɛɟɫ-
ɩɟɱɢɜɚɟɬ ɪɚɫɲɢɪɹɟɦɵɣ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɵɣ ɢɧɬɟɪɮɟɣɫ Plug and Play (ɚɜɬɨɦɚɬɢɱɟɫɤɚɹ ɢɞɟɧɬɢɮɢɤɚɰɢɹ ɩɨɞɤɥɸɱɟɧɧɨɝɨ ɭɫɬɪɨɣɫɬɜɚ), ɨɛɟɫɩɟɱɢɜɚɸɳɢɣ ɫɬɚɧɞɚɪɬɧɨɟ ɩɨɞɤɥɸɱɟɧɢɟ ɞɥɹ ɛɨɥɶɲɢɧɫɬɜɚ ɩɟɪɢɮɟɪɢɣɧɵɯ ɭɫɬɪɨɣɫɬɜ, ɬɚɤɢɯ ɤɚɤ ɤɥɚɜɢɚɬɭɪɵ, ɦɵɲɢ, ɞɠɨɣɫɬɢɤɢ, ɩɪɢɧɬɟɪɵ, ɫɤɚɧɟɪɵ, ɭɫɬɪɨɣɫɬɜɚ ɯɪɚɧɟɧɢɹ ɞɚɧɧɵɯ, ɦɨ-
115

ɞɟɦɵ ɢ ɜɢɞɟɨɤɚɦɟɪɵ. ɉɟɪɟɯɨɞ ɧɚ USB ɪɟɤɨɦɟɧɞɨɜɚɧ ɞɥɹ ɜɫɟɯ ɩɟɪɢɮɟɪɢɣɧɵɯ
ɭɫɬɪɨɣɫɬɜ, ɤɨɬɨɪɵɟ ɢɫɩɨɥɶɡɭɸɬ ɭɫɬɚɪɟɜɲɢɟ ɩɨɪɬɵ, ɬɚɤɢɟ ɤɚɤ PS/2, ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɵɟ ɢ ɩɚɪɚɥɥɟɥɶɧɵɟ ɩɨɪɬɵ.
Ɉɩɟɪɚɰɢɨɧɧɵɟ ɫɢɫɬɟɦɵ Windows ɜɤɥɸɱɚɸɬ ɜɫɬɪɨɟɧɧɭɸ ɩɨɞɞɟɪɠɤɭ ɤɨɧ-
ɬɪɨɥɥɟɪɨɜ, ɤɨɧɰɟɧɬɪɚɬɨɪɨɜ ɢ ɭɫɬɪɨɣɫɬɜ USB, ɤɨɬɨɪɵɟ ɫɨɨɬɜɟɬɫɬɜɭɸɬ ɨɮɢɰɢɚɥɶɧɨɣ ɫɩɟɰɢɮɢɤɚɰɢɢ. Windows ɩɪɟɞɨɫɬɚɜɥɹɟɬ ɩɪɨɝɪɚɦɦɧɵɟ ɢɧɬɟɪɮɟɣɫɵ, ɤɨɬɨɪɵɟ ɦɨɠɧɨ ɢɫɩɨɥɶɡɨɜɚɬɶ ɞɥɹ ɪɚɡɪɚɛɨɬɤɢ ɞɪɚɣɜɟɪɨɜ ɭɫɬɪɨɣɫɬɜ ɢ ɩɪɢɥɨɠɟɧɢɣ,
ɪɟɚɥɢɡɭɸɳɢɯ ɨɛɦɟɧ
ɞɚɧɧɵɦɢ ɫ USB-ɭɫɬɪɨɣɫɬɜɨɦ.
ɇɚ ɦɨɦɟɧɬ ɧɚɩɢɫɚɧɢɹ ɩɨɫɨɛɢɹ ɢɡɜɟɫɬɧɵ ɫɥɟɞɭɸɳɢɟ ɜɟɪɫɢɢ ɫɬɚɧɞɚɪɬɚ
USB: 1.0, 1.1, 2.0, 3.0, 3.1, 3.2. Ƚɥɚɜɧɵɦ ɨɬɥɢɱɢɟɦ ɦɟɠɞɭ ɜɟɪɫɢɹɦɢ ɫɬɚɧɞɚɪɬɚ
ɹɜɥɹɟɬɫɹ ɩɪɨɩɭɫɤɧɚɹ ɫɩɨɫɨɛɧɨɫɬɶ ɲɢɧɵ. Ⱦɥɹ ɜɟɪɫɢɢ 1.1 ɦɚɤɫɢɦɚɥɶɧɚɹ ɫɤɨɪɨɫɬɶ ɩɟɪɟɞɚɱɢ ɞɚɧɧɵɯ ɧɟ ɩɪɟɜɵɲɚɟɬ 12 Ɇɛɢɬ/ɫ, ɚ ɞɥɹ ɜɟɪɫɢɢ 3.2 ɦɚɤɫɢɦɚɥɶɧɚɹ
ɫɤɨɪɨɫɬɶ ɡɚɹɜɥɟɧɚ ɧɚ ɭɪɨɜɧɟ 20 Ƚɛɢɬ/ɫ. ɍɫɬɪɨɣɫɬɜɚ, ɩɨɞɞɟɪɠɢɜɚɸɳɢɟ USB 3.2
ɜ ɧɚɫɬɨɹɳɟɟ ɜɪɟɦɹ ɭɠɟ ɩɪɟɞɫɬɚɜɥɟɧɵ ɧɚ ɪɵɧɤɟ
ɨɛɨɪɭɞɨɜɚɧɢɹ. ɇɚ ɧɚɫɬɨɹɳɢɣ
ɦɨɦɟɧɬ ɧɚɢɛɨɥɟɟ ɪɚɫɩɪɨɩɪɨɫɬɚɧɟɧɧɨɣ ɹɜɥɹɟɬɫɹ ɜɟɪɫɢɹ USB 3.0.
ȼ ɩɟɪɜɭɸ ɨɱɟɪɟɞɶ, ɞɥɹ ɪɚɛɨɬɵ ɫ USB ɧɟɨɛɯɨɞɢɦɨ ɩɪɟɞɫɬɚɜɥɹɬɶ ɫɬɪɭɤɬɭɪɭ
ɷɬɨɝɨ ɢɧɬɟɪɮɟɣɫɚ. Ɉɫɧɨɜɨɣ ɢɧɬɟɪɮɟɣɫɚ ɫɥɭɠɢɬ ɛɚɡɨɜɨɟ ɭɫɬɪɨɣɫɬɜɨ (host), ɤɨɬɨɪɨɟ ɫɜɹɡɵɜɚɟɬ ɤɨɦɩɶɸɬɟɪ ɢ ɞɪɭɝɢɟ USB-ɭɫɬɪɨɣɫɬɜɚ ɩɨɫɪɟɞɫɬɜɨɦ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɨɣ ɲɢɧɵ. Ɍɨɩɨɥɨɝɢɹ ɢɧɬɟɪɮɟɣɫɚ ɪɟɚɥɢɡɨɜɚɧɚ ɩɨ ɫɯɟɦɟ «ɡɜɟɡɞɚ», ɜ ɤɨɬɨɪɭɸ ɜɯɨɞɹɬ ɪɚɡɜɟɬɜɢɬɟɥɢ (hub), ɱɟɪɟɡ ɤɨɬɨɪɵɟ ɢ ɩɨɞɤɥɸɱɚɸɬɫɹ
ɧɟɩɨɫɪɟɞɫɬɜɟɧ-
ɧɨ ɫɚɦɢ ɭɫɬɪɨɣɫɬɜɚ USB.
ɋɬɚɧɞɚɪɬ USB ɩɨɡɜɨɥɹɟɬ ɩɨɞɤɥɸɱɚɬɶ ɞɨ 5 ɛɚɡɨɜɵɯ ɭɫɬɪɨɣɫɬɜ ɢ ɞɨ 127 ɤɨ-
ɧɟɱɧɵɯ ɭɫɬɪɨɣɫɬɜ.
Ʉɨɪɧɟɜɨɣ ɛɚɡɨɜɵɣ ɭɡɟɥ ɜɤɥɸɱɚɟɬ ɜ ɫɟɛɹ ɤɨɧɬɪɨɥɥɟɪ ɛɚɡɨɜɨɝɨ ɭɡɥɚ, ɜɵɩɨɥ-
ɧɹɸɳɢɣ ɨɫɧɨɜɧɵɟ ɡɚɞɚɱɢ:
1. Ⱥɜɬɨɦɚɬɢɱɟɫɤɨɟ ɨɩɪɟɞɟɥɟɧɢɟ ɩɨɞɤɥɸɱɟɧɢɹ ɢɥɢ ɭɞɚɥɟɧɢɹ ɭɫɬɪɨɣɫɬɜ USB.
2. ɍɩɪɚɜɥɟɧɢɟ ɨɛɦɟɧɨɦ ɞɚɧɧɵɦɢ ɦɟɠɞɭ ɛɚɡɨɜɵɦ ɭɡɥɨɦ ɢ ɭɫɬɪɨɣɫɬɜɚɦɢ
USB.
3. ɋɛɨɪ ɫɬɚɬɢɫɬɢɱɟɫɤɢɯ ɫɜɟɞɟɧɢɣ ɨ ɬɟɤɭɳɢɯ
ɫɨɫɬɨɹɧɢɹɯ ɩɨɞɤɥɸɱɟɧɧɵɯ
ɭɫɬɪɨɣɫɬɜ.
4. Ɉɛɟɫɩɟɱɟɧɢɟ ɢ ɭɩɪɚɜɥɟɧɢɟ ɩɢɬɚɧɢɟɦ ɩɨɞɤɥɸɱɟɧɧɵɯ USB-ɭɫɬɪɨɣɫɬɜ.
Ʉɪɨɦɟ ɚɩɩɚɪɚɬɧɨɣ, ɨɛɟɫɩɟɱɢɜɚɟɬɫɹ ɩɪɨɝɪɚɦɦɧɚɹ ɩɨɞɞɟɪɠɤɚ USB, ɤɨɬɨɪɚɹ
ɪɟɚɥɢɡɭɟɬ ɫɥɟɞɭɸɳɢɟ ɜɨɡɦɨɠɧɨɫɬɢ:
1. ɉɪɨɫɦɨɬɪ ɭɫɬɪɨɣɫɬɜ USB ɧɚ ɲɢɧɟ ɢ ɩɨɥɭɱɟɧɢɟ ɢɯ ɤɨɧɮɢɝɭɪɚɰɢɢ.
2. ɂɡɨɯɪɨɧɧɭɸ ɢ ɚɫɢɧɯɪɨɧɧɭɸ ɩɟɪɟɞɚɱɭ ɞɚɧɧɵɯ.
3. ɍɩɪɚɜɥɟɧɢɟ ɩɢɬɚɧɢɟɦ.
4. ɍɩɪɚɜɥɟɧɢɟ ɢɧɮɨɪɦɚɰɢɟɣ ɞɥɹ ɲɢɧɵ ɢ ɭɫɬɪɨɣɫɬɜ USB.
ɋɬɚɧɞɚɪɬɧɚɹ ɫɜɹɡɶ ɦɟɠɞɭ ɛɚɡɨɜɵɦ ɭɡɥɨɦ ɢ USB-ɭɫɬɪɨɣɫɬɜɨɦ
ɮɨɪɦɢɪɭɟɬɫɹ
ɧɚ ɨɫɧɨɜɟ ɩɪɨɝɪɚɦɦɧɨ-ɚɩɩɚɪɚɬɧɨɝɨ ɤɨɦɩɥɟɤɫɚ, ɜ ɤɨɬɨɪɵɣ ɜɯɨɞɹɬ:
1. Ɏɢɡɢɱɟɫɤɨɟ ɭɫɬɪɨɣɫɬɜɨ, ɩɨɞɤɥɸɱɟɧɧɨɟ ɫ ɨɞɧɨɣ ɫɬɨɪɨɧɵ ɤɚɛɟɥɹ USB.
2. Ʉɥɢɟɧɬɫɤɨɟ ɩɪɨɝɪɚɦɦɧɨɟ ɨɛɟɫɩɟɱɟɧɢɟ, ɪɚɡɪɚɛɨɬɚɧɧɨɟ ɞɥɹ ɤɨɧɤɪɟɬɧɨɝɨ
ɭɫɬɪɨɣɫɬɜɚ USB ɢ ɜɡɚɢɦɨɞɟɣɫɬɜɭɸɳɟɟ ɫ ɛɚɡɨɜɵɦ ɭɡɥɨɦ.
3. ɋɢɫɬɟɦɧɨɟ ɩɪɨɝɪɚɦɦɧɨɟ ɨɛɟɫɩɟɱɟɧɢɟ, ɩɪɟɞɧɚɡɧɚɱɟɧɧɨɟ ɞɥɹ ɩɨɞɞɟɪɠɤɢ
ɢɧɬɟɪɮɟɣɫɚ USB ɜ ɤɨɧɤɪɟɬɧɨɣ ɨɩɟɪɚɰɢɨɧɧɨɣ ɫɢɫɬɟɦɟ.
116

ɭɫɬɪ
(
b
4. Ȼɚɡɨɜɵɣ ɭɡɟɥ-ɤɨɧɬɪɨɥɥɟɪ, ɫɨɞɟɪɠɚɳɢɣ ɤɚɤ ɚɩɩɚɪɚɬɧɵɟ, ɬɚɤ ɢ ɩɪɨɝɪɚɦɦ-
ɧɵɟ ɫɪɟɞɫɬɜɚ ɞɥɹ ɩɨɞɤɥɸɱɟɧɢɹ ɭɫɬɪɨɣɫɬɜɚ USB.
Ɉɛɦɟɧ ɞɚɧɧɵɦɢ ɩɨ ɲɢɧɟ ɜɵɩɨɥɧɹɟɬɫɹ ɩɨɫɪɟɞɫɬɜɨɦ ɩɚɤɟɬɨɜ ɞɚɧɧɵɯ. Ʉɚɠ-
ɞɵɣ ɩɚɤɟɬ ɫɨɞɟɪɠɢɬ:
1. ɉɨɥɟ ɫɢɧɯɪɨɧɢɡɚɰɢɢ ɪɚɡɦɟɪɨɦ 8 ɛɢɬ ɞɥɹ ɫɬɚɧɞɚɪɬɚ 1.1 ɢ 32 ɛɢɬɚ ɞɥɹ
ɫɬɚɧɞɚɪɬɚ 2.0.
2. ɉɨɥɟ ɢɞɟɧɬɢɮɢɤɚɬɨɪɚ ɩɚɤɟɬɚ ɪɚɡɦɟɪɨɦ 8 ɛɢɬ, ɜ ɤɨɬɨɪɨɦ ɦɥɚɞɲɢɟ 4 ɛɢɬɚ
ɨɩɪɟɞɟɥɹɸɬ ɬɢɩ ɩɚɤɟɬɚ
, ɚ ɫɬɚɪɲɢɟ – ɫɨɞɟɪɠɚɬ ɤɨɧɬɪɨɥɶɧɭɸ ɫɭɦɦɭ ɞɥɹ ɩɪɚ-
ɜɢɥɶɧɨɣ ɪɚɫɲɢɮɪɨɜɤɢ ɞɚɧɧɵɯ.
3. ɉɨɥɟ ɚɞɪɟɫɚ, ɫɥɭɠɚɳɟɟ ɞɥɹ ɨɩɪɟɞɟɥɟɧɢɹ ɤɨɧɟɱɧɨɣ ɬɨɱɤɢ ɪɚɫɩɨɥɨɠɟɧɢɹ
ɭɫɬɪɨɣɫɬɜɚ ɧɚ ɲɢɧɟ.
4. Ⱦɨɩɨɥɧɢɬɟɥɶɧɨɟ ɩɨɥɟ ɤɨɧɟɱɧɨɣ ɬɨɱɤɢ, ɤɨɬɨɪɨɟ ɩɪɟɞɫɬɚɜɥɹɟɬ ɫɨɛɨɣ ɞɨ-
ɩɨɥɧɢɬɟɥɶɧɨɟ 4-ɛɢɬɨɜɨɟ ɩɨɥɟ ɚɞɪɟɫɚ, ɟɫɥɢ ɭɫɬɪɨɣɫɬɜɨ ɬɪɟɛɭɟɬ ɛɨɥɟɟ ɨɞɧɨɣ ɤɨɧɟɱɧɨɣ ɬɨɱɤɢ.
5. ɉɨɥɟ ɧɭɦɟɪɚɰɢɢ ɫɱɟɬɱɢɤɚ ɛɚɡɨɜɨɝɨ ɭɡɟɥɚ, ɢɦɟɸɳɟɟ
ɪɚɡɦɟɪ 11 ɛɢɬ, ɦɨ-
ɠɟɬ ɩɪɢɧɢɦɚɬɶ ɦɚɤɫɢɦɚɥɶɧɨɟ ɡɧɚɱɟɧɢɟ 7FFh.
6. ɉɨɥɟ ɞɚɧɧɵɯ, ɤɨɬɨɪɨɟ ɦɨɠɟɬ ɢɦɟɬɶ ɪɚɡɦɟɪ ɨɬ 0 ɞɨ 1024 ɛɚɣɬɨɜ ɢ ɫɨɞɟɪ-
ɠɢɬ ɩɟɪɟɞɚɜɚɟɦɵɟ ɞɚɧɧɵɟ.
Ⱦɥɹ ɭɩɪɚɜɥɟɧɢɹ ɩɚɤɟɬɚɦɢ ɞɚɧɧɵɯ ɛɚɡɨɜɵɣ ɭɡɟɥ ɮɨɪɦɢɪɭɟɬ ɬɪɚɧɡɚɤɰɢɢ
(ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɨɫɬɢ ɪɚɡɥɢɱɧɵɯ ɞɟɣɫɬɜɢɣ, ɨɛɴɟɞɢɧɟɧɧɵɯ ɜ ɨɛɳɭɸ ɝɪɭɩɩɭ), ɤɨɬɨɪɵɟ ɫɨɫɬɨɹɬ ɢɡ ɫɥɟɞɭɸɳɢɯ ɩɚɤɟɬɨɜ: ɩɚɤɟɬ ɨɩɢɫɚɧɢɹ ɭɫɬɪɨɣɫɬɜɚ USB (ɬɢɩ ɢ
ɚɞɪɟɫ), ɧɚɩɪɚɜɥɟɧɢɹ
ɩɟɪɟɞɚɱɢ (ɨɬ ɛɚɡɨɜɨɝɨ ɭɡɥɚ ɤ ɭɫɬɪɨɣɫɬɜɭ ɢɥɢ ɧɚɨɛɨɪɨɬ), ɩɚ-
ɤɟɬ ɞɚɧɧɵɯ ɢ ɩɚɤɟɬ ɩɨɞɬɜɟɪɠɞɟɧɢɹ (ɪɟɡɭɥɶɬɚɬ ɩɪɢɟɦɚ ɢɥɢ ɩɟɪɟɞɚɱɢ ɞɚɧɧɵɯ).
ȼ ɧɚɱɚɥɟ ɪɚɛɨɬɵ ɛɚɡɨɜɵɣ ɭɡɟɥ ɩɨɫɵɥɚɟɬ ɭɫɬɪɨɣɫɬɜɭ ɡɚɩɪɨɫ ɭɫɬɚɧɨɜɤɢ ɞɥɹ
ɢɞɟɧɬɢɮɢɤɚɰɢɢ ɢ ɨɩɪɟɞɟɥɟɧɢɹ ɨɫɧɨɜɧɵɯ ɫɜɨɣɫɬɜ. Ɋɚɡɦɟɪ ɭɫɬɚɧɨɜɨɱɧɨɝɨ ɡɚɩɪɨɫɚ ɫɨɫɬɚɜɥɹɟɬ 8 ɛɚɣɬ. ȿɝɨ ɫɬɪɭɤɬɭɪɚ ɩɪɢɜɟɞɟɧɚ ɜ ɬɚɛɥɢɰɟ 3.16.
Ɍ ɚ ɛ ɥ ɢ
ɰ ɚ 3.16
ɋɬɪɭɤɬɭɪɚ ɡɚɩɪɨɫɚ ɭɫɬɚɧɨɜɤɢ
Ɋɚɡɦɟɪ
ɩɨɥɹ,
ɛɚɣɬ
Ɉɩɢɫɚɧɢɟ
ɋɦɟɳɟɧɢɟ
ɇɚɢɦɟɧɨɜɚɧɢɟ
ɩɨɥɹ
0 bmRequestType 1 Ɉɩɪɟɞɟɥɹɟɬ ɬɢɩ ɡɚɩɪɨɫɚ (ɬɚɛɥ. 3.17)
ɋɬɚɧɞɚɪɬɧɵɣ ɬɢɩ ɡɚɩɪɨɫɚ (ɬɚɛɥ. 3.18),
1 bRequest 1
ɤɨɬɨɪɵɣ ɞɨɥɠɟɧ ɩɨɞɞɟɪɠɢɜɚɬɶɫɹ ɜɫɟɦɢ
ɨɣɫɬɜɚɦɢ USB
Ⱦɨɩɨɥɧɢɬɟɥɶɧɨɟ ɨɩɢɫɚɧɢɟ ɩɚɪɚɦɟɬɪɚ
2 wValue 2
ɡɚɩɪɨɫɚ, ɤɚɤ ɩɪɚɜɢɥɨ, ɬɢɩ ɨɩɢɫɚɬɟɥɹ
ɬɚɛɥ. 3.19)
4 wIndex 2
Ⱦɨɩɨɥɧɢɬɟɥɶɧɨɟ ɨɩɢɫɚɧɢɟ ɩɚɪɚɦɟɬɪɚ
ɡɚɩɪɨɫɚ
Ɋɚɡɦɟɪ ɩɟɪɟɞɚɜɚɟɦɵɯ ɞɚɧɧɵɯ. Ɂɚɜɢɫɢɬ
6 wLength 2
ɨɬ ɛɢɬɚ ɧɚɩɪɚɜɥɟɧɢɹ ɩɟɪɟɞɚɱɢ ɞɚɧɧɵɯ
mRequestType
ɩɨɥɹ
117

–
ɭɫɬɪ
–
ɭɫɬɪ
ɭɫɬɪ
ɪ
ɪ
Ɍɢɩ ɡɚɩɪɨɫɚ bmRequestType
Ȼɢɬɵ
0–4
ɉɨɥɭɱɚɬɟɥɶ: 0 – ɭɫɬɪɨɣɫɬɜɨ, 1 – ɢɧɬɟɪɮɟɣɫ, 2 – ɤɨɧɟɱɧɚɹ
ɬɨɱɤɚ, 3
ɞɪɭɝɨɣ ɩɨɥɭɱɚɬɟɥɶ
Ɍɢɩ ɡɚɩɪɨɫɚ: 0 – ɨɛɵɱɧɵɣ, 1 – ɨɫɨɛɵɣ ɞɥɹ ɨɩɪɟɞɟɥɟɧɧɨɝɨ
5, 6
ɤɥɚɫɫɚ ɭɫɬɪɨɣɫɬɜ, 2 – ɨɩɪɟɞɟɥɟɧɧɵɣ ɩɪɨɢɡɜɨɞɢɬɟɥɟɦ
ɨɣɫɬɜɚ, 3 – ɪɟɡɟɪɜ
ɇɚɩɪɚɜɥɟɧɢɟ ɩɟɪɟɞɚɱɢ: 0 – ɨɬ ɛɚɡɨɜɨɝɨ ɭɡɥɚ ɤ ɭɫɬɪɨɣɫɬɜɭ,
7
ɨɬ ɭɫɬɪɨɣɫɬɜɚ ɤ ɛɚɡɨɜɨɦɭ ɭɡɥɭ
1
ɋɬɚɧɞɚɪɬɧɵɟ ɬɢɩɵ ɡɚɩɪɨɫɨɜ
Ʉɨɞ
ɡɚɩɪɨɫɚ
Ɍɢɩ ɡɚɩɪɨɫɚ Ɉɩɢɫɚɧɢɟ
00h GET_STATUS
01h CLEAR_FEATURE
03h SET_FEATURE
05h SET_ADDRESS
06h GET_DESCRIPTOR
07h SET_DESCRIPTOR
08h GET_CONFIGURATION
09h SET_CONFIGURATION
0Ah GET_INTERFACE
0Bh SET_INTERFACE
0Ch SYNCH_FRAME
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.17
Ɉɩɢɫɚɧɢɟ
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.18
ɉɨɥɭɱɚɟɬ ɫɨɫɬɨɹɧɢɟ ɨɩɪɟɞɟɥɟɧɧɨɝɨ
ɭɫɬɪɨɣɫɬɜɚ (ɩɨɥɭɱɚɬɟɥɹ)
ɂɫɩɨɥɶɡɭɟɬɫɹ ɞɥɹ ɨɱɢɫɬɤɢ ɢɥɢ
ɨɬɤɥɸɱɟɧɢɹ ɨɩɪɟɞɟɥɟɧɧɨɣ ɧɚɫɬɪɨɣɤɢ
ɨɣɫɬɜɚ
ɂɫɩɨɥɶɡɭɟɬɫɹ ɞɥɹ ɭɫɬɚɧɨɜɤɢ ɢɥɢ
ɜɤɥɸɱɟɧɢɹ ɨɩɪɟɞɟɥɟɧɧɨɣ ɧɚɫɬɪɨɣɤɢ
ɨɣɫɬɜɚ
ɍɫɬɚɧɚɜɥɢɜɚɟɬ ɚɞɪɟɫ ɭɫɬɪɨɣɫɬɜɚ ɞɥɹ
ɞɚɥɶɧɟɣɲɟɝɨ ɞɨɫɬɭɩɚ
ɉɨɥɭɱɚɟɬ ɨɩɢɫɚɬɟɥɶ ɭɫɬɪɨɣɫɬɜɚ, ɟɫɥɢ
ɨɧ ɫɭɳɟɫɬɜɭɟɬ
Ⱦɨɩɨɥɧɢɬɟɥɶɧɵɣ ɡɚɩɪɨɫ ɞɥɹ
ɨɛɧɨɜɥɟɧɢɹ ɢɧɮɨɪɦɚɰɢɢ
ɨ ɫɭɳɟɫɬɜɭɸɳɟɦ ɢɥɢ ɜɧɨɜɶ ɞɨɛɚɜɥɟɧɧɨɦ ɨɩɢɫɚɬɟɥɟ ɭɫɬɪɨɣɫɬɜɚ
ɉɨɥɭɱɚɟɬ ɡɧɚɱɟɧɢɟ ɬɟɤɭɳɟɣ
ɤɨɧɮɢɝɭɪɚɰɢɢ ɭɫɬɪɨɣɫɬɜɚ
ɍɫɬɚɧɚɜɥɢɜɚɟɬ ɤɨɧɮɢɝɭɪɚɰɢɸ
ɭɫɬɪɨɣɫɬɜɚ
ɉɨɥɭɱɚɟɬ ɜɵɛɪɚɧɧɭɸ ɧɚɫɬɪɨɣɤɭ ɞɥɹ
ɨɩɪɟɞɟɥɟɧɧɨɝɨ ɢɧɬɟɪɮɟɣɫɚ
ɉɨɡɜɨɥɹɟɬ ɛɚɡɨɜɨɦɭ ɭɡɟɥɭ ɜɵɛɢɪɚɬɶ
ɞɨɩɨɥɧɢɬɟɥɶɧɵɟ ɧɚɫɬɪɨɣɤɢ ɞɥɹ
ɨɩ
ɟɞɟɥɟɧɧɨɝɨ ɢɧɬɟɪɮɟɣɫɚ
ɉɪɟɞɧɚɡɧɚɱɟɧ ɞɥɹ ɭɫɬɚɧɨɜɤɢ
ɢ ɫɨɨɛɳɟɧɢɹ ɫɬɪɭɤɬɭɪɵ ɨɛɴɟɤɬɚ
ɫɢɧɯ
ɨɧɢɡɚɰɢɢ ɞɥɹ ɤɨɧɟɱɧɨɣ ɬɨɱɤɢ
118

Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.19
ɋɬɚɧɞɚɪɬɧɵɟ ɬɢɩɵ ɨɩɢɫɚɬɟɥɟɣ
Ɂɧɚɱɟɧɢɟ Ɍɢɩ ɨɩɢɫɚɬɟɥɹ
01h Ɉɩɢɫɚɬɟɥɶ ɭɫɬɪɨɣɫɬɜɚ
02h Ɉɩɢɫɚɬɟɥɶ ɤɨɧɮɢɝɭɪɚɰɢɢ
03h ɋɬɪɨɤɨɜɵɣ ɨɩɢɫɚɬɟɥɶ
04h Ɉɩɢɫɚɬɟɥɶ ɢɧɬɟɪɮɟɣɫɚ
05h Ɉɩɢɫɚɬɟɥɶ ɤɨɧɟɱɧɨɣ ɬɨɱɤɢ
06h Ⱦɨɩɨɥɧɢɬɟɥɶɧɵɣ ɨɩɢɫɚɬɟɥɶ ɭɫɬɪɨɣɫɬɜɚ
07h Ɉɩɢɫɚɬɟɥɶ ɤɨɧɮɢɝɭɪɚɰɢɢ ɭɩɪɚɜɥɟɧɢɹ ɩɢɬɚɧɢɟɦ
08h Ɉɩɢɫɚɬɟɥɶ ɢɧɬɟɪɮɟɣɫɚ ɭɩɪɚɜɥɟɧɢɹ ɩɢɬɚɧɢɟɦ
Ɍɟɩɟɪɶ ɪɚɫɫɦɨɬɪɢɦ ɫɬɚɧɞɚɪɬɧɵɟ ɡɚɩɪɨɫɵ, ɩɨɞɞɟɪɠɢɜɚɟɦɵɟ ɜɫɟɦɢ ɭɫɬɪɨɣ-
ɫɬɜɚɦɢ USB.
Ɂɚɩɪɨɫ CLEAR_FEATURE ɩɨɡɜɨɥɹɟɬ ɨɱɢɫɬɢɬɶ ɢɥɢ ɨɬɤɥɸɱɢɬɶ ɨɩɪɟɞɟɥɟɧɧɭɸ ɧɚɫɬɪɨɣɤɭ (ɫɜɨɣɫɬɜɨ) ɭɫɬɪɨɣɫɬɜɚ USB, ɢɧɬɟɪɮɟɣɫɚ ɢɥɢ ɤɨɧɟɱɧɨɣ ɬɨɱɤɢ.
Ɏɨɪɦɚɬ ɡɚɩɪɨɫɚ ɩɪɟɞɫɬɚɜɥɟɧ ɜ ɬɚɛɥɢɰɟ 3.20.
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.20
Ɏɨɪɦɚɬ ɡɚɩɪɨɫɚ CLEAR_FEATURE
ɉɨɥɟ ɡɚɩɪɨɫɚ Ɂɧɚɱɟɧɢɟ
bmRequestType
0h – ɭɫɬɪɨɣɫɬɜɨ, 1h – ɢɧɬɟɪɮɟɣɫ, 2h – ɤɨɧɟɱɧɚɹ
ɬɨɱɤɚ
bRequest 01h
wValue Ɂɧɚɱɟɧɢɟ ɫɜɨɣɫɬɜɚ ɩɨɥɭɱɚɬɟɥɹ (ɬɚɛɥ. 3.21)
wIndex 0 ɞɥɹ ɤɨɧɟɱɧɨɣ ɬɨɱɤɢ ɢɥɢ ɧɨɦɟɪ ɭɫɬɪɨɣɫɬɜɚ
wLength 0
Ⱦɚɧɧɵɟ ɇɟɬ
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.21
Ɂɧɚɱɟɧɢɟ ɫɜɨɣɫɬɜɚ ɩɨɥɭɱɚɬɟɥɹ
ɋɜɨɣɫɬɜɨ ɉɨɥɭɱɚɬɟɥɶ Ɂɧɚɱɟɧɢɟ
ENDPOINT_HALT Ʉɨɧɟɱɧɚɹ ɬɨɱɤɚ 0
DEVICE_REMOTE_WAKEUP ɍɫɬɪɨɣɫɬɜɨ USB 1
TEST_MODE ɍɫɬɪɨɣɫɬɜɨ USB 2
Ɂɚɩɪɨɫ GET_CONFIGURATION ɩɨɥɭɱɚɟɬ ɡɧɚɱɟɧɢɟ ɬɟɤɭɳɟɣ ɤɨɧɮɢɝɭɪɚɰɢɢ
ɭɫɬɪɨɣɫɬɜɚ. Ɏɨɪɦɚɬ ɡɚɩɪɨɫɚ ɩɪɟɞɫɬɚɜɥɟɧ ɜ ɬɚɛɥɢɰɟ 3.22.
119

Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.22
Ɏɨɪɦɚɬ ɡɚɩɪɨɫɚ GET_CONFIGURATION
ɉɨɥɟ ɡɚɩɪɨɫɚ Ɂɧɚɱɟɧɢɟ
bmRequestType 80h
bRequest 08h
wValue 0
wIndex 0
wLength 1
Ⱦɚɧɧɵɟ Ɂɧɚɱɟɧɢɟ ɤɨɧɮɢɝɭɪɚɰɢɢ
ȿɫɥɢ ɩɨɥɟ ɞɚɧɧɵɯ, ɩɪɨɱɢɬɚɧɧɨɟ ɡɚɩɪɨɫɨɦ GET_CONFIGURATION, ɪɚɜɧɨ 0,
ɡɧɚɱɢɬ, ɭɫɬɪɨɣɫɬɜɨ ɧɟ ɫɤɨɧɮɢɝɭɪɢɪɨɜɚɧɨ. ȼ ɩɪɨɬɢɜɧɨɦ ɫɥɭɱɚɟ ɛɭɞɟɬ ɜɨɡɜɪɚɳɟɧ
1 ɛɚɣɬ ɞɚɧɧɵɯ ɤɨɧɮɢɝɭɪɚɰɢɢ.
Ɂɚɩɪɨɫ GET_DESCRIPTOR ɩɨɡɜɨɥɹɟɬ ɩɨɥɭɱɢɬɶ ɨɩɪɟɞɟɥɟɧɧɵɣ ɨɩɢɫɚɬɟɥɶ,
ɟɫɥɢ ɨɧ ɫɭɳɟɫɬɜɭɟɬ. Ɏɨɪɦɚɬ ɡɚɩɪɨɫɚ ɩɪɟɞɫɬɚɜɥɟɧ ɜ ɬɚɛɥɢɰɟ 3.23.
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.23
Ɏɨɪɦɚɬ ɡɚɩɪɨɫɚ GET_DESCRIPTOR
ɉɨɥɟ ɡɚɩɪɨɫɚ Ɂɧɚɱɟɧɢɟ
bmRequestType 80h
bRequest 06h
wValue Ɍɢɩ ɢ ɢɧɞɟɤɫ ɨɩɢɫɚɬɟɥɹ
wIndex 0 ɢɥɢ Language ID
wLength Ⱦɥɢɧɚ ɨɩɢɫɚɬɟɥɹ
Ⱦɚɧɧɵɟ Ɉɩɢɫɚɬɟɥɶ
ȼ ɩɨɥɟ wValue ɡɚɧɨɫɹɬ ɬɢɩ ɨɩɢɫɚɬɟɥɹ (ɫɬɚɪɲɢɣ ɛɚɣɬ) ɢ ɢɧɞɟɤɫ ɨɩɢɫɚɬɟɥɹ
(ɦɥɚɞɲɢɣ ɛɚɣɬ). Ⱦɨɫɬɭɩɧɵɟ ɬɢɩɵ ɨɩɢɫɚɬɟɥɹ ɩɪɟɞɫɬɚɜɥɟɧɵ ɜ ɬɚɛɥɢɰɟ 3.19.
Ɉɩɢɫɚɬɟɥɶ ɢɧɞɟɤɫɚ ɢɫɩɨɥɶɡɭɟɬɫɹ ɬɨɥɶɤɨ ɞɥɹ ɤɨɧɮɢɝɭɪɚɰɢɢ ɢɥɢ ɫɬɪɨɤɢ,
ɢɧɚɱɟ ɨɧ ɞɨɥɠɟɧ ɛɵɬɶ ɪɚɜɟɧ 0. ȼ ɩɨɥɟ wIndex ɫɥɟɞɭɟɬ ɩɟɪɟɞɚɬɶ ɢɞɟɧɬɢɮɢɤɚɬɨɪ ɹɡɵɤɚ (ɬɨɥɶɤɨ ɞɥɹ ɨɩɢɫɚɬɟɥɹ ɫɬɪɨɤɢ) ɢɥɢ 0. ȼ ɩɨɥɟ wLength ɧɭɠɧɨ ɡɚɩɢ-
ɪɚɡɦɟɪ ɨɩɢɫɚɬɟɥɹ ɜ ɛɚɣɬɚɯ. ȿɫɥɢ ɜ ɪɟɡɭɥɶɬɚɬɟ ɜɵɩɨɥɧɟɧɢɹ ɡɚɩɪɨɫɚ ɪɟɚɥɶ-
ɫɚɬɶ
ɧɚɹ ɞɥɢɧɚ ɨɩɢɫɚɬɟɥɹ ɨɤɚɠɟɬɫɹ ɛɨɥɶɲɟ, ɬɨ ɛɚɡɨɜɵɣ ɭɡɟɥ ɜɨɡɜɪɚɬɢɬ ɬɨɥɶɤɨ ɞɚɧɧɵɟ, ɫɨɨɬɜɟɬɫɬɜɭɸɳɢɟ ɡɚɞɚɧɧɨɦɭ ɜ ɩɨɥɟ wLength ɡɧɚɱɟɧɢɸ.
Ɂɚɩɪɨɫ GET_INTERFACE ɩɨɡɜɨɥɹɟɬ ɩɨɥɭɱɢɬɶ ɜɵɛɪɚɧɧɭɸ ɧɚɫɬɪɨɣɤɭ (ɫɜɨɣɫɬɜɨ) ɞɥɹ ɨɩɪɟɞɟɥɟɧɧɨɝɨ ɢɧɬɟɪɮɟɣɫɚ. Ɏɨɪɦɚɬ ɡɚɩɪɨɫɚ ɩɪɟɞɫɬɚɜɥɟɧ ɜ ɬɚɛɥ. 3.24.
120
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
