Tài liệu 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

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
pdf 41 trang thamphan 27/12/2022 2700
Bạn đang xem 20 trang mẫu của tài liệu "Tài liệu 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:

  • pdftai_lieu_lap_trinh_he_thong_chuong_4_giao_tiep_cong_noi_tiep.pdf

Nội dung text: Tài liệu 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

  1. Tài liệu Lập trình hệ thống Chương 4 Tên Địa chỉ NgắtVị trí chứa địa chỉ COM1 3F8h 4 0000h:0400h COM2 2F8h 3 0000h:0402h COM3 3E8h 4 0000h:0404h COM4 2E8h 3 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 W THR Transmitter Holding Register (đệm truyền) 0 0 R RBR Receiver Buffer Register (đệm thu) 1 R/W BRDL Baud Rate Divisor Latch (số chia byte thấp) 0 R/W IER Interrupt Enable Register (cho phép ngắt) 1 1 R/W BRDH Số chia byte cao R IIR Interrupt Identification Register (nhận dạng ngắt) 2 W FCR FIFO Control Register 3 R/W LCR Line Control Register (điều khiển đường dây) 4 R/W MCR Modem Control Register (điều khiển MODEM) 5 R LSR Line Status Register (trạng thái đường dây) 6 R MSR Modem Status Register (trạng thái MODEM) 7 R/W Scratch Register (thanh ghi tạm) 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 1: không FIFO ngắt D2 D1 Ưu Tên Nguồn D2 – D0 bị xoá tiên khi 0 0 4 Đường Lỗi khung, thu đè, lỗi parity, gián đoạn Đọc LSR truyền khi thu 0 1 3 Đệm thu Đệm thu đầy Đọc RBR 1 0 2 Đệm phát Đệm phát rỗng Đọ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
  2. 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 00h 60h 2,400 00h 30h 4,800 00h 18h 9,600 00h 0Ch 19,200 00h 06h 38,400 00h 03h 57,600 00h 02h 115,200 00h 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 X 0 Không kiểm tra 0 0 1 Kiểm tra lẻ 0 1 1 Kiểm tra chẵn 1 0 1 Parity là mark 1 1 1 Parity là space Phạm Hùng Kim Khánh Trang 81
  3. 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 ; G•i byte cao Æ 000Ch: xác ••nh OUT DX,AL ; t•c •• truy•n 9600bps MOV DX,Com1+3 ; LCR = 0000 0011B MOV AL,03h ; DLAB = 0, SBCB = 0 Æ c•m Break OUT DX,AL ; PS = 000 Æ no parity ; STB = 0 Æ 1 stop bit ; WLS = 11 Æ 8 bit d• li•u MOV DX,Com1+4 ; Tác ••ng ••n DTR và RTS MOV AL,03h ; MCR = 0000 0011b Æ DTR=RTS = 1 OUT DX,AL ; Æ 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 IN AL,DX ; D7 – D0 xác ••nh các IRQi MOV Mask_int,AL ; =0: cho phép, =1: c•m AND AL,0EFh ; = 1110 1111b Æ cho phép IRQ4 OUT DX,AL ; Æ cho phép COM1 MOV AL,01h ; IER = 0000 0001b Æ cho phép MOV DX,Com1+1 ; ng•t khi RBR ••y OUT DX,AL 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
  4. 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: Thuộc tính Mô tả CommPort Số thứ tự cổng truyền thông Input Nhận ký tự từ bộ đệm Output Xuất ký tự ra cổng nối tiếp PortOpen Mở / đóng cổng Settings Xác định các tham số truyền Phạm Hùng Kim Khánh Trang 85
  5. 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
  6. 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 Giá trị Mô tả ComNone 0 Không băt tay (mặc định) ComXon/Xoff 1 Bắt tay phần mềm (Xon/Xoff) ComRTS 2 Bắt tay phần cứng (RTS/CTS) ComRTSXon/Xoff 3 Bắt tay phần cứng và phàn mềm ™ 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 ComEvCTS 3 Có thay đổi trên CTS (Clear To Send) ComEvDSR 4 Có thay đổi trên DSR (Data Set Ready) ComEvCD 5 Có thay đổi trên CD (Carrier Detect) ComEvRing 6 Phát hiện chuông ComEvEOF 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 ComFrame 1004 Lỗi khung ComOver 1006 Phần cứng không đọc ký tự trước khi gởi ký tự kế ComCDTO 1007 Carrier Detect Timeout ComRxOver 1008 Tràn bộ đệm nhận ComRxParity 1009 Lỗi parity ComTxFull 1010 Tràn bộ đệm truyền Phạm Hùng Kim Khánh Trang 89
  7. Tài liệu Lập trình hệ thống Chương 4 Begin VB.Form Form1 Caption = “Loopback Serial Port Example” ClientHeight = 3195 ClientLeft = 60 ClientTop = 345 ClientWidth = 4680 LinkTopic = “Form1” ScaleHeight = 3195 ScaleWidth = 4680 StartUpPosition = 3 ‘Windows Default Begin VB.CommandButton cmdExit Caption = “Exit” Height = 615 Left = 2640 TabIndex = 5 Top = 2160 Width = 1095 End Begin VB.CommandButton cmdSend Caption = “Send” Height = 615 Left = 1200 TabIndex = 4 Top = 2160 Width = 975 End Begin VB.TextBox txtReceive Height = 735 Left = 1320 Locked = -1 ‘True TabIndex = 3 Top = 1080 Width = 2535 End Begin VB.TextBox txtTransmit Height = 735 Left = 1320 TabIndex = 0 Top = 240 Width = 2535 End Begin MSCommLib.MSComm MSComm1 Left = 3960 Top = 240 _ExtentX = 1005 _ExtentY = 1005 Phạm Hùng Kim Khánh Trang 91
  8. 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: TxD_PC 1 6 2 13 12 7 R1IN R1OUT 3 14 11 RxD_PC 8 T1OUT T1IN 4 1 9 C25 C+ 5 6 MAX232 3 C28 V- C1- 10u DB9 10u 4 2 C2+ V+ 5 C29 C26 R2IN T2IN T2OUT C2-R2OUT 10u 10u VCC 8 7 9 10 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ề điện. Sơ đồ mạch cách ly mô tả như sau: VCC 1K TxD 6 1 5 VCC 4 2 68K DTR 4N35 1 4.7K 6 2 RxD_PC 7 3 TxD_PC 1 6 8 5 RxD 4 4.7K 9 2 4 5 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
  9. Tài liệu Lập trình hệ thống Chương 4 Chương trình nguồn cho vi điều khiển AT89C51: MOV TMOD,#20h MOV SCON,#52h ; Truyền 8 bit dữ liệu, no parity MOV TH1,#(-3) ; Tốc độ truyền 9600 bps MOV TL1,#(-3) SETB TR1 Receive: JNB RI,Transmit ; Có dữ liệu hay không CLR RI MOV A,SBUF ; Nếu có thì xuất ra LED MOV P1,A Transmit: JNB TI,Receive ; Đã truyền xong chưa CLR TI MOV A,P2 ; Nếu xong thì truyền trạng thái MOV SBUF,A ; của công tăc SW DIP-8 JMP Receive Giao diện của chương trình trên máy tính: Hình 4.12 – Chương trình giao tiếp với vi điều khiển 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 95
  10. Tài liệu Lập trình hệ thống Chương 4 TabIndex = 13 Top = 1560 Width = 1575 End Begin VB.CheckBox chkSW Height = 375 Index = 2 Left = 1800 TabIndex = 12 Top = 1080 Width = 1575 End Begin VB.CheckBox chkSW Height = 375 Index = 1 Left = 1800 TabIndex = 11 Top = 600 Width = 1575 End Begin VB.CheckBox chkSW Height = 375 Index = 0 Left = 1800 TabIndex = 10 Top = 120 Width = 1575 End Begin VB.CommandButton cmdExit Caption = "Exit" Height = 495 Left = 1680 TabIndex = 9 Top = 3960 Width = 975 End Begin MSCommLib.MSComm MSComm1 Left = 3360 Top = 3960 _ExtentX = 1005 _ExtentY = 1005 _Version = 393216 DTREnable = -1 'True RThreshold = 1 End Begin VB.CommandButton cmdSend Caption = "Send" Phạm Hùng Kim Khánh Trang 97
  11. Tài liệu Lập trình hệ thống Chương 4 BackStyle = 0 'Transparent Caption = "LED3" Height = 375 Index = 3 Left = 240 TabIndex = 3 Top = 1560 Width = 975 End Begin VB.Label lblLED BackStyle = 0 'Transparent Caption = "LED2" Height = 375 Index = 2 Left = 240 TabIndex = 2 Top = 1080 Width = 975 End Begin VB.Label lblLED BackStyle = 0 'Transparent Caption = "LED1" Height = 375 Index = 1 Left = 240 TabIndex = 1 Top = 600 Width = 975 End Begin VB.Label lblLED BackStyle = 0 'Transparent Caption = "LED0" Height = 375 Index = 0 Left = 240 TabIndex = 0 Top = 120 Width = 975 End Begin VB.Shape shpLED BorderColor = &H000000FF& FillColor = &H000000FF& FillStyle = 0 'Solid Height = 375 Index = 7 Left = 840 Shape = 3 'Circle Phạm Hùng Kim Khánh Trang 99
  12. Tài liệu Lập trình hệ thống Chương 4 Begin VB.Shape shpLED BorderColor = &H000000FF& FillColor = &H000000FF& FillStyle = 0 'Solid Height = 375 Index = 2 Left = 840 Shape = 3 'Circle Top = 1080 Width = 375 End Begin VB.Shape shpLED BorderColor = &H000000FF& FillColor = &H000000FF& FillStyle = 0 'Solid Height = 375 Index = 1 Left = 840 Shape = 3 'Circle Top = 600 Width = 375 End Begin VB.Shape shpLED BorderColor = &H000000FF& FillColor = &H000000FF& FillStyle = 0 'Solid Height = 375 Index = 0 Left = 840 Shape = 3 'Circle Top = 120 Width = 375 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() If MSComm1.PortOpen Then MSComm1.PortOpen = False End If End End Sub Private Sub cmdSend_Click() Phạm Hùng Kim Khánh Trang 101
  13. Tài liệu Lập trình hệ thống Chương 4 - Bắt tay phần cứng: máy tính muốn truyền dữ liệu thì cho RTS = 1 và chờ Modem trả lời bằng tín hiệu CTS. Ngược lại, Modem muốn truyền dữ liệu thì cho DSR = 1 và chờ tín hiệu DTR từ máy tính. - Bắt tay phần mềm: dùng ký tự Xon (Ctrl-S) và Xoff (Ctrl-Q) để bắt đầu truyền hay kết thúc truyền. Các giao thức truyền dữ liệu trên Modem: - XModem: chia thành khối 128 byte, mỗi khối chèn thêm CRC 4 byte. - YModem: khối 1024 byte. - ZModem: khối có kích thước thay đổi tuỳ theo đường truyền. Quy tắc truyền lệnh trên Modem: - Mỗi dòng lệnh của modem bắt đầu bằng ký tự AT, ngoại trừ lệnh A/ và +++. - Dòng lệnh có thể chứa nhiều lệnh. - Kết thúc lệnh bằng ký tự Enter (mã ASCII là 13) ngoại trừ lệnh A/ và +++. - Dòng lệnh cuối cùng được lưu trong modem. Có thể dùng lệnh A/ để thực hiện lại lệnh này. - Thông báo kết quả thực hiện lệnh của modem có thể ở dạng từ chữ hay số( giá trị mặc định là chữ). Có thể sử dụng lệnh V để lựa chọn dạng thông báo là chữ hay số. - Để hoạt động đúng, modem cần có các thông số xác định. Nếu không có sự thay đổi cần thiết, modem hoạt động theo giá trị mặc định(default). Nếu thông số trong lệnh bị bỏ qua, giá trị thông số mặc định là 0. 6.2. Các lệnh cơ bản của Modem Lệnh Mô tả +++ Chuyển Modem sang chế độ lệnh A/ Lặp lại lệnh trước A Cho phép kết nối và phát tín hiệu sóng mang. Modem sẽ báo tín hiệu CONNECT nếu thu được tín hiêu sóng mang từ modem đầu cuối. Nếu không thu được sóng mang, modem sẽ gác máy và thông báo NO CARRIER DPn Quay số điện thoại n dạng xung DTn Quay số điện thoại n dạng tone H0 Gác máy H1 Nhấc máy O0 Chuyển về chế độ dữ liệu O1 Chế độ điều chỉnh Modem Q0 Cho phép Modem gởi thông báo đến DTE (mặc định) Q1 Cấm Modem gởi thông báo Q2 Gởi thông báo khi Modem chủ động kết nối, không gởi khi Modem nhận cuộc gọi V0 Nhận thông báo dạng số Phạm Hùng Kim Khánh Trang 103
  14. Tài liệu Lập trình hệ thống Chương 4 Thanh ghi S10: xác định thời gian cho phép tín hiệu sóng mang có thể biến mất trong chốc lát nào đó mà không cắt cuộc nối. Ổn định trong khoảng 100-25500ms, giá trị mặc nhiên tùy vào khả năng chống nhiễu của từng modem, thường là 700ms. Thanh ghi S11: xác định tốc độ quay số khi sử dụng phương pháp quay số tone, giá trị mặc nhiên tùy vào modem, thường vào khoảng 70ms. Thanh ghi S12: xác định thời gian an toàn khi truy nhập vào ký tự thoát (+++). Nếu giá trị nhỏ quá có thể nhập không kịp, giá trị lớn quá so với tốc độ nhập cũng không thể thoát được. 6.4. Các thông báo của Modem Dạng ký tự Dạng số Ý nghĩa OK 0 Lệnh thành công CONNECT 1 Kết nối 300 bps RING 2 Có tín hiệu chuông NO CARRIER 3 Không có sóng mang ERROR 4 Lỗi: nhận lệnh không giá trị, sai kiểm tra, hàng lệnh quá dài CONNECT 1200 5 Kết nối 1200bps NO DIAL TONE 6 Không có âm hiệu mời quay số BUSY 7 Máy bận NO ANSWER 8 Không có tín hiệu trả lời CONNECT 2400 10 Kết nối 2400bps CONNECT 4800 11 Kết nối 4800bps CONNECT 9600 12 Kết nối 9600bps CONNECT 14400 13 Kết nối 14400bps CONNECT 19200 14 Kết nối 19200bps CONNECT 16800 15 Kết nối 16800bps CONNECT 57600 18 Kết nối 57600bps CONNECT 7200 24 Kết nối 7200bps CONNECT 12000 25 Kết nối 12000bps CONNECT 28800 32 Kết nối 28800bps CONNECT 115200 33 Kết nối 115200bps CARRIER 300 40 Phát hiện sóng mang CARRIER 9600 50 Phát hiện sóng mang CARRIER 28800 58 Phát hiện sóng mang Phạm Hùng Kim Khánh Trang 105
  15. Tài liệu Lập trình hệ thống Chương 4 TabIndex = 12 Top = 1320 Width = 3015 End Begin VB.Timer Timer1 Enabled = 0 'False Interval = 1000 Left = 4920 Top = 2400 End Begin VB.CommandButton cmdExit Caption = "Exit" Height = 495 Left = 4560 TabIndex = 10 Top = 2880 Width = 975 End Begin VB.TextBox txtDial Height = 375 Left = 960 TabIndex = 7 Top = 2400 Width = 2895 End Begin VB.CommandButton cmdDial Caption = "Dial" Height = 495 Left = 1680 TabIndex = 5 Top = 3000 Width = 1095 End Begin VB.CommandButton cmdSend Caption = "Send" Height = 495 Left = 4320 TabIndex = 4 Top = 720 Width = 1095 End Begin VB.CommandButton cmdOpen Caption = "Open Port" Height = 495 Left = 240 TabIndex = 3 Top = 3000 Phạm Hùng Kim Khánh Trang 107
  16. Tài liệu Lập trình hệ thống Chương 4 ForeColor = &H000000FF& Height = 375 Left = 840 TabIndex = 11 Top = 1920 Visible = 0 'False Width = 2895 End Begin VB.Label lblStatus Caption = "Disconnected" Height = 375 Left = 120 TabIndex = 9 Top = 3720 Width = 5775 End Begin VB.Label Label2 Caption = "Dial:" Height = 375 Left = 120 TabIndex = 8 Top = 2400 Width = 735 End Begin VB.Label Label1 Caption = "File send:" Height = 375 Left = 120 TabIndex = 6 Top = 360 Width = 735 End Begin VB.Label lblSize ForeColor = &H00FF0000& Height = 375 Left = 960 TabIndex = 2 Top = 840 Width = 1815 End End Attribute VB_Name = "frmModem" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Private Connected As Boolean Phạm Hùng Kim Khánh Trang 109
  17. Tài liệu Lập trình hệ thống Chương 4 Private Sub cmdOpen_Click() MSComm1.PortOpen = Not MSComm1.PortOpen If MSComm1.PortOpen Then cmdOpen.Caption = "Close Port" MSComm1.Output = "ATS0=5" + vbCr Call Form_Load Else cmdOpen.Caption = "Open Port" lblStatus.Caption = "Disconnected" End If End Sub Private Sub cmdSave_Click() FileReceive = FreeFile ReceiveFlag = True Timer1.Enabled = False Do diagSend.FileName = "" diagSend.ShowSave If Trim(diagSend.FileName) = "" Then MsgBox "File name error!!", vbCritical + vbOKOnly, "Error" End If Loop While Trim(diagSend.FileName) = "" txtReceive.Text = diagSend.FileName MSComm1.Output = "RECEIVE" + vbCr Open Trim(txtReceive.Text) For Output As #FileReceive End Sub Private Sub cmdSend_Click() Dim FileNum As Integer Dim Buffer As String If Not MSComm1.PortOpen Then MsgBox "Comm Port Closed. Open first!!!", vbOKOnly + vbCritical, "Error" ElseIf Not Connected Then MsgBox "Not connected!!!", vbOKOnly + vbCritical, "Error" ElseIf Trim(txtSend.Text) = "" Then MsgBox "Select a file to send!!!", vbOKOnly + vbCritical, "Error" Else MSComm1.Output = "SEND" + vbCr Do DoEvents Phạm Hùng Kim Khánh Trang 111
  18. Tài liệu Lập trình hệ thống Chương 4 Buffer = "" Exit Sub End If If InStr(Buffer, "CONNECT") Then Connected = True lblStatus.Caption = "Connected" Exit Sub End If If ReceiveFlag Then Buffer1 = "" For i = 1 To Len(Buffer) Buff = Mid$(Buffer, i, 1) If Buff = Chr$(13) Then CRFlag = True Buff = "" ElseIf Buff = Chr$(10) Then CRFlag = False Buff = "" If Not CRFlag Then Buffer1 = Buffer1 + Buff End If Next i Print #FileReceive, Buffer1 End If If InStr(Buffer, "END FILE") Then Close #FileReceive Call Form_Load End If Case comEvEOF lblStatus = "Disconnected" Connected = False End Select End Sub Private Sub Timer1_Timer() lblReceive.Visible = Not lblReceive.Visible End Sub Private Sub txtSend_LostFocus() On Error GoTo Loi lblSize.Caption = Str(Round(FileLen(txtSend.Text) / 1024, 2)) + "KB" Exit Sub Loi: lblSize.Caption = "0 KB" txtSend.Text = "" End Sub Phạm Hùng Kim Khánh Trang 113
  19. Tài liệu Lập trình hệ thống Chương 4 Chiều dài cable cực đại 1200m 1200m Tốc độ truyền cực đại (từ 12 – 1200m) 10Mps – 100Kbps 10Mps – 100Kbps Điện áp cực đại tại ngõ ra thiết bị truyền -0.25V ÷ 6V -7V ÷ 12V Điện áp ngõ vào thiết bị nhận -10V ÷ 10V -7V ÷ 12V Đối với chuẩn RS232, khoảng cách truyền không cho phép đi xa nên khi muốn thực hiện truyền ở khoảng cách xa thì phải chuyển từ RS232 sang chuẩn RS485 để truyền đi và sau đó chuyển từ RS485 sang RS232 để máy tính có thể nhận dạng được. Sơ đồ mạch chuyển đổi từ RS232 sang RS485 và ngược lại mô tả như sau: 1 2 3 1 4 6 120 4 6 DI A 7 5 2 13 12 3 B 6 7 R1IN R1OUT VCC 2 DE 1 7 3 14 11 RE RO 8 8 T1OUT T1IN 4 1 MAX485 9 C+ CON8 5 6 MAX232 3 V- C1- 10u DB9 10u 4 6 4 2 C2+ 7 A DI V+ 5 B 3 R2IN T2IN T2OUT C2-R2OUT 10u 1 DE 2 120 10u RO RE VCC 8 7 9 10 MAX485 10u Hình 4.15 – Chuyển đổi từ RS323 sang RS485 và ngược lại Phạm Hùng Kim Khánh Trang 115