Giáo trình Lập trình hệ thống - Chương 4: Giao tiếp cống nối tiếp - Phạm Hùng Kim Khánh

Tài liệu Lập trình hệ thống  
Chương 4  
Chương 4  
GIAO TIẾP CỐNG NỐI TIẾP  
1. Cấu trúc cổng nối tiếp  
Cổng nối tiếp được sử dụng để truyền dữ liệu hai chiều giữa máy tính và ngoại vi, có  
các ưu điểm sau:  
- Khoảng cách truyền xa hơn truyền song song.  
- Số dây kết nối ít.  
- Có thể truyền không dây dùng hồng ngoại.  
- Có thể ghép nối với vi điều khiển hay PLC (Programmable Logic Device).  
- Cho phép nối mạng.  
- Có thể tháo lắp thiết bị trong lúc máy tính đang làm việc.  
- Có thể cung cấp nguồn cho các mạch điện đơn giản  
Các thiết bị ghép nối chia thành 2 loại: DTE (Data Terminal Equipment) và DCE  
(Data Communication Equipment). DCE là các thiết bị trung gian như MODEM còn DTE là  
các thiết bị tiếp nhận hay truyền dữ liệu như máy tính, PLC, vi điều khiển, … Việc trao đổi  
tín hiệu thông thường qua 2 chân RxD (nhận) và TxD (truyền). Các tín hiệu còn lại có chức  
năng hỗ trợ để thiết lập và điều khiển quá trình truyền, được gọi là các tín hiệu bắt tay  
(handshake). Ưu điểm của quá trình truyền dùng tín hiệu bắt tay là có thể kiểm soát đường  
truyền.  
Tín hiệu truyền theo chuẩn RS-232 của EIA (Electronics Industry Associations).  
Chuẩn RS-232 quy định mức logic 1 ứng với điện áp từ -3V đến -25V (mark), mức logic 0  
ứng với điện áp từ 3V đến 25V (space) và có khả năng cung cấp dòng từ 10 mA đến 20 mA.  
Ngoài ra, tất cả các ngõ ra đều có đặc tính chống chập mạch.  
Chuẩn RS-232 cho phép truyền tín hiệu với tốc độ đến 20.000 bps nhưng nếu cáp  
truyền đủ ngắn có thể lên đến 115.200 bps.  
Các phương thức nối giữa DTE và DCE:  
- Đơn công (simplex connection): dữ liệu chỉ được truyền theo 1 hướng.  
- Bán song công ( half-duplex): dữ liệu truyền theo 2 hướng, nhưng mỗi thời điểm  
chỉ được truyền theo 1 hướng.  
- Song công (full-duplex): số liệu được truyền đồng thời theo 2 hướng.  
Định dạng của khung truyền dữ liệu theo chuẩn RS-232 như sau:  
Start D0  
0
D1  
D2  
D3  
D4  
D5  
D6  
D7  
P
Stop  
1
Khi không truyền dữ liệu, đường truyền sẽ ở trạng thái mark (điện áp -10V). Khi bắt  
đầu truyền, DTE sẽ đưa ra xung Start (space: 10V) và sau đó lần lượt truyền từ D0 đến D7  
Phạm Hùng Kim Khánh  
Trang 75  
Tài liệu Lập trình hệ thống  
Chương 4  
và Parity, cuối cùng là xung Stop (mark: -10V) để khôi phục trạng thái đường truyền. Dạng  
tín hiệu truyền mô tả như sau (truyền ký tự A):  
Hình 4.1 – Tín hiệu truyền của ký tự ‘A’  
Các đặc tính kỹ thuật của chuẩn RS-232 như sau:  
Chiều dài cable cực đại 15m  
Tốc độ dữ liệu cực đại 20 Kbps  
Điện áp ngõ ra cực đại  
Điện áp ngõ ra có tải  
Trở kháng tải  
± 25V  
± 5V đến ± 15V  
3K đến 7K  
± 15V  
Điện áp ngõ vào  
Độ nhạy ngõ vào  
Trở kháng ngõ vào  
± 3V  
3K đến 7K  
Các tốc độ truyền dữ liệu thông dụng trong cổng nối tiếp là: 1200 bps, 4800 bps,  
9600 bps và 19200 bps.  
™ Sơ đồ chân:  
Phạm Hùng Kim Khánh  
Trang 76  
Tài liệu Lập trình hệ thống  
Chương 4  
Hình 4.2 – Sơ đồ chân cổng nối tiếp  
Cổng COM có hai dạng: đầu nối DB25 (25 chân) và đầu nối DB9 (9 chân) mô tả như  
hình 4.2. Ý nghĩa của các chân mô tả như sau:  
D25 D9  
Tín  
hiệu  
Hướng  
truyền  
Mô tả  
1
-
-
-
Protected ground: nối đất bảo vệ  
2
3
4
5
6
7
8
20  
22  
23  
24  
3
2
7
8
6
5
1
4
9
-
TxD  
RxD  
RTS  
CTS  
DSR  
GND  
DCD  
DTR  
RI  
DTEÆDCE Transmitted data: dữ liệu truyền  
DCEÆDTE Received data: dữ liệu nhận  
DTEÆDCE Request to send: DTE yêu cầu truyền dữ liệu  
DCEÆDTE Clear to send: DCE sẵn sàng nhận dữ liệu  
DCEÆDTE Data set ready: DCE sẵn sàng làm việc  
-
Ground: nối đất (0V)  
DCEÆDTE Data carier detect: DCE phát hiện sóng mang  
DTEÆDCE Data terminal ready: DTE sẵn sàng làm việc  
DCEÆDTE Ring indicator: báo chuông  
DCEÆDTE Data signal rate detector: dò tốc độ truyền  
DTEÆDCE Transmit Signal Element Timing: tín hiệu định thời  
truyền đi từ DTE  
DSRD  
TSET  
-
15  
17  
-
-
TSET  
RSET  
DCEÆDTE Transmitter Signal Element Timing: tín hiệu định thời  
truyền từ DCE để truyền dữ liệu  
DCEÆDTE Receiver Signal Element Timing: tín hiệu định thời  
truyền từ DCE để truyền dữ liệu  
18  
21  
-
-
LL  
RL  
Local Loopback: kiểm tra cổng  
DCEÆDTE Remote Loopback: Tạo ra bởi DCE khi tín hiệu nhận  
từ DCE lỗi  
14  
16  
19  
13  
12  
25  
9
-
-
-
-
-
-
-
-
STxD  
SRxD  
SRTS  
SCTS  
DTEÆDCE Secondary Transmitted Data  
DCEÆDTE Secondary Received Data  
DTEÆDCE Secondary Request To Send  
DCEÆDTE Secondary Clear To Send  
SDSRD DCEÆDTE Secondary Received Line Signal Detector  
TM  
Test Mode  
Dành riêng cho chế độ test  
Dành riêng cho chế độ test  
Không dùng  
10  
11  
Phạm Hùng Kim Khánh  
Trang 77  
Tài liệu Lập trình hệ thống  
Chương 4  
2. Truyền thông giữa hai nút  
Các sơ đồ khi kết nối dùng cổng nối tiếp:  
TxD  
RxD  
GND  
TxD  
RxD  
GND  
TxD  
RxD  
GND  
TxD  
RxD  
GND  
DTE1  
DTE2  
DTE  
DCE  
Hình 4.3 – Kết nối đơn giản trong truyền thông nối tiếp  
Khi thực hiện kết nối như trên, quá trình truyền phải bảo đảm tốc độ ở đầu phát và  
thu giống nhau. Khi có dữ liệu đến DTE, dữ liệu này sẽ được đưa vào bộ đệm và tạo ngắt.  
Ngoài ra, khi thực hiện kết nối giữa hai DTE, ta còn dùng sơ đồ sau:  
TxD  
RxD  
GND  
RTS  
CTS  
DSR  
DCD  
DTR  
TxD  
RxD  
GND  
RTS  
CTS  
DSR  
DCD  
DTR  
DTE1  
DTE2  
Hình 4.4 – Kết nối trong truyền thông nối tiếp dùng tín hiệu bắt tay  
Khi DTE1 cần truyền dữ liệu thì cho DTR tích cực Æ tác động lên DSR của DTE2  
cho biết sẵn sàng nhận dữ liệu và cho biết đã nhận được sóng mang của MODEM (ảo). Sau  
đó, DTE1 tích cực chân RTS để tác động đến chân CTS của DTE2 cho biết DTE1 có thể  
nhận dữ liệu. Khi thực hiện kết nối giữa DTE và DCE, do tốc độ truyền khác nhau nên phải  
thực hiện điều khiển lưu lượng. Quá trinh điều khiển này có thể thực hiện bằng phần mềm  
hay phần cứng. Quá trình điều khiển bằng phần mềm thực hiện bằng hai ký tự Xon và Xoff.  
Ký tự Xon được DCE gởi đi khi rảnh (có thể nhận dữ liệu). Nếu DCE bận thì sẽ gởi ký tự  
Xoff. Quá trình điều khiển bằng phần cứng dùng hai chân RTS và CTS. Nếu DTE muốn  
truyền dữ liệu thì sẽ gởi RTS để yêu cầu truyền, DCE nếu có khả năng nhận dữ liệu (đang  
rảnh) thì gởi lại CTS.  
3. Truy xuất trực tiếp thông qua cổng  
Các cổng nối tiếp trong máy tính được đánh số là COM1, COM2, COM3, COM4 với  
các địa chỉ như sau:  
Phạm Hùng Kim Khánh  
Trang 78  
Tài liệu Lập trình hệ thống  
Chương 4  
Tên Địa chỉ Ngắt Vị trí chứa địa chỉ  
COM1 3F8h  
COM2 2F8h  
COM3 3E8h  
COM4 2E8h  
4
3
4
3
0000h:0400h  
0000h:0402h  
0000h:0404h  
0000h:0406h  
Giao tiếp nối tiếp trong máy tính sử dụng vi mạch UART với các thanh ghi cho trong  
bảng sau:  
Offset DLAB R/W Tên  
Chức năng  
0
0
1
0
1
W
R
THR Transmitter Holding Register (đệm truyền)  
RBR Receiver Buffer Register (đệm thu)  
0
R/W BRDL Baud Rate Divisor Latch (số chia byte thấp)  
R/W IER Interrupt Enable Register (cho phép ngắt)  
R/W BRDH Số chia byte cao  
R
W
1
2
IIR  
Interrupt Identification Register (nhận dạng ngắt)  
FCR FIFO Control Register  
3
4
5
6
7
R/W LCR Line Control Register (điều khiển đường dây)  
R/W MCR Modem Control Register (điều khiển MODEM)  
R
R
LSR Line Status Register (trạng thái đường dây)  
MSR Modem Status Register (trạng thái MODEM)  
Scratch Register (thanh ghi tạm)  
R/W  
Các thanh ghi này có thể truy xuất trực tiếp kết hợp với địa chỉ cổng (ví dụ như thanh  
ghi cho phép ngắt của COM1 có địa chỉ là BACOM1 + 1 = 3F9h.  
™ IIR (Interrupt Identification):  
IIR xác định mức ưu tiên và nguồn gốc của yêu cầu ngắt mà UART đang chờ phục  
vụ. Khi cần xử lý ngắt, CPU thực hiện đọc các bit tương ứng để xác định nguồn gốc của  
ngắt. Định dạng của IIR như sau:  
D7  
D6  
D5  
D4  
D3  
D2  
D1  
D0  
00: không có Cho phép FIFO 64 -  
1: ngắt time-out Xác định nguồn 0:  
có  
FIFO  
byte (trong 16750)  
(trong 16550)  
gốc ngắt  
ngắt  
11: cho phép  
FIFO  
1: không  
ngắt  
D2 D1  
Ưu  
tiên  
Tên  
Nguồn  
D2 – D0 bị xoá  
khi  
Đọc LSR  
0
0
4
Đường  
Lỗi khung, thu đè, lỗi parity, gián đoạn  
truyền  
khi thu  
0
1
1
0
3
2
Đệm thu  
Đệm phát  
Đệm thu đầy  
Đệm phát rỗng  
Đọc RBR  
Đọc IIR, ghi  
THR  
1
1
1
Modem  
CTS, DSR, RI, RLSD  
Đọc MSR  
(mức 1 ưu tiên cao nhất)  
Phạm Hùng Kim Khánh  
Trang 79  
Tài liệu Lập trình hệ thống  
Chương 4  
™ IER (Interrupt Enable Register):  
IER cho phép hay cấm các nguyên nhân ngắt khác nhau (1: cho phép, 0: cầm ngắt)  
D7 D6 D5  
D4  
D3  
D2  
D1  
D0  
-
-
POW HBR MODEM LINE TxEMPTY RxRDY  
Cho phép kiểu  
Cho phép khi lỗi  
Cho phép khi  
công suất thấp  
modem  
THR rỗng  
Cho phép khi  
RBR đầy  
Cho phép kiểu  
nghỉ (hibernate)  
Cho phép khi lỗi  
thu, phát  
™ MCR (Modem Control Register):  
D7 D6 D5 D4 D3  
D2  
D1  
D0  
-
-
-
LOOP OUT2 OUT1 RTS DTR  
Mode loopback:  
kiểm tra hoạt  
đọng của UART  
Điều khiển 2 ngõ ra  
OUT1,OUT2 của  
UART  
Điều khiển tín hiệu  
RTS và DTR  
™ MSR (Modem Status Register):  
D7 D6 D5  
D4  
D3  
D2  
D1  
D0  
RLSD RI DSR CTS  
ΔRLSD ΔRI ΔDSR ΔCTS  
Trạng thái của CD, RI,  
DSR và CTS  
1: nếu có thay đổi các tín hiệu so với lần đọc trước  
ΔRI: = 1 nếu có xung dương tại RI  
™ LSR (Line Status Register):  
D7  
D6  
D5  
D4 D3 D2 D1  
D0  
FIE TSRE THRE BI FE PE OE RxDR  
FIE: FIFO Error – sai trong FIFO  
TSRE: Transmitter Shift Register Empty – thanh ghi dịch rỗng (=1 khi đã phát 1 ký  
tự và bị xoá khi có 1 ký tự chuyển đến từ THR.  
THRE: Transmitter Holding Register Empty (=1 khi có 1 ký tự đã chuyển từ THR –  
TSR và bị xoá khi CPU đưa ký tự tới THR).  
Phạm Hùng Kim Khánh  
Trang 80  
Tài liệu Lập trình hệ thống  
Chương 4  
BI: Break Interrupt (=1 khicó sự gián đoạn khi truyền, nghĩa là tồn tại mức logic 0  
trong khoảng thời gian dài hơn khoảng thời gian truyền 1 byte và bị xoá khi CPU đọc LSR)  
FE: Frame Error (=1 khi có lỗi khung truyền và bị xoá khi CPU đọc LSR)  
PE: Parity Error (=1 khi có lỗi parity và bị xoá khi CPU đọc LSR)  
OE: Overrun Error (=1 khi có lỗi thu đè, nghĩa là CPU không đọc kịp dữ liệu làm cho  
quá trình ghi chồng lên RBR xảy ra và bị xoá khi CPU đọc LSR)  
RxDR: Receiver Data Ready (=1 khi đã nhận 1 ký tự và đưa vào RBR và bị xoá khi  
CPU đọc RBR).  
™ LCR (Line Control Register):  
D7  
D6  
D5 D4 D3 D2  
D1  
D0  
DLAB SBCB PS2 PS1 PS0 STB WLS1 WLS0  
DLAB (Divisor Latch Access Bit) = 0: truy xuất RBR, THR, IER, = 1 cho phép đặt  
bộ chia tần trong UART để cho phép đạt tốc độ truyền mong muốn.  
UART dùng dao động thạch anh với tần số 1.8432 MHz đưa qua bộ chia 16 thành tần  
số 115,200 Hz. Khi đó, tuỳ theo giá trị trong BRDL và BRDH, ta sẽ có tốc độ mong muốn.  
Ví dụ như đường truyền có tốc độ truyền 2,400 bps có giá trị chia 115,200 / 2,400 = 48d =  
0030h Æ BRDL = 30h, BRDH = 00h.  
Một số giá trị thông dụng xác định tốc độ truyền cho như sau:  
Tốc độ (bps) BRDH BRDL  
1,200  
2,400  
4,800  
9,600  
19,200  
38,400  
57,600  
115,200  
00h  
00h  
00h  
00h  
00h  
00h  
00h  
00h  
60h  
30h  
18h  
0Ch  
06h  
03h  
02h  
01h  
SBCB (Set Break Control Bit) =1: cho phép truyền tín hiệu Break (=0) trong khoảng  
thời gian lớn hơn một khung  
PS (Parity Select):  
PS2 PS1 PS0  
Mô tả  
X
0
0
1
1
X
0
1
0
1
0
1
1
1
1
Không kiểm tra  
Kiểm tra lẻ  
Kiểm tra chẵn  
Parity là mark  
Parity là space  
Phạm Hùng Kim Khánh  
Trang 81  
Tài liệu Lập trình hệ thống  
Chương 4  
STB (Stop Bit) = 0: 1 bit stop, =1: 1.5 bit stop (khi dùng 5 bit dữ liệu) hay 2 bit stop  
(khi dùng 6, 7, 8 bit dữ liệu).  
WLS (Word Length Select):  
WLS1 WLS0 Độ dài dữ liệu  
0
0
1
1
0
1
0
1
5 bit  
6 bit  
7 bit  
8 bit  
Một ví dụ khi lập trình trực tiếp trên cổng như sau:  
.MODEL SMALL  
.STACK 100h  
.DATA  
Com1  
EQU 3F8h  
Com_int EQU 08h  
Buffer  
DB  
251 DUP(?)  
0
Bufferin DB  
Bufferout  
DB  
?
0
Char  
DB  
Seg_com DW  
Off_com DW  
Mask_int DB  
?
; Vector ng•t c•  
?
?
Msg  
.CODE  
Main PROC  
DB  
'Press any key to exit$’  
MOV AX,@DATA  
MOV DS,AX  
MOV AH,35h  
MOV AL,Com_int  
INT 21h  
MOV Seg_com,ES  
MOV Off_com,BX  
; L•u vector ng•t c•  
;Gán vector ng•t m•i  
PUSH DS  
MOV BX,CS  
MOV DS,BX  
LEA DX,Com_ISR  
MOV AH,35h  
MOV AL,Com_int  
INT 21h  
POP DS  
MOV DX,Com1+3  
MOV AL,80h  
OUT DX,AL  
; ••a ch• LCR  
; Set DLAB = 1 cho phép ••nh t•c  
; •• truy•n d• li•u  
Phạm Hùng Kim Khánh  
Trang 82  
Tài liệu Lập trình hệ thống  
Chương 4  
MOV DX,Com1  
; G•i byte th•p  
MOV AL,0Ch  
OUT DX,AL  
MOV DX,Com1+1  
MOV AL,00h  
OUT DX,AL  
; G•i byte cao Æ 000Ch: xác ••nh  
; t•c •• truy•n 9600bps  
MOV DX,Com1+3  
MOV AL,03h  
OUT DX,AL  
; LCR = 0000 0011B  
; DLAB = 0, SBCB = 0 Æ c•m Break  
; PS = 000 Æ no parity  
; STB = 0 Æ 1 stop bit  
; WLS = 11 Æ 8 bit d• li•u  
MOV DX,Com1+4  
MOV AL,03h  
OUT DX,AL  
; Tác ••ng ••n DTR và RTS  
; MCR = 0000 0011b Æ DTR=RTS = 1  
; Æ ngõ DTR và RTS c•a c•ng n•i  
; ti•p = 0  
MOV DX,21h  
; Ki•m tra tr•ng thái ng•t  
; D7 – D0 xác ••nh các IRQi  
; =0: cho phép, =1: c•m  
IN  
AL,DX  
MOV Mask_int,AL  
AND AL,0EFh  
OUT DX,AL  
; = 1110 1111b Æ cho phép IRQ4  
; Æ cho phép COM1  
MOV AL,01h  
MOV DX,Com1+1  
OUT DX,AL  
; IER = 0000 0001b Æ cho phép  
; ng•t khi RBR ••y  
MOV AH,09h  
LEA Dx,Msg  
INT 21h  
Lap:  
MOV AH,0Bh  
INT 21h  
CMP AL,0FFh  
JE  
Exit  
MOV AL,bufferin  
CMP AL,bufferout  
JE  
Lap  
MOV AL,buffer[bufferout]  
MOV char,AL  
INC bufferout  
MOV AL,bufferout  
CMP AL,251  
JNE Next  
MOV bufferout,0  
Next:  
Phạm Hùng Kim Khánh  
Trang 83  
Tài liệu Lập trình hệ thống  
Chương 4  
MOV DL,char  
MOV AH,02h  
INT 21h  
; Xu•t giá tr• ra màn hình  
; Xu•t ra c•ng n•i ti•p  
MOV AL,char  
MOV DX,Com1  
OUT DX,AL  
JMP Lap  
Exit:  
MOV AL,Mask_int  
OUT 21h,AL  
; Khôi ph•c tr•ng thái ng•t  
;Khôi ph•c vector ng•t  
MOV DX,Off_com  
MOV BX,Seg_com  
MOV DS,BX  
MOV AH,35h  
MOV AL,Com_int  
INT 21h  
MOV AH,4Ch  
INT 21h  
Main ENDP  
Com_ISR PROC  
MOV DX,Com1+5  
IN AL,DX  
; ••c n•i dung LSR  
AND AL,1  
; N•u D0 = 1 thì có d• li•u  
JZ  
exit_ISR  
MOV DX,Com1  
IN  
AL,DX  
MOV buffer[bufferin],AL  
INC bufferin  
MOV AL,bufferin  
CMP AL,251  
JNE Exit_ISR  
MOV bufferin,0  
Exit_ISR:  
MOV AL,20h  
OUT 20h,AL  
IRET  
; Báo cho PIC k•t thúc ng•t  
Com_ISR ENDP  
END Main  
4. Truyền thông nối tiếp dùng ActiveX  
4.1. Mô tả  
Việc truyền thông nối tiếp trên Windows được thực hiện thông qua một ActiveX có  
sẵn là Microsoft Comm Control.. ActiveX này dược lưu trữ trong file MSCOMM32.OCX.  
Quá trình này có hai khả năng thực hiện điều khiển trao đổi thông tin:  
Phạm Hùng Kim Khánh  
Trang 84  
Tài liệu Lập trình hệ thống  
Chương 4  
- Điều khiển sự kiện:  
Truyền thông điều khiển sự kiện là phương pháp tốt nhất trong quá trình điều khiển  
việc trao đổi thông tin. Quá trình điều khiển thực hiện thông qua sự kiện OnComm.  
- Hỏi vòng:  
Quá trinh điều khiển bằng phương pháp hỏi vòng thực hiện thông qua kiểm tra các  
giá trị của thuộc tính CommEvent sau một chu kỳ nào đó để xác định xem có sự kiện nào  
xảy ra hay không. Thông thường phương pháp này sử dụng cho các chương trình nhỏ.  
ActiveX MsComm được bổ sung vào một Visual Basic Project thông qua menu  
Project > Components:  
Hình 4.5 – Bổ sung đối tượng MsComm vào VBP  
Biểu tượng của MsComm:  
và các thuộc tính cơ bản mô tả như sau:  
Mô tả  
Thuộc tính  
CommPort Số thứ tự cổng truyền thông  
Input  
Nhận ký tự từ bộ đệm  
Xuất ký tự ra cổng nối tiếp  
Mở / đóng cổng  
Output  
PortOpen  
Settings  
Xác định các tham số truyền  
Phạm Hùng Kim Khánh  
Trang 85  
Tài liệu Lập trình hệ thống  
Chương 4  
Hình 4.6 – Các thuộc tính của đối tượng MSComm  
4.2. Các thuộc tính  
™ Settings:  
Xác định các tham số cho cổng nối tiếp. Cú pháp:  
MSComm1.Settings = ParamString  
MSComm1: tên đối tượng  
ParamString: là một chuỗi có dạng như sau: "BBBB,P,D,S"  
BBBB: tốc độ truyền dữ liệu (bps) trong đó các giá trị hợp lệ là:  
110 2400  
38400  
300 9600 (măc định) 56000  
600 14400  
1200 19200  
188000  
256000  
P: kiểm tra chẵn lẻ, với các giá trị:  
Giá trị  
Mô tả  
O
E
M
S
Odd (kiểm tra lẻ)  
Even (kiểm tra chẵn)  
Mark (luôn bằng 1)  
Space (luôn bằng 0)  
Không kiểm tra  
N
Phạm Hùng Kim Khánh  
Trang 86  
Tài liệu Lập trình hệ thống  
Chương 4  
D: số bit dữ liệu (4, 5, 6, 7 hay 8), mặc định là 8 bit  
S: số bit stop (1, 1.5, 2)  
VD:  
MSComm1.Settings = "9600,O,8,1" sẽ xác định tốc độ truyền 9600bps,  
kiểm tra parity chẵn với 1 bit stop và 8 bit dữ liệu.  
™ CommPort:  
Xác định số thứ tự của cổng truyền thông, cú pháp:  
MSComm1.CommPort = PortNumber  
PortNumber là giá trị nằm trong khoảng từ 1 Æ 99, mặc định là 1.  
VD:  
MSComm1.CommPort = 1 xác định sử dụng COM1  
™ PortOpen:  
Đặt trạng thái hay kiểm tra trạng thái đóng / mở của cổng nối tiếp. Nếu dùng thuộc  
tính này để mở cổng nối tiếp thì phải sử dụng trước 2 thuộc tính Settings và CommPort. Cú  
pháp:  
MSComm1.PortOpen = True | False  
Giá trị xác định là True sẽ thực hiện mở cổng và False để đóng cổng đồng thời xoá  
nội dung của các bộ đệm truyền, nhận.  
VD: Mở cổng COM1 với tốc độ truyền 9600 bps  
MSComm1.Settings = "9600,N,8,1"  
MSComm1.CommPort = 1  
MSComm1.PortOpen = True  
™ Các thuộc tính nhận dữ liệu:  
Input: nhận một chuỗi ký tự và xoá khỏi bộ đệm. Cú pháp:  
InputString = MSComm1.Input  
Thuộc tính này kết hợp với InputLen để xác định số ký tự đọc vào. Nếu InputLen = 0  
thì sẽ đọc toàn bộ dữ liệu có trong bộ đệm.  
InBufferCount: số ký tự có trong bộ đệm nhận. Cú pháp:  
Count = MSComm1.InBufferCount  
Thuộc tính này cùng dược dùng để xoá bộ đệm nhận bắng cách gán giá trị 0.  
MSComm1.InBufferCount = 0  
InBufferSize: đặt và xác định kích thước bộ đệm nhận (tính bằng byte). Cú pháp:  
MSComm1.InBufferCount = NumByte  
Giá trị măc định là 1024 byte. Kích thước bộ đệm này phải đủ lớn để tránh tình trạng  
mất dữ liệu.  
VD: Đọc toàn bộ nội dung trong bộ đệm nhận nếu có dữ liệu  
Phạm Hùng Kim Khánh  
Trang 87  
Tài liệu Lập trình hệ thống  
Chương 4  
MSComm1.InputLen = 0  
If MSComm1.InBufferCount <> 0 Then  
InputString = MSComm1.Input  
End If  
™ Các thuộc tính xuất dữ liệu:  
Bao gồm các thuộc tính Output, OutBufferCount và OutBufferSize, chức năng  
của các thuộc tính này giống như các thuộc tính nhập.  
™ CDTimeout:  
Đặt và xác định khoảng thời gian lớn nhất (tính bằng ms) từ lúc phát hiện sóng mang  
cho đến lúc có dữ liệu. Nếu quá khoảng thời gian này mà vẫn chưa có dữ liệu thì sẽ gán  
thuộc tính CommEvent là CDTO (Carrier Detect Timeout Error) và tạo sự kiện OnComm.  
Cú pháp:  
MSComm1.CDTimeout = NumTime  
™ DSRTimeout:  
Xác định thời gian chờ tín hiệu DSR trước khi xảy ra sự kiện OnComm.  
™ CTSTimeout:  
Đặt và xác định khoảng thời gian lớn nhất (tính bằng ms) đợi tín hiệu CTS trước khi  
đặt thuộc tính CommEvent là CTSTO và tạo sự kiện OnComm. Cú pháp:  
MSComm1.CTSTimeout = NumTime  
™ CTSHolding:  
Xác định đã có tín hiệu CTS hay chưa, tín hiệu này dùng cho quá trình bắt tay bằng  
phần cứng (cho biết DCE sẵn sàng nhận dữ liệu), trả về giá trị True hay False.  
™ DSRHolding:  
Xác định trạng thái DSR (báo hiệu sự tồn tại của DCE), trả về giá trị True hay False.  
™ CDHolding:  
Xác định trạng thái CD, trả về giá trị True hay False.  
™ DTREnable:  
Đặt hay xoá tín hiệu DTR để báo sự tồn tại của DTE. Cú pháp:  
MSComm1.DTREnable = True | False  
™ RTSEnable:  
Đặt hay xoá tín hiệu RTS để yêu cầu truyền dữ liệu đến DTE. Cú pháp:  
MSComm1.RTSEnable = True | False  
™ NullDiscard:  
Cho phép nhận các ký tự NULL (rỗng) hay không (= True: cấm). Cú pháp:  
MSComm1.NullDiscard = True | False  
™ SThreshold:  
Phạm Hùng Kim Khánh  
Trang 88  
Tài liệu Lập trình hệ thống  
Chương 4  
Số byte trong bộ đệm truyền làm phát sinh sự kiện OnComm. Nếu giá trị này bằng 0  
thì sẽ không tạo sự kiện OnComm. Cú pháp:  
MSComm1.SThreshold = NumChar  
™ HandShaking:  
Chọn giao thức bắt tay khi thực hiện truyền dữ liệu. Cú pháp:  
MSComm1.HandShaking = Protocol  
Các giao thức truyền bao gồm:  
Protocol  
ComNone  
Giá trị  
Mô tả  
0
1
2
Không băt tay (mặc định)  
Bắt tay phần mềm (Xon/Xoff)  
Bắt tay phần cứng (RTS/CTS)  
Bắt tay phần cứng và phàn mềm  
ComXon/Xoff  
ComRTS  
ComRTSXon/Xoff 3  
™ CommEvent:  
Trả lại các lỗi truyền thonog hay sự kiện xảy ra tại cổng nối tiếp  
Các sự kiện:  
Sự kiện  
Giá trị  
Mô tả  
ComEvSend  
1
Đã truyền ký tự  
ComEvReceive 2  
Khi có ký tự trong bộ đệm nhận  
Có thay đổi trên CTS (Clear To Send)  
Có thay đổi trên DSR (Data Set Ready)  
Có thay đổi trên CD (Carrier Detect)  
Phát hiện chuông  
ComEvCTS  
ComEvDSR  
ComEvCD  
ComEvRing  
ComEvEOF  
3
4
5
6
7
Nhận ký tự kết thúc file  
Các lỗi truyền thông:  
Lỗi  
Giá trị  
Mô tả  
ComBreak  
1001  
Nhận tín hiệu Break  
ComCTSTO 1002  
Carrier Detect Timeout  
Lỗi khung  
Phần cứng không đọc ký tự trước khi gởi ký tự kế  
Carrier Detect Timeout  
Tràn bộ đệm nhận  
ComFrame  
ComOver  
ComCDTO  
1004  
1006  
1007  
ComRxOver 1008  
ComRxParity 1009  
Lỗi parity  
ComTxFull  
1010  
Tràn bộ đệm truyền  
Phạm Hùng Kim Khánh  
Trang 89  
Tài liệu Lập trình hệ thống  
Chương 4  
4.3. Sự kiện OnComm  
Sự kiện OnComm xảy ra bất cứ khi nào giá trị của thuộc tính CommEvent thay đổi.  
Các thuộc tính RThreshold và SThreshold = 0 sẽ cấm sự kiện OnComm khi thực hiện nhận  
hay gởi dữ liệu. Thông thường, SThreshold = 0 và RThreshold = 1.  
Một chương trình truyền nhận đơn giản thực hiện bằng cách nối chân TxD với RxD  
của cổng COM1 (loopback). Phương pháp này dùng để kiểm tra cổng nối tiếp.  
Thuộc tính cơ bản của cổng nối tiếp:  
Hình 4.7 – Các thuộc tính cơ bản của MSComm  
Cửa sổ chương trình thực thi:  
Textbox chứa  
các ký tự gởi  
Đối tượng  
MSComm  
Textbox chứa  
các ký tự nhận  
Yêu cầu truyền  
dữ liệu  
Hình 4.8 – Cửa sổ chương trình loopback  
Chương trình nguồn:  
VERSION 5.00  
Object  
=
“{648A5603-2C6E-101B-82B6-  
000000000014}#1.1#0”; “MSCOMM32.OCX”  
Phạm Hùng Kim Khánh  
Trang 90  
Tài liệu Lập trình hệ thống  
Chương 4  
Begin VB.Form Form1  
Caption  
=
“Loopback Serial Port  
Example”  
ClientHeight  
ClientLeft  
ClientTop  
ClientWidth  
LinkTopic  
=
=
=
=
=
=
=
3195  
60  
345  
4680  
“Form1”  
3195  
4680  
ScaleHeight  
ScaleWidth  
StartUpPosition =  
3
‘Windows Default  
Begin VB.CommandButton cmdExit  
Caption  
Height  
Left  
TabIndex  
Top  
=
=
=
=
=
=
“Exit”  
615  
2640  
5
2160  
1095  
Width  
End  
Begin VB.CommandButton cmdSend  
Caption  
Height  
Left  
TabIndex  
Top  
=
=
=
=
=
=
“Send”  
615  
1200  
4
2160  
975  
Width  
End  
Begin VB.TextBox txtReceive  
Height  
Left  
Locked  
TabIndex  
Top  
=
=
=
=
=
=
735  
1320  
-1 ‘True  
3
1080  
2535  
Width  
End  
Begin VB.TextBox txtTransmit  
Height  
Left  
TabIndex  
Top  
=
=
=
=
=
735  
1320  
0
240  
2535  
Width  
End  
Begin MSCommLib.MSComm MSComm1  
Left  
Top  
_ExtentX  
_ExtentY  
=
=
=
=
3960  
240  
1005  
1005  
Phạm Hùng Kim Khánh  
Trang 91  
Tài liệu Lập trình hệ thống  
Chương 4  
_Version  
DTREnable  
RThreshold  
=
=
=
393216  
-1 ‘True  
1
End  
Begin VB.Label Label2  
Caption  
Height  
Left  
=
=
=
=
=
=
“Receive:”  
375  
240  
2
1200  
855  
TabIndex  
Top  
Width  
End  
Begin VB.Label Label1  
Caption  
Height  
Left  
=
=
=
=
=
=
“Transmit:”  
375  
240  
1
240  
975  
TabIndex  
Top  
Width  
End  
End  
Attribute VB_Name = “Form1”  
Attribute VB_GlobalNameSpace = False  
Attribute VB_Creatable = False  
Attribute VB_PredeclaredId = True  
Attribute VB_Exposed = False  
Private Sub cmdExit_Click()  
MSComm1.PortOpen = False  
‘Đóng cổng  
End  
End Sub  
Private Sub cmdSend_Click()  
MSComm1.Output = Trim(txtTransmit.Text)’Gởi dữ liệu  
End Sub  
Private Sub Form_Load()  
MSComm1.CommPort = 1  
‘COM1  
MSComm1.Settings = “9600,n,8,1” ‘Tốc độ 9600bps  
MSComm1.PortOpen = True  
End Sub  
‘ Mở cổng  
Private Sub MSComm1_OnComm()  
If (MSComm1.CommEvent = comEvReceive) Then  
txtReceive.Text = txtReceive.Text + MSComm1.Input  
End If  
End Sub  
Phạm Hùng Kim Khánh  
Trang 92  
Tài liệu Lập trình hệ thống  
Chương 4  
5. Giao tiếp với vi điều khiển  
Khi thực hiện giao tiếp với vi điều khiển, ta phải dùng thêm mạch chuyển mức logic  
từ TTL Æ 232 và ngược lại. Các vi mạch thường sử dụng là MAX232 của Maxim hay  
DS275 của Dallas. Mạch chuyển mức logic mô tả như sau:  
_PC  
TxD  
1
6
2
7
3
8
4
9
5
13  
14  
12  
11  
1
R1IN  
R1OUT  
T1IN  
C+  
RxD_PC  
T1OUT  
C25  
10u  
6
2
MAX232  
3
C28  
10u  
V-  
C1-  
DB9  
4
C2+  
C2-  
V+  
5
C29  
10u  
C26  
10u  
VCC  
C27  
10u  
Hình 4.9 – Mạch chuyển mức logic TTL ↔ RS232  
Tuy nhiên, khi sử dụng mạch chuyển mức logic dùng các vi mạch thì đòi hỏi phải  
dùng chung GND giữa máy tính và vi mạch Æ có khả năng làm hỏng cổng nối tiếp khi xảy  
ra hiện tượng chập mạch ở mạch ngoài. Do đó, ta có thể dùng thêm opto 4N35 để cách ly về  
VCC  
điện. Sơ đồ mạch cách ly mô tả như sau:  
1K  
TxD  
6
5
1
2
VCC  
4
68K  
DTR  
4N35  
1
6
2
7
3
8
4
9
5
4.7K  
RxD_PC  
TxD_PC  
1
2
6
5
RxD  
4.7K  
4
4N35  
RTS  
2.2K  
Hình 4.10 – Mạch chuyển mức logic TTL ↔ RS232 cách ly  
Khi giao tiếp, vi điều khiển chính là một DTE nên sẽ nối RxD của máy tính với TxD  
của vi điếu khiển và ngược lại. Mạch kết nối đơn giản giữa vi điều khiển và máy tính như  
sau:  
Phạm Hùng Kim Khánh  
Trang 93  
LED  
LED  
LED  
LED  
LED  
LED  
LED  
LED  
1
3
2
74LS04  
1
2
3
4
5
6
7
8
9
VCC  
VCC  
4
74LS04  
1
2
3
4
5
6
7
8
9
5
6
74LS04  
21  
22  
23  
24  
25  
26  
27  
28  
39  
38  
37  
36  
35  
34  
33  
32  
9
8
330  
P2.0/A8  
P2.1/A9  
P0.0/AD0  
P0.1/AD1  
SW DIP-8  
74LS04  
P2.2/A10 P0.2/AD2  
P2.3/A11 P0.3/AD3  
P2.4/A12 P0.4/AD4  
P2.5/A13 P0.5/AD5  
P2.6/A14 P0.6/AD6  
P2.7/A15 P0.7/AD7  
330  
11  
13  
1
10  
74LS04  
1
6
2
7
3
8
4
9
5
12  
74LS04  
10  
11  
12  
13  
14  
15  
16  
17  
1
2
3
4
5
6
7
8
P3.0/RXD  
P3.1/TXD  
P3.2/INT0  
P3.3/INT1  
P3.4/T0  
P3.5/T1  
P3.6/WR  
P3.7/RD  
P1.0  
P1.1  
P1.2  
P1.3  
P1.4  
P1.5  
P1.6  
P1.7  
13  
12  
11  
1
R1IN  
R1OUT  
14  
2
T1OUT  
T1IN  
C+  
74LS04  
6
2
MAX232  
3
C28  
10u  
3
4
V-  
C1-  
C2+  
C2-  
74LS04  
10u  
4
30  
29  
19  
18  
ALE/PROG  
PSEN  
XTAL1  
XTAL2  
V+  
5
C29  
10u  
C26  
10u  
31  
9
EA/VPP  
RST  
VCC  
C27  
10u  
AT89C51  
33p  
11.059MHz  
C31  
Hình 4.11 – Kết nối với vi điều khiển  
Tải về để xem bản đầy đủ
pdf 41 trang baolam 23780 Free
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình hệ thống - Chương 4: Giao tiếp cống nối tiếp - Phạm Hùng Kim Khánh", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_lap_trinh_he_thong_chuong_4_giao_tiep_cong_noi_ti.pdf