Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Системное программирование. Учебное пособие-1
.pdf
–
ɭ
–
ɭ
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.7
Ⱥɞɪɟɫɚɰɢɹ COM-ɩɨɪɬɨɜ ɜɜɨɞɚ-ɜɵɜɨɞɚ
ɇɨɦɟɪ ɩɨɪɬɚ Ɋɟɝɢɫɬɪɵ ɜɜɨɞɚ-ɜɵɜɨɞɚ
ɋɈɆ1 3F8h–3FFh
COM2 2F8h–2FFh
COM3 3E8h–3EFh
COM4 2E8h–2EFh
Ɉɬɦɟɬɢɦ, ɱɬɨ ɧɟ ɜɨ ɜɫɟɯ ɤɨɦɩɶɸɬɟɪɚɯ ɞɨɫɬɭɩɧɵ ɢɦɟɧɧɨ ɱɟɬɵɪɟ COMɩɨɪɬɚ, ɧɨ COM1 ɟɫɬɶ ɜɫɟɝɞɚ, ɩɨɷɬɨɦɭ ɞɚɥɟɟ ɦɵ ɛɭɞɟɦ ɫɫɵɥɚɬɶɫɹ ɢɦɟɧɧɨ ɧɚ ɟɝɨ
ɚɞɪɟɫɚ. Ɋɚɛɨɬɚ ɫ ɨɫɬɚɥɶɧɵɦɢ COM-ɩɨɪɬɚɦɢ ɨɫɭɳɟɫɬɜɥɹɟɬɫɹ ɚɧɚɥɨɝɢɱɧɨ, ɧɟɨɛɯɨɞɢɦɨ ɬɨɥɶɤɨ ɫɤɨɪɪɟɤɬɢɪɨɜɚɬɶ ɚɞɪɟɫɚ ɜ ɩɪɨɝɪɚɦɦɟ.
Ɋɟɝɢɫɬɪ 3F8h ɜɵɩɨɥɧɹɟɬ ɧɟɫɤɨɥɶɤɨ ɡɚɞɚɱ ɢ ɞɨɫɬɭɩɟɧ ɤɚɤ ɞɥɹ ɱɬɟɧɢɹ, ɬɚɤ ɢ
ɞɥɹ ɡɚɩɢɫɢ. ȿɫɥɢ ɛɢɬ 7
ɜ ɪɟɝɢɫɬɪɟ ɭɩɪɚɜɥɟɧɢɹ (3FBh) ɭɫɬɚɧɨɜɥɟɧ ɜ 0, ɬɨ ɱɟɪɟɡ
3F8h ɦɨɠɧɨ ɱɢɬɚɬɶ ɢ ɡɚɩɢɫɵɜɚɬɶ ɞɚɧɧɵɟ. ȿɫɥɢ ɛɢɬ 7 ɜ ɪɟɝɢɫɬɪɟ ɭɩɪɚɜɥɟɧɢɹ
(3FBh) ɭɫɬɚɧɨɜɥɟɧ ɜ 1, ɬɨ ɪɟɝɢɫɬɪ 3F8h ɨɛɪɚɛɚɬɵɜɚɟɬ ɦɥɚɞɲɢɣ ɛɚɣɬ ɞɟɥɢɬɟɥɹ
ɱɚɫɬɨɬɵ ɞɥɹ ɫɤɨɪɨɫɬɢ ɩɟɪɟɞɚɱɢ ɞɚɧɧɵɯ.
Ɋɟɝɢɫɬɪ 3F9h ɬɚɤɠɟ ɜɵɩɨɥɧɹɟɬ ɧɟɫɤɨɥɶɤɨ ɡɚɞɚɱ ɢ ɞɨɫɬɭɩɟɧ ɞɥɹ ɱɬɟɧɢɹ ɢ
ɡɚɩɢɫɢ. ȿɫɥɢ ɛɢɬ 7 ɜ ɪɟɝɢɫɬɪɟ ɭɩɪɚɜɥɟɧɢɹ (3FBh) ɪɚɜɟɧ 0, ɬɨ ɪɟɝɢɫɬɪ 3F9h
ɭɩɪɚɜɥɹɟɬ
ɩɪɟɪɵɜɚɧɢɟɦ (ɬɚɛɥ. 3.8). ȿɫɥɢ ɛɢɬ 7 ɜ ɪɟɝɢɫɬɪɟ ɭɩɪɚɜɥɟɧɢɹ (3FBh)
ɪɚɜɟɧ 1, ɬɨ 3F9h ɨɛɪɚɛɚɬɵɜɚɟɬ ɫɬɚɪɲɢɣ ɛɚɣɬ ɞɟɥɢɬɟɥɹ ɱɚɫɬɨɬɵ ɞɥɹ ɫɤɨɪɨɫɬɢ ɩɟɪɟɞɚɱɢ ɞɚɧɧɵɯ.
Ɋɟɝɢɫɬɪ 3FAh ɞɨɫɬɭɩɟɧ ɞɥɹ ɱɬɟɧɢɹ ɢ ɡɚɩɢɫɢ. Ɉɧ ɩɨɡɜɨɥɹɟɬ ɨɩɪɟɞɟɥɢɬɶ
ɩɪɢɱɢɧɭ ɩɪɟɪɵɜɚɧɢɹ ɜ ɪɟɠɢɦɟ ɱɬɟɧɢɹ (ɬɚɛɥ. 3.9), ɚ ɜ ɪɟɠɢɦɟ ɡɚɩɢɫɢ ɪɟɝɢɫɬɪ
ɭɩɪɚɜɥɹɟɬ ɪɟɠɢɦɨɦ FIFO (ɬɚɛɥ. 3.10).
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.8
Ɏɨɪɦɚɬ
ɪɟɝɢɫɬɪɚ 3F9h ɜ ɪɟɠɢɦɟ ɭɩɪɚɜɥɟɧɢɹ ɩɪɟɪɵɜɚɧɢɟɦ
Ȼɢɬ Ɉɩɢɫɚɧɢɟ
0
1
ɋɨɫɬɨɹɧɢɟ ɫɢɝɧɚɥɚ ɩɪɟɪɵɜɚɧɢɹ ɩɪɢ ɧɚɥɢɱɢɢ ɜɯɨɞɧɵɯ
ɞɚɧɧɵɯ (1
ɜɤɥɸɱɟɧ, 0 – ɜɵɤɥɸɱɟɧ)
ɋɨɫɬɨɹɧɢɟ ɫɢɝɧɚɥɚ ɩɪɟɪɵɜɚɧɢɹ ɩɪɢ ɨɩɭɫɬɨɲɟɧɢɢ ɜɵɯɨɞɧɨɝɨ
ɮɟɪɚ (1 – ɜɤɥɸɱɟɧ, 0 – ɜɵɤɥɸɱɟɧ)
ɛ
ɋɨɫɬɨɹɧɢɟ ɫɢɝɧɚɥɚ ɩɪɟɪɵɜɚɧɢɹ ɩɪɢ ɩɨɹɜɥɟɧɢɢ ɨɲɢɛɤɢ
2
3
4–7
ɢɥɢ ɩɟɪɟɪɵɜɚ ɜ ɩɟɪɟɞɚɱɟ ɞɚɧɧɵɯ (1 – ɜɤɥɸɱɟɧ,
0
ɜɵɤɥɸɱɟɧ)
ɋɨɫɬɨɹɧɢɟ ɫɢɝɧɚɥɚ ɩɪɟɪɵɜɚɧɢɹ ɩɪɢ ɢɡɦɟɧɟɧɢɢ ɫɨɫɬɨɹɧɢɹ
ɦɨɞɟɦɚ (1 – ɜɤɥɸɱɟɧ, 0 – ɜɵɤɥɸɱɟɧ)
ɇɟ ɢɫɩɨɥɶɡ
ɸɬɫɹ ɢ ɞɨɥɠɧɵ ɛɵɬɶ ɭɫɬɚɧɨɜɥɟɧɵ ɜ 0
101

b – ɩɪ
ɭ
b –
–
–
–
ɭ
b –
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.9
Ɏɨɪɦɚɬ ɪɟɝɢɫɬɪɚ 3FAh ɜ ɪɟɠɢɦɟ ɱɬɟɧɢɹ
Ȼɢɬ Ɉɩɢɫɚɧɢɟ
0
ɋɨɫɬɨɹɧɢɟ ɩɪɟɪɵɜɚɧɢɹ (1 – ɧɟɬ ɩɪɟɪɵɜɚɧɢɹ, 0 – ɟɫɬɶ
ɩɪɟɪɵɜɚɧɢɟ)
ɉɪɢɱɢɧɚ ɩɪɟɪɵɜɚɧɢɹ (00b – ɢɡɦɟɧɟɧɢɟ ɫɨɫɬɨɹɧɢɹ ɦɨɞɟɦɚ,
1–2
3
4–5
6–7
01b – ɨɩɭɫɬɨɲɟɧ ɛɭɮɟɪ ɩɟɪɟɞɚɱɢ, 10b – ɩɨɥɭɱɟɧɵ ɞɚɧɧɵɟ,
11
ɨɢɡɨɲɥɚ ɨɲɢɛɤɚ ɢɥɢ ɩɟɪɟɪɵɜ ɜ ɩɟɪɟɞɚɱɟ ɞɚɧɧɵɯ)
Ɂɚɤɨɧɱɢɥɨɫɶ ɜɪɟɦɹ ɨɠɢɞɚɧɢɹ ɞɥɹ ɩɪɢɟɦɧɢɤɚ FIFO
ɇɟ ɢɫɩɨɥɶɡ
ɇɚɥɢɱɢɟ FIFO (11
ɸɬɫɹ ɢ ɞɨɥɠɧɵ ɛɵɬɶ ɭɫɬɚɧɨɜɥɟɧɵ ɜ 0
ɩɪɢɫɭɬɫɬɜɭɟɬ, 00b – ɨɬɫɭɬɫɬɜɭɟɬ)
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.10
Ɏɨɪɦɚɬ ɪɟɝɢɫɬɪɚ 3FAh ɜ ɪɟɠɢɦɟ ɡɚɩɢɫɢ
Ȼɢɬ Ɉɩɢɫɚɧɢɟ
0
1
2
3–5
6–7
ɍɩɪɚɜɥɟɧɢɟ ɪɚɛɨɬɨɣ ɪɟɠɢɦɚ FIFO (1 – ɜɤɥɸɱɟɧ,
ɜɵɤɥɸɱɟɧ)
0
Ɉɱɢɫɬɤɚ ɩɪɢɟɦɧɢɤɚ FIFO (1
Ɉɱɢɫɬɤɚ ɩɟɪɟɞɚɬɱɢɤɚ FIFO (1
ɇɟ ɢɫɩɨɥɶɡ
ɸɬɫɹ ɢ ɞɨɥɠɧɵ ɛɵɬɶ ɭɫɬɚɧɨɜɥɟɧɵ ɜ 0
ɨɱɢɫɬɢɬɶ)
ɨɱɢɫɬɢɬɶ)
ɉɨɪɨɝ ɫɪɚɛɚɬɵɜɚɧɢɹ ɞɥɹ ɱɬɟɧɢɹ ɞɚɧɧɵɯ (00b – 1 ɛɚɣɬ, 01b –
4 ɛɚɣɬɚ, 10
8 ɛɚɣɬ, 11b – 14 ɛɚɣɬ)
Ɋɟɝɢɫɬɪ 3FBh ɞɨɫɬɭɩɟɧ ɞɥɹ ɱɬɟɧɢɹ ɢ ɡɚɩɢɫɢ. Ɉɧ ɩɪɟɞɧɚɡɧɚɱɟɧ ɞɥɹ ɭɩɪɚɜ-
ɥɟɧɢɹ ɥɢɧɢɟɣ ɫɜɹɡɢ. Ɏɨɪɦɚɬ ɪɟɝɢɫɬɪɚ ɩɨɤɚɡɚɧ ɜ ɬɚɛɥɢɰɟ 3.11.
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.11
Ɏɨɪɦɚɬ ɪɟɝɢɫɬɪɚ ɭɩɪɚɜɥɟɧɢɹ 3FBh
Ȼɢɬ Ɉɩɢɫɚɧɢɟ
0–1
Ⱦɥɢɧɚ ɞɚɧɧɵɯ (00b – 5 ɛɢɬ, 01b – 6 ɛɢɬ, 10b – 7 ɛɢɬ, 11b –
8 ɛɢɬ)
2 Ʉɨɥɢɱɟɫɬɜɨ ɫɬɨɩɨɜɵɯ ɛɢɬɨɜ (0 – 1 ɛɢɬ, 1 – 2 ɛɢɬɚ)
3–5 Ȼɢɬ ɱɟɬɧɨɫɬɢ (000b – ɧɟɬ, 001b – ɧɟɱɟɬɧɵɣ, 011b – ɱɟɬɧɵɣ)
ɋɨɫɬɨɹɧɢɟ ɩɟɪɟɪɵɜɚ ɩɟɪɟɞɚɱɢ, ɩɪɢ ɤɨɬɨɪɨɦ ɩɨɪɬ ɜɵɞɚɟɬ
6
ɧɭɥɢ (1 – ɜɤɥɸɱɢɬɶ, 0 – ɜɵɤɥɸɱɢɬɶ)
ɍɩɪɚɜɥɟɧɢɟ ɞɟɥɢɬɟɥɟɦ ɱɚɫɬɨɬɵ ɞɥɹ ɜɵɛɨɪɚ ɫɤɨɪɨɫɬɢ
7
ɩɟɪɟɞɚɱɢ ɞɚɧɧɵɯ (1 – ɭɫɬɚɧɨɜɢɬɶ ɡɧɚɱɟɧɢɟ ɞɟɥɢɬɟɥɹ
ɱɚɫɬɨɬɵ ɱɟɪɟɡ ɪɟɝɢɫɬɪɵ 3F8h ɢ 3F9h)
Ɋɟɝɢɫɬɪ 3FCh ɞɨɫɬɭɩɟɧ ɞɥɹ ɱɬɟɧɢɹ ɢ ɡɚɩɢɫɢ, ɢ ɭɩɪɚɜɥɹɟɬ ɪɚɛɨɬɨɣ ɦɨɞɟɦɚ.
Ɏɨɪɦɚɬ ɪɟɝɢɫɬɪɚ ɩɨɤɚɡɚɧ ɜ ɬɚɛɥɢɰɟ 3.12.
102

Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.12
Ɏɨɪɦɚɬ ɪɟɝɢɫɬɪɚ ɭɩɪɚɜɥɟɧɢɹ ɦɨɞɟɦɨɦ 3FCh
Ȼɢɬ Ɉɩɢɫɚɧɢɟ
0 ɍɩɪɚɜɥɟɧɢɟ ɥɢɧɢɟɣ DTR
1 ɍɩɪɚɜɥɟɧɢɟ ɥɢɧɢɟɣ RTS
2 ɍɩɪɚɜɥɟɧɢɟ ɥɢɧɢɟɣ OUT1 (0)
3 ɍɩɪɚɜɥɟɧɢɟ ɥɢɧɢɟɣ OUT2 (1)
ɋɚɦɨɬɟɫɬɢɪɨɜɚɧɢɟ ɦɨɞɟɦɚ (1 – ɜɤɥɸɱɢɬɶ), ɩɪɢ ɤɨɬɨɪɨɦ
4
ɜɵɯɨɞ ɡɚɦɵɤɚɟɬɫɹ ɧɚ ɜɯɨɞ
5–7 ɇɟ ɢɫɩɨɥɶɡɭɸɬɫɹ ɢ ɞɨɥɠɧɵ ɛɵɬɶ ɭɫɬɚɧɨɜɥɟɧɵ ɜ 0
Ɋɟɝɢɫɬɪ 3FDh ɞɨɫɬɭɩɟɧ ɬɨɥɶɤɨ ɞɥɹ ɱɬɟɧɢɹ ɢ ɩɨɡɜɨɥɹɟɬ ɬɟɤɭɳɟɟ ɫɨɫɬɨɹɧɢɟ
ɥɢɧɢɢ ɫɜɹɡɢ. Ɏɨɪɦɚɬ ɪɟɝɢɫɬɪɚ ɩɨɤɚɡɚɧ ɜ ɬɚɛɥ. 3.13.
ɉɨɫɥɟ ɜɵɩɨɥɧɟɧɢɹ ɮɭɧɤɰɢɢ ɱɬɟɧɢɹ ɜ ɪɟɝɢɫɬɪ Ⱥɇ ɛɭɞɟɬ ɡɚɩɢɫɚɧɨ ɫɨ-
ɫɬɨɹɧɢɟ ɩɨɪɬɚ (ɬɚɛɥ. 3.13), ɚ ɜ ɪɟɝɢɫɬɪ AL – ɫɨɫɬɨɹɧɢɟ ɦɨɞɟɦɚ (ɬɚɛɥ. 3.14).
Ɋɟɝɢɫɬɪ 3FEh ɞɨɫɬɭɩɟɧ ɬɨɥɶɤɨ ɞɥɹ ɱɬɟɧɢɹ. ɉɪɨɱɢɬɚɜ ɟɝɨ ɫɨɞɟɪɠɢɦɨɟ,
ɦɨɠɧɨ ɩɨɥɭɱɢɬɶ ɬɟɤɭɳɟɟ ɫɨɫɬɨɹɧɢɟ ɦɨɞɟɦɚ. Ɏɨɪɦɚɬ
ɪɟɝɢɫɬɪɚ ɩɨɤɚɡɚɧ ɜ ɬɚɛɥɢ-
ɰɟ 3.14.
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.13
Ɏɨɪɦɚɬ ɛɚɣɬɚ ɫɨɫɬɨɹɧɢɹ ɩɨɪɬɚ 3FDh
Ȼɢɬ Ɉɩɢɫɚɧɢɟ
0 Ƚɨɬɨɜɧɨɫɬɶ ɞɚɧɧɵɯ (1 – ɝɨɬɨɜɵ, 0 – ɧɟ ɝɨɬɨɜɵ)
1 Ɉɲɢɛɤɚ ɩɟɪɟɩɨɥɧɟɧɢɹ ɞɚɧɧɵɯ (1 – ɟɫɬɶ, 0 – ɧɟɬ)
2 Ɉɲɢɛɤɚ ɱɟɬɧɨɫɬɢ (1 – ɟɫɬɶ, 0 – ɧɟɬ)
3 Ɉɲɢɛɤɚ ɫɢɧɯɪɨɧɢɡɚɰɢɢ ɞɚɧɧɵɯ (1 – ɟɫɬɶ, 0 – ɧɟɬ)
4 Ɉɛɧɚɪɭɠɟɧ ɩɟɪɟɪɵɜ ɜ ɩɟɪɟɞɚɱɟ ɞɚɧɧɵɯ (1 – ɞɚ, 0 – ɧɟɬ)
5 Ɋɟɝɢɫɬɪ ɯɪɚɧɟɧɢɹ ɞɚɧɧɵɯ ɩɭɫɬ (1 – ɧɟɬ ɞɚɧɧɵɯ, 0 – ɟɫɬɶ ɞɚɧɧɵɟ)
6 Ɋɟɝɢɫɬɪ ɫɞɜɢɝɚ ɩɭɫɬ (1 – ɧɟɬ ɞɚɧɧɵɯ, 0 – ɟɫɬɶ ɞɚɧɧɵɟ)
7 Ɍɚɣɦ-ɚɭɬ ɢɥɢ ɨɲɢɛɤɚ ɩɨ ɜɪɟɦɟɧɢ (1 – ɨɲɢɛɤɚ, 0 – ɧɟɬ ɨɲɢɛɤɢ)
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.14
Ɏɨɪɦɚɬ ɛɚɣɬɚ ɫɨɫɬɨɹɧɢɹ ɦɨɞɟɦɚ
Ȼɢɬ Ɉɩɢɫɚɧɢɟ
0 ɂɡɦɟɧɢɥɨɫɶ ɫɨɫɬɨɹɧɢɟ ɧɚ ɜɯɨɞɧɨɣ ɥɢɧɢɢ CTS: 1 – ɞɚ
1 ɂɡɦɟɧɢɥɨɫɶ ɫɨɫɬɨɹɧɢɟ ɧɚ ɜɯɨɞɧɨɣ ɥɢɧɢɢ DSR: 1 – ɞɚ
2 ɂɡɦɟɧɢɥɨɫɶ ɫɨɫɬɨɹɧɢɟ ɧɚ ɜɯɨɞɧɨɣ ɥɢɧɢɢ Rl: 1 – ɞɚ
3 ɂɡɦɟɧɢɥɨɫɶ ɫɨɫɬɨɹɧɢɟ ɧɚ ɜɯɨɞɧɨɣ ɥɢɧɢɢ DCD: 1 – ɞɚ
4 ɉɪɨɢɡɨɲɟɥ ɫɛɪɨɫ ɞɥɹ ɩɟɪɟɞɚɱɢ ɧɚ ɜɯɨɞɧɨɣ ɥɢɧɢɢ CTS: 1 – ɫɛɪɨɫ
103

Ɉ ɤ ɨ ɧ ɱ ɚ ɧ ɢ ɟ ɬ ɚ ɛ ɥ ɢ ɰ ɵ 3.14
Ȼɢɬ Ɉɩɢɫɚɧɢɟ
Ƚɨɬɨɜɧɨɫɬɶ ɦɨɞɟɦɚ ɞɥɹ ɱɬɟɧɢɹ ɞɚɧɧɵɯ ɧɚ ɜɯɨɞɧɨɣ ɥɢɧɢɢ DSR:
5
1 – ɝɨɬɨɜ, 0 – ɧɟ ɝɨɬɨɜ
ɋɨɫɬɨɹɧɢɟ ɢɧɞɢɤɚɬɨɪɚ ɡɜɨɧɤɚ ɧɚ ɜɯɨɞɧɨɣ ɥɢɧɢɢ Rl: 1 – ɟɫɬɶ
6
ɋɢɝɧɚɥ ɨɛɧɚɪɭɠɟɧɢɹ ɧɟɫɭɳɟɣ ɧɚ ɜɯɨɞɧɨɣ ɥɢɧɢɢ DCD: 1 – ɨɛɧɚ-
7
ɪɭɠɟɧ
Ɋɟɝɢɫɬɪ 3FCh ɞɨɫɬɭɩɟɧ ɞɥɹ ɱɬɟɧɢɹ ɢ ɡɚɩɢɫɢ. Ɉɧ ɹɜɥɹɟɬɫɹ ɪɟɡɟɪɜɧɵɦ ɢ ɧɟ
ɢɫɩɨɥɶɡɭɟɬɫɹ.
ɉɟɪɟɞ ɧɚɱɚɥɨɦ ɪɚɛɨɬɵ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɵɣ ɩɨɪɬ ɫɥɟɞɭɟɬ ɢɧɢɰɢɚɥɢɡɢɪɨɜɚɬɶ.
Ⱦɥɹ ɷɬɨɝɨ ɧɭɠɧɨ ɭɫɬɚɧɨɜɢɬɶ ɛɢɬ 7 ɪɟɝɢɫɬɪɚ 3FBh ɜ 1, ɡɚɬɟɦ ɡɚɞɚɬɶ ɫɤɨɪɨɫɬɶ ɩɟɪɟɞɚɱɢ (ɫɬɚɪɲɢɣ ɢ ɦɥɚɞɲɢɣ ɛɚɣɬɵ) ɜ ɪɟɝɢɫɬɪɚɯ 3F8h ɢ 3F9h. ɉɨɫɥɟ ɷɬɨɝɨ ɜ ɪɟɝɢɫɬɪ 3FBh ɫɥɟɞɭɟɬ ɡɚɩɢɫɚɬɶ ɪɟɠɢɦ ɪɚɛɨɬɵ ɥɢɧɢɢ, ɨɛɧɭɥɢɜ ɛɢɬ 7.
Ɂɚɬɟɦ ɜ ɪɟɝɢɫɬɪ 3F9h ɡɚɩɢɫɵɜɚɟɦ 0, ɟɫɥɢ ɩɪɟɪɵɜɚɧɢɹ ɧɟ ɛɭɞɭɬ ɢɫɩɨɥɶɡɨɜɚɧɵ, ɢɥɢ ɠɟ
ɭɫɬɚɧɚɜɥɢɜɚɟɦ ɛɢɬɵ 0-3 ɜ ɫɨɨɬɜɟɬɫɬɜɢɢ ɫ ɬɪɟɛɭɟɦɵɦɢ ɩɪɟɪɵɜɚɧɢɹɦɢ. ȼɨɡɦɨɠɧɵɟ ɡɧɚɱɟɧɢɹ ɞɥɹ ɫɤɨɪɨɫɬɢ ɩɟɪɟɞɚɱɢ ɞɚɧɧɵɯ ɩɪɟɞɫɬɚɜɥɟɧɵ ɜ ɬɚɛɥɢɰɟ 3.15.
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 3.15
Ʉɨɞɵ ɡɧɚɱɟɧɢɣ ɞɥɹ ɭɫɬɚɧɨɜɤɢ ɫɤɨɪɨɫɬɢ ɩɟɪɟɞɚɱɢ ɞɚɧɧɵɯ
Ʉɨɞ ɡɧɚɱɟɧɢɹ
3F9h 3F8h
ɋɤɨɪɨɫɬɶ, ɛɨɞ
04h 17h 110
01h 80h 300
00h C0h 600
00h 60h 1 200
00h 30h 2 400
00h 20h 3 600
00h 18h 4 800
00h 10h 7 200
00h 0Ch 9 600
00h 06h 19 200
00h 03h 38 400
00h 02h 57 600
00h 0lh 115 200
Ɋɚɫɫɦɨɬɪɢɦ ɧɚ ɩɪɢɦɟɪɚɯ ɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɟ ɬɢɩɨɜɵɯ ɨɩɟɪɚɰɢɣ ɫ ɩɨɫɥɟɞɨ-
ɜɚɬɟɥɶɧɵɦ ɩɨɪɬɨɦ ɜ ɫɥɟɞɭɸɳɟɦ ɩɨɪɹɞɤɟ:
1. ɂɧɢɰɢɚɥɢɡɚɰɢɹ ɩɨɪɬɚ.
2. ɉɪɨɜɟɪɤɚ ɫɨɫɬɨɹɧɢɹ ɩɨɪɬɚ.
3. ɇɚɫɬɪɨɣɤɚ ɩɨɪɬɚ.
4. ɉɟɪɟɞɚɱɚ ɢ ɩɪɢɟɦ ɞɚɧɧɵɯ.
104

ɉɪɢɦɟɪ 3.26. Ɏɭɧɤɰɢɹ ɢɧɢɰɢɚɥɢɡɚɰɢɢ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɨɝɨ ɩɨɪɬɚ (Windows).
void InitCOMPort(unsigned int Port) {
// ɭɫɬɚɧɚɜɥɢɜɚɟɦ ɛɢɬ 7 ɜ 1 ɜ ɪɟɝɢɫɬɪɟ
// ɭɩɪɚɜɥɟɧɢɹ ɥɢɧɢɟɣ
__outbyte(Port + 3, 0x80);
// ɫɤɨɪɨɫɬɶ ɩɟɪɟɞɚɱɢ ɞɚɧɧɵɯ 9 600 ɛɨɞ
__outbyte(Port, 0x00);
// ɦɥɚɞɲɢɣ ɛɚɣɬ ɞɟɥɢɬɟɥɹ
__outbyte(Port + 1, 0ɯ0ɋ);
// ɫɬɚɪɲɢɣ ɛɚɣɬ ɞɟɥɢɬɟɥɹ
// ɧɚɫɬɪɚɢɜɚɟɦ ɪɟɝɢɫɬɪ ɭɩɪɚɜɥɟɧɢɹ ɥɢɧɢɟɣ
// 8 ɛɢɬ, 1 ɫɬɨɧɨɜɵɣ ɛɢɬ, ɛɟɡ ɱɟɬɧɨɫɬɢ
__outbyte(Port + 3, 0x03);
// ɧɚɫɬɪɚɢɜɚɟɦ ɪɟɝɢɫɬɪ ɭɩɪɚɜɥɟɧɢɹ ɦɨɞɟɦɨɦ
// ɫɢɝɧɚɥɵ DTR, RTS, OUT1, OUT2
_ outbyte(Port + 4, 0x0ȼ);
// ɧɚɫɬɪɚɢɜɚɟɦ ɪɟɝɢɫɬɪ ɭɩɪɚɜɥɟɧɢɹ
ɩɪɟɪɵɜɚɧɢɹɦɢ
__outbyte(Port + 1, 0x00);
// ɡɚɩɪɟɳɚɟɦ ɜɫɟ ɩɪɟɪɵɜɚɧɢɹ
}
ɉɪɢɦɟɪ 3.27. Ɏɭɧɤɰɢɹ ɩɪɨɜɟɪɤɢ ɫɨɫɬɨɹɧɢɹ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɨɝɨ ɩɨɪɬɚ
(Windows).
bool IsRead_Write_COM(unsigned short Port) { DWORD
dwResult = 0;
dwResult = __inword(Port + 5);
if ((dwResult &0x10) == 0x01)
return false; // ɥɢɧɢɹ ɡɚɧɹɬɚ
return true; }
ɉɪɢɦɟɪ 3.28. Ɏɭɧɤɰɢɹ ɩɪɨɜɟɪɤɢ ɫɨɫɬɨɹɧɢɹ ɥɢɧɢɢ ɩɟɪɟɞ ɱɬɟɧɢɟɦ ɢɡ ɩɨɪɬɚ
(Windows).
bool IsRead_Read_COM (unsigned short Port) { DWORD
dwResult = 0;
dwResult = __inword(Port + 5);
if ((dwResult s 0x02) == 0x01) return false;
// ɜ ɥɢɧɢɢ ɨɫɬɚɥɢɫɶ ɧɟɩɪɨɱɢɬɚɧɧɵɟ ɞɚɧɧɵɟ
return true; }
ɉɪɨɢɡɜɟɞɟɦ ɧɚɫɬɪɨɣɤɭ COM-ɩɨɪɬɚ, ɨɛɪɚɬɢɜɲɢɫɶ ɤ ɧɟɦɭ, ɤɚɤ ɤ ɮɚɣɥɭ.
ɉɪɢɦɟɪ 3.29. ɇɚɫɬɪɨɣɤɚ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɨɝɨ ɩɨɪɬɚ (Windows).
#include <windows.h>
// ɨɛɴɹɜɥɹɟɦ
ɫɬɪɭɤɬɭɪɭ
ɞɥɹ ɤɨɧɮɢɝɭɪɚɰɢɢ
// ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɨɝɨ ɩɨɪɬɚ
DCB deb;
ZeroMemory(sdeb, sizeof(DCB));
// ɨɩɢɫɚɬɟɥɶ ɩɨɪɬɚ HANDLE hCom 1 = NULL;
// Ɏɭɧɤɰɢɹ ɢɧɢɰɢɚɥɢɡɚɰɢɢ ɩɨɪɬɚ ɋ0Ɇ1
105

bool Init_COM() {
// ɨɬɤɪɵɜɚɟɦ ɩɨɪɬ ɋ0Ɇ1
hCom_l = CreateFile("C0M1",
GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (hCom_l == INVALID_HANDLE_VALUE)
// ɟɫɥɢ ɩɨɪɬ ɧɟ ɭɞɚɥɨɫɶ ɨɬɤɪɵɬɶ
return false; // ɜɵɯɨɞɢɦ ɢɡ ɮɭɧɤɰɢɢ
// ɟɫɥɢ ɩɨɪɬ ɭɫɩɟɲɧɨ ɨɬɤɪɵɬ,
// ɩɨɥɭɱɚɟɦ ɟɝɨ ɫɨɫɬɨɹɧɢɟ
if (!GetCommState (hCom_l, &dcb)) {
// ɟɫɥɢ ɧɟ ɭɞɚɥɨɫɶ ɩɨɥɭɱɢɬɶ ɫɬɚɬɭɫ ɩɨɪɬɚ,
// ɜɵɯɨɞɢɦ ɢɡ ɮɭɧɤɰɢɢ
CloseHandle(hCom_l);
return false; // ɜɵɯɨɞɢɦ ɢɡ ɮɭɧɤɰɢɢ }
// ɢɧɚɱɟ - ɧɚɫɬɪɚɢɜɚɟɦ ɩɚɪɚɦɟɬɪɵ ɩɨɪɬɚ
dcb.BaudRate = CBR_19200;
// ɫɤɨɪɨɫɬɶ ɩɟɪɟɞɚɱɢ 19 200 ɛɨɞ
dcb.ByteSize = 8; // ɪɚɡɦɟɪ ɛɚɣɬɚ ɞɚɧɧɵɯ dcb.StopBits
= ONESTOPBIT; // ɨɞɢɧ
ɫɬɨɩ-ɛɢɬ deb.Parity = NOPATITY;
// ɤɨɧɬɪɨɥɹ ɱɟɬɧɨɫɬɢ ɧɟɬ
// ɫɨɯɪɚɧɹɟɦ ɧɨɜɭɸ ɤɨɧɮɢɝɭɪɚɰɢɸ ɞɥɹ ɩɨɪɬɚ
if (!SetCommState(hCom_l, &dcb)) {
// ɟɫɥɢ ɧɟ ɭɞɚɥɨɫɶ ɧɚɫɬɪɨɢɬɶ ɩɨɪɬ, ɜɵɯɨɞɢɦ ɢɡ
// ɮɭɧɤɰɢɢ
CloseHandle(hCom_l);
return false; // ɜɵɯɨɞɢɦ ɢɡ ɮɭɧɤɰɢɢ
}
return true; }
Ɍɟɩɟɪɶ, ɤɨɝɞɚ ɩɨɪɬ ɨɬɤɪɵɬ ɢ ɫɤɨɧɮɢɝɭɪɢɪɨɜɚɧ ɞɥɹ ɪɚɛɨɬɵ, ɧɟɨɛɯɨɞɢɦɨ
ɧɚɫɬɪɨɢɬɶ ɨɛɪɚɛɨɬɤɭ ɫɢɝɧɚɥɨɜ DSR ɢ CTS.
ɉɪɢɦɟɪ 3.30. ɇɚɫɬɪɨɣɤɚ ɫɨɛɵɬɢɣ ɞɥɹ ɫɢɝɧɚɥɨɜ DSR ɢ CTS (Windows).
// ɨɛɴɹɜɥɹɟɦ ɫɬɪɭɤɬɭɪɭ ɞɥɹ ɚɫɢɧɯɪɨɧɧɨɝɨ ɜɜɨɞɚ
// ɜɵɜɨɞɚ ɞɚɧɧɵɯ ɢ ɩɨɦɟɳɚɟɦ ɟɟ ɜ ɝɥɨɛɚɥɶɧɭɸ
// ɨɛɥɚɫɬɶ ɜɢɞɢɦɨɫɬɢ
OVERLAPPED over;
ZeroMemory(&over, sizeof ( OVERLAPPED));
// Ɏɭɧɤɰɢɹ ɧɚɫɬɪɨɣɤɢ ɫɨɛɵɬɢɣ
bool SetEventCOM () {
// ɧɚɫɬɪɚɢɜɚɟɦ ɦɨɧɢɬɨɪɢɧɝ ɫɨɛɵɬɢɣ ɩɨɪɬɚ
if (!SetCommMask(hCom_l, EV_DSR | EV_CTS))
{
// ɟɫɥɢ ɧɟ ɭɞɚɥɨɫɶ ɧɚɫɬɪɨɢɬɶ ɩɨɪɬ, ɜɵɯɨɞɢɦ
CloseHandle(hCom_l);
return false; // ɜɵɯɨɞɢɦ ɢɡ ɮɭɧɤɰɢɢ
106

}
// ɢɧɚɱɟ - ɫɨɡɞɚɟɦ ɨɛɴɟɤɬ - ɫɨɛɵɬɢɟ
over.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
if (!over.hEvent) {
// ɟɫɥɢ ɧɟ ɭɞɚɥɨɫɶ ɫɨɡɞɚɬɶ ɫɨɛɵɬɢɟ, ɜɵɯɨɞɢɦ
CloseHandle (hCom_l);
return false; // ɜɵɯɨɞɢɦ ɢɡ ɮɭɧɤɰɢɢ
}
return true; }
ɇɚ ɷɬɨɦ ɧɚɱɚɥɶɧɚɹ ɩɨɞɝɨɬɨɜɤɚ ɞɥɹ ɪɚɛɨɬɵ ɫ ɩɨɪɬɨɦ ɡɚɤɨɧɱɟɧɚ. Ɍɟɩɟɪɶ ɫɨɡɞɚɞɢɦ ɮɭɧɤɰɢɢ ɱɬɟɧɢɹ ɢ ɡɚɩɢɫɢ ɞɚɧɧɵɯ, ɚ ɬɚɤɠɟ ɭɩɪɚɜɥɟɧɢɹ ɞɥɹ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɨɝɨ ɩɨɪɬɚ.
ɉɪɢɦɟɪ 3.31. Ɏɭɧɤɰɢɢ ɱɬɟɧɢɹ ɢ ɡɚɩɢɫɢ ɞɥɹ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɨɝɨ ɩɨɪɬɚ.
BYTE ReadByteCOM() {
//
ɮɭɧɤɰɢɹ ɱɬɟɧɢɹ ɨɞɧɨɝɨ ɛɚɣɬɚ ɞɚɧɧɵɯ
BYTE read = 0;
DWORD dwByteRead = 0;
do { // ɱɢɬɚɟɦ ɛɚɣɬ ɢɡ ɩɨɪɬɚ
if (IReadFile(hCom_l, &read, sizeof(BYTE),
sdwByteRead, NULL)) return 0;
} while (!dwByteRead);
return read; // ɜɨɡɜɪɚɳɚɟɦ ɩɪɨɱɢɬɚɧɧɵɣ ɛɚɣɬ
DWORD ReadData_COM(void* Data, unsigned int uNumBytes) {
// ɮɭɧɤɰɢɹ ɱɬɟɧɢɹ ɦɚɫɫɢɜɚ ɞɚɧɧɵɯ
DWORD dwBytesRead = 0;
if (IReadFile(hCom_l, Data, uNumBytes, SdwBytesRead,
NULL))
// ɫɤɨɥɶɤɨ ɭɞɚɥɨɫɶ ɩɪɨɱɢɬɚɬɶ
return dwBytesRead;
// ɜɨɡɜɪɚɳɚɟɦ ɩɨɥɧɨɟ ɱɢɫɥɨ ɩɪɨɱɢɬɚɧɧɵɯ ɛɚɣɬɨɜ
return dwBytesRead;
bool WriteByteCOM (BYTE bByte) {
// ɮɭɧɤɰɢɹ ɞɥɹ ɡɚɩɢɫɢ ɨɞɧɨɝɨ ɛɚɣɬɚ
BYTE write = 0;
DWORD dwByteWrite = 0;
if (IWriteFile(hCom_l, Swrite, sizeof(BYTE),
SdwByteWrite, NULL)) return false;
return true;
}
// ɮɭɧɤɰɢɹ ɞɥɹ ɡɚɩɢɫɢ ɦɚɫɫɢɜɚ ɞɚɧɧɵɯ
DWORD WriteDataCOM(void* Data,
unsigned int uNumBytes) {
DWORD dwBytesWrite = 0;
if (IWriteFile(hCom_l, Data, uNumBytes, SdwByteWrite,
107

NULL))
// ɫɤɨɥɶɤɨ ɭɞɚɥɨɫɶ ɡɚɩɢɫɚɬɶ
return dwBytesWrite;
// ɜɨɡɜɪɚɳɚɟɦ ɩɨɥɧɨɟ ɱɢɫɥɨ ɡɚɩɢɫɚɧɧɵɯ ɛɚɣɬɨɜ
return dwBytesWrite;
}
ɉɪɢɦɟɪ 3.32. Ɉɛɳɚɹ ɮɭɧɤɰɢɹ ɞɥɹ ɪɚɛɨɬɵ ɫ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɵɦ ɩɨɪɬɨɦ ɜ
Windows.
// ɞɨɛɚɜɥɹɟɦ ɜ ɝɥɨɛɚɥɶɧɭɸ ɨɛɥɚɫɬɶ ɞɚɧɧɵɯ
// ɡɧɚɱɟɧɢɟ ɞɥɹ ɜɵɞɟɥɟɧɢɹ ɫɢɝɧɚɥɚ
DWORD dwSignal;
void GeneralCOM () {
// ɩɪɨɜɟɪɹɟɦ ɫɢɝɧɚɥ ɜ ɥɢɧɢɢ
if (WaitCommEvent(hCom_l, sdwSignal, Sover)) {
if (dwSignal &EV_DSR) {
// ɟɫɥɢ ɞɚɧɧɵɟ ɝɨɬɨɜɵ ɞɥɹ ɱɬɟɧɢɹ
// ɱɢɬɚɟɦ ɛɚɣɬ ɢɡ ɩɨɪɬɚ
BYTE data = ReadByteCOM();
// ɡɞɟɫɶ - ɫɨɯɪɚɧɹɟɦ ɩɨɥɭɱɟɧɧɵɣ
ɛɚɣɬ ɤɭɞɚ-ɥɢɛɨ
}
if (dwSignal &EV_CTS)
// ɦɨɠɧɨ ɩɢɫɚɬɶ ɞɚɧɧɵɟ ɜ ɩɨɪɬ
// ɩɟɪɟɞɚɟɦ ɢɡɜɧɟ ɛɚɣɬ ɢ ɩɢɲɟɦ ɟɝɨ ɜ ɩɨɪɬ
WriteByteCOM(myByte);
// ɩɨɫɥɟ ɡɚɜɟɪɲɟɧɢɹ ɪɚɛɨɬɵ ɫɥɟɞɭɟɬ ɜɵɡɜɚɬɶ
// ɮɭɧɤɰɢɸ ɨɱɢɫɬɤɢ ɪɟɫɭɪɫɨɜ
void CloseCOM () {
if (over.hEvent) {
CloseHandle(over.hEvent);
// ɡɚɤɪɵɜɚɟɦ ɨɛɴɟɤɬ ɫɨɛɵɬɢɹ
over.hEvent = NULL; }
if (hCom_l) {
CloseHandle(hCom_l); // ɡɚɤɪɵɜɚɟɦ ɩɨɪɬ C0M1
hCom = NULL;
}
ɉɪɨɝɪɚɦɦɢɪɨɜɚɧɢɟ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɨɝɨ ɩɨɪɬɚ ɞɥɹ Linux ɪɚɫɫɦɨɬɪɢɦ ɧɚ ɩɪɢɦɟɪɚɯ ɢɡ ɞɨɤɭɦɟɧɬɨɜ ɫɟɪɢɢ Linux HOWTO (ɚɞɪɟɫ ɪɟɫɭɪɫɚ: http://stuff.mit.edu).
Ɇɚɬɟɪɢɚɥɵ ɢɡ
ɷɬɨɣ ɫɟɪɢɢ, ɫɨɝɥɚɫɧɨ ɚɜɬɨɪɫɤɨɣ ɥɢɰɟɧɡɢɢ, ɦɨɝɭɬ ɛɵɬɶ ɜɨɫɩɪɨɢɡɜɟɞɟɧɵ ɢ ɪɚɫɩɪɨɫɬɪɚɧɟɧɵ ɩɨɥɧɨɫɬɶɸ ɢɥɢ ɱɚɫɬɢɱɧɨ ɧɚ ɥɸɛɨɦ ɮɢɡɢɱɟɫɤɨɦ ɢɥɢ
ɷɥɟɤɬɪɨɧɧɨɦ ɧɨɫɢɬɟɥɟ ɞɨ ɬɟɯ ɩɨɪ, ɩɨɤɚ ɷɬɨ ɭɜɟɞɨɦɥɟɧɢɟ ɨɛ ɚɜɬɨɪɫɤɢɯ ɩɪɚɜɚɯ
ɛɭɞɟɬ ɫɨɯɪɚɧɟɧɨ ɧɚ ɜɫɟɯ ɤɨɩɢɹɯ.
ɉɨɫɥɟɞɨɜɚɬɟɥɶɧɵɟ ɩɨɪɬɵ ɨɬɧɨɫɹɬɫɹ ɤ ɭɫɬɪɨɣɫɬɜɚɦ /dev/ttyS* Linux ɢ
ɤɨɧɮɢɝɭɪɢɪɭɸɬɫɹ ɜɨ ɜɪɟɦɹ ɡɚɩɭɫɤɚ ɫɢɫɬɟɦɵ, ɨ ɱɟɦ ɧɟɨɛɯɨɞɢɦɨ ɩɨɦɧɢɬɶ
ɩɪɢ
ɩɪɨɝɪɚɦɦɢɪɨɜɚɧɢɢ ɫɜɹɡɢ ɧɟɩɨɫɪɟɞɫɬɜɟɧɧɨ ɱɟɪɟɡ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɵɟ ɩɨɪɬɵ.
ɇɚɩɪɢɦɟɪ, ɩɨɪɬɵ ɦɨɝɭɬ ɛɵɬɶ ɫɤɨɧɮɢɝɭɪɢɪɨɜɚɧɵ ɜɨ ɜɪɟɦɹ ɡɚɩɭɫɤɚ ɫɢɫɬɟɦɵ ɬɚ-
108

ɤɢɦ ɨɛɪɚɡɨɦ, ɱɬɨ ɨɧɢ ɜɨɡɜɪɚɳɚɸɬ «ɷɯɨ» ɜɜɨɞɢɦɨɝɨ ɫɢɦɜɨɥɚ ɨɛɪɚɬɧɨ, ɱɬɨ ɨɛɵɱɧɨ ɞɨɥɠɧɨ ɛɵɬɶ ɢɡɦɟɧɟɧɨ ɩɪɢ ɩɟɪɟɞɚɱɟ ɞɚɧɧɵɯ.
ȼɫɟ ɩɚɪɚɦɟɬɪɵ ɦɨɝɭɬ ɛɵɬɶ ɫɤɨɧɮɢɝɭɪɢɪɨɜɚɧɵ ɢɡ ɩɪɨɝɪɚɦɦɵ. Ʉɨɧɮɢɝɭɪɚɰɢɹ ɫɨɯɪɚɧɹɟɬɫɹ ɜ ɫɬɪɭɤɬɭɪɟ termios, ɤɨɬɨɪɚɹ ɨɛɴɹɜɥɟɧɚ ɜ ɡɚɝɨɥɨɜɨɱɧɨɦ ɮɚɣɥɟ <asm/termbits.h>:
#define NCCS 19
struct termios {
/* ɮɥɚɝɢ ɪɟɠɢɦɚ ɜɜɨɞɚ (input) */
tcflag_t c_iflag;
/* ɮɥɚɝɢ ɪɟɠɢɦɚ ɜɵɜɨɞɚ (output) */
tcflag_t c_oflag;
/* ɮɥɚɝɢ ɪɟɠɢɦɚ ɭɩɪɚɜɥɟɧɢɹ */
tcflag_t c_cflag;
/* ɮɥɚɝɢ
ɥɨɤɚɥɶɧɨɝɨ ɪɟɠɢɦɚ */
tcflag_t c_lflag;
/* ɞɢɫɰɢɩɥɢɧɚ ɥɢɧɢɢ */
cc_t c_line;
/* ɭɩɪɚɜɥɹɸɳɢɟ ɫɢɦɜɨɥɵ */
cc_t c_cc[NCCS]; };
ɗɬɨɬ ɮɚɣɥ ɬɚɤɠɟ ɫɨɞɟɪɠɢɬ ɜɫɟ ɨɛɴɹɜɥɟɧɢɹ ɮɥɚɝɨɜ. Ɏɥɚɝɢ ɪɟɠɢɦɚ ɜɜɨɞɚ ɜ
c_iflag ɭɩɪɚɜɥɹɸɬ ɜɫɟɣ ɨɛɪɚɛɨɬɤɨɣ ɜɜɨɞɚ, ɤɨɬɨɪɚɹ ɩɨɞɪɚɡɭɦɟɜɚɟɬ, ɱɬɨ ɫɢɦɜɨɥɵ, ɩɨɫɵɥɚɟɦɵɟ ɨɬ ɭɫɬɪɨɣɫɬɜɚ, ɦɨɝɭɬ ɛɵɬɶ ɨɛɪɚɛɨɬɚɧɵ ɩɟɪɟɞ ɬɟɦ, ɤɚɤ ɨɧɢ
ɛɭɞɭɬ ɩɪɨɱɢɬɚɧɵ ɜɵɡɨɜɨɦ ɮɭɧɤɰɢɢ read. Ⱥɧɚɥɨɝɢɱɧɨ, ɮɥɚɝ c_oflag ɭɩɪɚɜɥɹɟɬ ɨɛɪɚɛɨɬɤɨɣ
ɜɵɜɨɞɚ
. Ɏɥɚɝ c_cflag ɫɨɞɟɪɠɢɬ ɫɥɟɞɭɸɳɢɟ ɭɫɬɚɧɨɜɤɢ ɞɥɹ
ɩɨɪɬɚ: ɫɤɨɪɨɫɬɶ ɩɟɪɟɞɚɱɢ ɞɚɧɧɵɯ, ɱɢɫɥɨ ɛɢɬɨɜ ɜ ɩɟɪɟɞɚɜɚɟɦɨɦ ɫɢɦɜɨɥɟ, ɱɢɫɥɨ
ɫɬɨɩ-ɛɢɬɨɜ ɢ ɬ. ɞ. Ɏɥɚɝɢ ɥɨɤɚɥɶɧɨɝɨ ɪɟɠɢɦɚ ɯɪɚɧɹɬɫɹ ɜ c_lflag ɢ ɨɩɪɟɞɟɥɹɸɬ, ɛɭɞɟɬ ɥɢ ɩɪɨɢɡɜɨɞɢɬɶɫɹ «ɷɯɨ» ɞɥɹ ɜɜɨɞɢɦɵɯ ɫɢɦɜɨɥɨɜ, ɤɚɤɢɟ ɫɢɝɧɚɥɵ ɛɭɞɭɬ ɩɨɫɵɥɚɬɶɫɹ ɩɪɨɝɪɚɦɦɟ, ɢ ɬ. ɞ. ɂ ɧɚɤɨɧɟɰ, ɦɚɫɫɢɜ c_cc ɨɩɢɫɵɜɚɟɬ
ɭɩɪɚɜ-
ɥɹɸɳɢɟ ɫɢɦɜɨɥɵ ɞɥɹ ɤɨɧɰɚ ɮɚɣɥɚ, ɨɫɬɚɧɨɜɤɢ ɩɟɪɟɞɚɱɢ ɢ ɬ. ɞ.
Ɂɧɚɱɟɧɢɹ ɩɨ ɭɦɨɥɱɚɧɢɸ ɞɥɹ ɭɩɪɚɜɥɹɸɳɢɯ ɫɢɦɜɨɥɨɜ ɨɩɢɫɚɧɵ ɜ ɡɚɝɨɥɨɜɨɱɧɨɦ ɮɚɣɥɟ asm/termios.h. Ɏɥɚɝɢ ɨɩɢɫɚɧɵ ɧɚ ɫɬɪɚɧɢɰɟ ɪɭɤɨɜɨɞɫɬɜɚ Linux
(man page) termios(3).
ɋɬɪɭɤɬɭɪɚ termios ɫɨɞɟɪɠɢɬ ɬɚɤɠɟ ɷɥɟɦɟɧɬ c_line (ɞɢɫɰɢɩɥɢɧɚ ɥɢɧɢɢ), ɤɨɬɨɪɵɣ ɧɟ ɢɫɩɨɥɶɡɭɟɬɫɹ ɜ POSIX-ɫɨɜɦɟɫɬɢɦɵɯ ɫɢɫɬɟɦɚɯ.
ɤɚɧɨɧɢɱɟɫɤɢɣ
ȼɨɡɦɨɠɧɨ ɢɫɩɨɥɶɡɨɜɚɧɢɟ ɬɪɟɯ ɪɚɡɥɢɱɧɵɯ ɤɨɧɰɟɩɰɢɣ
ɜɜɨɞɚ:
ɜɜɨɞ, ɧɟɤɚɧɨɧɢɱɟɫɤɢɣ ɜɜɨɞ ɢ ɚɫɢɧɯɪɨɧɧɵɣ ɜɜɨɞ. Ⱦɥɹ ɨɩɪɟɞɟɥɟɧɧɨɝɨ ɩɪɢɥɨɠɟɧɢɹ ɞɨɥɠɧɚ ɛɵɬɶ ɜɵɛɪɚɧɚ ɩɨɞɯɨɞɹɳɚɹ ɤɨɧɰɟɩɰɢɹ.
Ʉɚɧɨɧɢɱɟɫɤɢɣ ɜɜɨɞ – ɷɬɨ ɧɨɪɦɚɥɶɧɵɣ ɪɟɠɢɦ ɨɛɪɚɛɨɬɤɢ ɞɥɹ ɬɟɪɦɢɧɚɥɨɜ,
ɨɞɧɚɤɨ ɨɧ ɬɚɤɠɟ ɦɨɠɟɬ ɛɵɬɶ ɩɨɥɟɡɟɧ ɞɥɹ ɤɨɦɦɭɧɢɤɚɰɢɢ ɫ ɞɪɭɝɢɦ ɜɜɨɞɨɦ, ɨɛɪɚɛɚɬɵɜɚɟɦɵɦ ɩɨɫɬɪɨɱɧɨ, ɱɬɨ ɩɨɞɪɚɡɭɦɟɜɚɟɬ ɜɨɡɜɪɚɬ ɩɨɥɧɨɣ ɫɬɪɨɤɢ ɮɭɧɤɰɢɟɣ
read. ɋɬɪɨɤɚ ɩɨ ɭɦɨɥɱɚɧɢɸ ɡɚɤɚɧɱɢɜɚɟɬɫɹ ɫɢɦɜɨɥɨɦ
NL (ASCII LF), ɫɢɦɜɨ-
ɥɨɦ ɤɨɧɰɚ ɫɬɪɨɤɢ ɢɥɢ ɫɢɦɜɨɥɨɦ ɤɨɧɰɚ ɮɚɣɥɚ. ɋɢɦɜɨɥ CR (ɩɨ ɭɦɨɥɱɚɧɢɸ –
ɫɢɦɜɨɥ ɤɨɧɰɚ ɫɬɪɨɤɢ ɞɥɹ DOS/Windows) ɧɟ ɛɭɞɟɬ ɡɚɜɟɪɲɚɬɶ ɫɬɪɨɤɭ ɩɪɢ ɭɫɬɚɧɨɜɤɚɯ ɩɨ ɭɦɨɥɱɚɧɢɸ.
109

ɉɪɢ ɤɚɧɨɧɢɱɟɫɤɨɦ ɜɜɨɞɟ ɦɨɠɧɨ ɨɛɪɚɛɚɬɵɜɚɬɶ ɨɱɢɫɬɤɭ, ɭɞɚɥɟɧɢɟ ɫɥɨɜɚ,
ɩɟɪɟɩɟɱɚɬɤɭ ɫɢɦɜɨɥɨɜ, ɬɪɚɧɫɥɢɪɨɜɚɬɶ CR ɜ NL ɢ ɬ. ɞ.
Ɉɛɪɚɛɨɬɤɚ ɧɟɤɚɧɨɧɢɱɟɫɤɨɝɨ ɜɜɨɞɚ ɦɚɧɢɩɭɥɢɪɭɟɬ ɮɢɤɫɢɪɨɜɚɧɧɵɦ ɤɨɥɢɱɟɫɬɜɨɦ ɫɢɦɜɨɥɨɜ ɜ ɨɞɧɨɣ ɨɩɟɪɚɰɢɢ ɱɬɟɧɢɹ. ɗɬɨɬ ɪɟɠɢɦ ɞɨɥɠɟɧ ɛɵɬɶ ɢɫɩɨɥɶɡɨɜɚɧ, ɟɫɥɢ ȼɚɲɟ ɩɪɢɥɨɠɟɧɢɟ ɜɫɟɝɞɚ ɞɨɥɠɧɨ ɱɢɬɚɬɶ ɮɢɤɫɢɪɨɜɚɧɧɨɟ ɤɨɥɢɱɟɫɬɜɨ
ɫɢɦɜɨɥɨɜ, ɢɥɢ ɟɫɥɢ ɩɨɞɤɥɸɱɟɧɧɨɟ ɭɫɬɪɨɣɫɬɜɨ ɩɨɫɵɥɚɟɬ ɩɚɤɟɬɵ ɫɢɦɜɨɥɨɜ.
Ⱦɜɟ ɨɩɢɫɚɧɧɵɯ ɜɵɲɟ ɤɨɧɰɟɩɰɢɢ ɦɨɝɭɬ ɛɵɬɶ ɢɫɩɨɥɶɡɨɜɚɧɵ ɩɪɢ ɫɢɧɯɪɨɧɧɨɦ
ɢ ɚɫɢɧɯɪɨɧɧɨɦ ɪɟɠɢɦɟ. ɋɢɧɯɪɨɧɧɵɣ ɪɟɠɢɦ ɭɫɬɚɧɚɜɥɢɜɚɟɬɫɹ ɩɨ ɭɦɨɥɱɚɧɢɸ, ɩɪɢ
ɷɬɨɦ ɜɵɡɨɜ ɮɭɧɤɰɢɢ read ɛɭɞɟɬ ɡɚɛɥɨɤɢɪɨɜɚɧ ɞɨ ɬɟɯ ɩɨɪ, ɩɨɤɚ ɨɩɟɪɚɰɢɹ ɱɬɟɧɢɹ
ɧɟ ɛɭɞɟɬ ɡɚɜɟɪɲɟɧɚ. ȼ ɚɫɢɧɯɪɨɧɧɨɦ ɪɟɠɢɦɟ ɜɵɡɨɜ read ɜɨɡɜɪɚɳɚɟɬ ɭɩɪɚɜɥɟɧɢɟ
ɧɟɦɟɞɥɟɧɧɨ ɢ ɩɨɫɵɥɚɟɬ ɫɢɝɧɚɥ ɜɵɡɜɚɜɲɟɣ ɩɪɨɝɪɚɦɦɟ ɩɨɫɥɟ ɡɚɜɟɪɲɟɧɢɹ ɨɩɟɪɚɰɢɢ
ɱɬɟɧɢɹ. ɗɬɨɬ ɫɢɝɧɚɥ
ɦɨɠɟɬ ɛɵɬɶ ɩɪɢɧɹɬ ɫɨɨɬɜɟɬɫɬɜɭɸɳɢɦ ɨɛɪɚɛɨɬɱɢɤɨɦ.
ɉɪɢ ɨɛɪɚɛɨɬɤɟ ɤɚɧɨɧɢɱɟɫɤɨɝɨ ɜɜɨɞɚ ɪɚɡɦɟɪ ɩɪɢɟɦɧɨɝɨ ɛɭɮɟɪɚ ɨɝɪɚɧɢɱɟɧ
255 ɫɢɦɜɨɥɚɦɢ, ɩɨɞɨɛɧɨ ɦɚɤɫɢɦɚɥɶɧɨɣ ɞɥɢɧɟ ɫɬɪɨɤɢ (ɫɦ. linux/limits.h
ɢɥɢ posix1_lim.h).
Ɋɚɫɫɦɨɬɪɢɦ ɩɪɢɦɟɪ ɪɟɚɥɢɡɚɰɢɢ ɤɚɧɨɧɢɱɟɫɤɨɝɨ ɜɜɨɞɚ. Ʉɨɦɦɟɧɬɚɪɢɢ ɜ ɤɨɞɟ
ɨɛɴɹɫɧɹɸɬ ɢɫɩɨɥɶɡɨɜɚɧɢɟ ɪɚɡɥɢɱɧɵɯ ɪɟɠɢɦɨɜ ɜɜɨɞɚ. ɇɟ ɡɚɛɭɞɶɬɟ ɩɪɟɞɨɫɬɚɜɢɬɶ
ɩɪɢɜɢɥɟɝɢɢ ɞɨɫɬɭɩɚ ɤ ɫɨɨɬɜɟɬɫɬɜɭɸɳɟɦɭ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɨɦɭ ɩɨɪɬɭ (ɧɚɩɪɢɦɟɪ:
chmod a+rw /dev/ttyS1)!
ɉɪɢɦɟɪ 3.33. Ʉɚɧɨɧɢɱɟɫɤɢɣ ɜɜɨɞ.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
/* ɭɫɬɚɧɨɜɤɢ ɫɤɨɪɨɫɬɢ ɩɟɪɟɞɚɱɢ ɞɚɧɧɵɯ ɨɛɴɹɜɥɟɧɵ ɜ
<asm/termbits.h>, ɜɤɥɸɱɟɧɧɨɦ ɜ <termios.h>*/
#define BAUDRATE B38400
/* ɢɡɦɟɧɢɬɟ ɷɬɢ ɨɛɴɹɜɥɟɧɢɹ ɞɥɹ ɤɨɪɪɟɤɬɧɨɝɨ ɭɤɚɡɚɧɢɹ
ɩɨɪɬɚ */
#define MODEMDEVICE "/dev/ttyS1"
/* POSIX-ɫɨɜɦɟɫɬɢɦɵɣ ɢɫɬɨɱɧɢɤ */
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void main() {
int fd,c, res;
struct termios oldtio,newtio;
char buf[255];
/* Ɉɬɤɪɵɜɚɟɦ ɭɫɬɪɨɣɫɬɜɨ ɦɨɞɟɦɚ ɞɥɹ ɱɬɟɧɢɹ ɢ ɡɚɩɢɫɢ ɤɚɤ
ɧɟɭɩɪɚɜɥɹɸɳɢɣ ɬɟɪɦɢɧɚɥ (tty), ɩɨɫɤɨɥɶɤɭ ɦɵ ɧɟ ɯɨɬɢɦ ɡɚɜɟɪɲɚɬɶ ɩɪɨɰɟɫɫ, ɤɨɝɞɚ ɩɨɦɟɯɢ ɜ ɥɢɧɢɢ ɩɨɫɵɥɚɸɬ ɫɢɝɧɚɥ
CTRL-C. */
110
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
