Giáo trình Lập trình hệ thống - 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.
rang 106 Ví dụ lập trình điều khiển Modem như sau: Hình 4.13 – Giao tiếp và điều khiển Modem Chương trình nguồn: VERSION 5.00 Object = "{648A5603-2C6E-101B-82B6- 000000000014}#1.1#0"; "MSCOMM32.OCX" Object = "{F9043C88-F6F2-101A-A3C9- 08002B2F49FB}#1.2#0"; "COMDLG32.OCX" Begin VB.Form frmModem Caption = "Modem example" ClientHeight = 4065 ClientLeft = 60 ClientTop = 345 ClientWidth = 5925 LinkTopic = "Form1" ScaleHeight = 4065 ScaleWidth = 5925 StartUpPosition = 3 'Windows Default Begin VB.CommandButton cmdSave Caption = "Save" Height = 495 Left = 4320 TabIndex = 14 Top = 1320 Width = 1095 End Begin VB.TextBox txtReceive Height = 375 Left = 960 Tài liệu Lập trình hệ thống Chương 4 Phạm Hùng Kim Khánh Trang 107 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 Tài liệu Lập trình hệ thống Chương 4 Phạm Hùng Kim Khánh Trang 108 Width = 1215 End Begin VB.CommandButton cmdBrowse Caption = "Browse" Height = 495 Left = 4320 TabIndex = 1 Top = 120 Width = 1095 End Begin MSComDlg.CommonDialog diagSend Left = 4200 Top = 3120 _ExtentX = 847 _ExtentY = 847 _Version = 393216 End Begin VB.TextBox txtSend Height = 375 Left = 960 TabIndex = 0 Top = 360 Width = 3015 End Begin MSCommLib.MSComm MSComm1 Left = 5160 Top = 3000 _ExtentX = 1005 _ExtentY = 1005 _Version = 393216 DTREnable = -1 'True Handshaking = 2 NullDiscard = -1 'True RThreshold = 1 RTSEnable = -1 'True End Begin VB.Label Label3 Caption = "File receive:" Height = 375 Left = 0 TabIndex = 13 Top = 1320 Width = 855 End Begin VB.Label lblReceive Caption = "Receive file !!! Select file name." Tài liệu Lập trình hệ thống Chương 4 Phạm Hùng Kim Khánh Trang 109 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 Tài liệu Lập trình hệ thống Chương 4 Phạm Hùng Kim Khánh Trang 110 Private SendFlag As Boolean Private ReceiveFlag As Boolean Private FileReceive As Integer Private CRFlag As Boolean Private Sub cmdBrowse_Click() On Error GoTo Loi diagSend.FileName = "" diagSend.Filter = "All files(*.*)|*.*" diagSend.InitDir = App.Path diagSend.ShowOpen txtSend.Text = diagSend.FileName lblSize.Caption = Str(Round(FileLen(txtSend.Text) / 1024, 2)) + "KB" Exit Sub Loi: lblSize.Caption = "0 KB" txtSend.Text = "" End Sub Private Sub cmdDial_Click() If Not MSComm1.PortOpen Then MsgBox "Comm Port Closed. Open first!!!", vbOKOnly + vbCritical, "Error" ElseIf Trim(txtDial.Text) = "" Then MsgBox "Enter phone's number!!!", vbOKOnly + vbCritical, "Error" Else If cmdDial.Caption = "Dial" Then MSComm1.Output = "ATDT" & Trim(txtDial.Text) + vbCr cmdDial.Caption = "Hang up" lblStatus.Caption = "Dialing ..." Else MSComm1.Output = "ATH1" + vbCr cmdDial.Caption = "Dial" lblStatus.Caption = "Hang up" End If End If End Sub Private Sub cmdExit_Click() If MSComm1.PortOpen Then MSComm1.PortOpen = False End If End End Sub Tài liệu Lập trình hệ thống Chương 4 Phạm Hùng Kim Khánh Trang 111 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 Tài liệu Lập trình hệ thống Chương 4 Phạm Hùng Kim Khánh Trang 112 Loop While Not SendFlag FileNum = FreeFile Open Trim(txtSend.Text) For Input As #FileNum Do Input #FileNum, Buffer If Right(Buffer, 1) vbCr Then Buffer = Buffer + vbCrLf MSComm1.Output = Buffer Loop While Not EOF(FileNum) MSComm1.Output = "END FILE" Close #FileNum SendFlag = False End If End Sub Private Sub Form_Load() Connected = False SendFlag = False ReceiveFlag = False CRFlag = False End Sub Private Sub MSComm1_OnComm() Dim Buffer As String Dim Buffer1 As String Dim Buff As String Dim i As Integer Select Case MSComm1.CommEvent Case comEvRing lblStatus.Caption = "Ringing..." Case comEvCD If MSComm1.CDHolding Then lblStatus.Caption = "Connected" Connected = True Else lblStatus.Caption = "Disconnected" Connected = False End If Case comEvReceive Buffer = MSComm1.Input If InStr(Buffer, "SEND") Then Timer1.Enabled = True Exit Sub End If If InStr(Buffer, "RECEIVE") Then SendFlag = True Timer1.Enabled = False Tài liệu Lập trình hệ thống Chương 4 Phạm Hùng Kim Khánh Trang 113 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 Tài liệu Lập trình hệ thống Chương 4 Phạm Hùng Kim Khánh Trang 114 7. Mạng 485 Chuẩn RS232 dùng đường truyền không cân bằng vì các tín hiệu lấy chuẩn là GND chung nên dễ bị ảnh hưởng của nhiễu làm tốc độ và khoảng cách truyền bị giới hạn. Khi muốn tăng khoảng cách truyền, môt phương pháp có thể sử dụng là dùng 2 dây truyền vi sai vì lúc này 2 dây có cùng đặc tính nên sẽ loại trừ được nhiễu chung. Hai chuẩn được sử dụng là RS422 và RS485 nhưng thông thường sử dụng RS485. Điện áp vi sai yêu cầu phải lớn hơn 200mV. Nếu VAB > 200 mV thì tương ứng với logic 1 và VAB < -200 mV tương ứng với logic 0. Chuẩn RS485 sử dụng hai điện trở kết thúc là 120 Ω tại hai đầu xa nhất của đường truyền và sử dụng dây xoắn đôi. Hình 4.13 – Chuẩn giao tiếp RS422 Hình 4.14 – Chuẩn giao tiếp RS485 Các đặc tính kỹ thuật: Đặc tính RS422 RS485 Số thiết bị truyền 1 32 Số thiết bị nhận 10 32 Tài liệu Lập trình hệ thống Chương 4 Phạm Hùng Kim Khánh Trang 115 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: Hình 4.15 – Chuyển đổi từ RS323 sang RS485 và ngược lại RO 1 DI 4 RE 2DE 3 A 6 B 7 MAX485 120 120 VCC 1 2 3 4 5 6 7 8 CON8 R1IN 13 R 2I N 8 T1IN 11 T 2I N 10 C+ 1 C1- 3 C2+ 4 C2- 5V+ 2 V- 6 R1OUT 12 R 2O U T 9 T1OUT 14 T 2O U T 7 MAX2325 9 4 8 3 7 2 6 1 DB9 10u 10u 10u VCC 10u 10u RO 1 DI 4 RE 2 DE 3 A 6 B 7 MAX485
File đính kèm:
- giao_trinh_lap_trinh_he_thong_chuong_4_giao_tiep_cong_noi_ti.pdf