Bài 12 Giao Tiếp Với MODEM

Giao tiếp

Quá trình trao đổi dữ liệu giữa máy tính và Modem được thực hiện theo cơ chế bắt tay phần cứng hay phần mềm.
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.

Các lệnh cơ bản của Modem

Các thanh ghi thông dụng trên modem

Thanh ghi S0: xác định số hồi chuông nhận được mà sau đó modem sẽ trả lời một cách tự động. Giá trị trong thanh ghi này có thể thay đổi trong khoảng từ 0-255. mặc định giá trị là 0 (không trả lời).
Thanh ghi S1: Thanh ghi S1 chỉ có tác dụng khi thanh ghi S0 khác 0, dùng để đếm số hồi chuông thu được.
Thanh ghi S2: xác định giá trị thập phân của các ký tự (mã ASSCII) được dùng làm ký tự thoát, Giá trị mặc định là 43(+)
Thanh ghi S3: xác định ký tự được dùng để kết thúc một dòng lệnh, mặc nhiên là 13 (tương ứng là Enter)
Thanh ghi S4: xác định ký tự xuống dòng sau ký tự kết thúc, giá trị mặc nhiên là 10 (line feed)
Thanh ghi S5: xác định phím xoá lui, giá trị mặc nhiên là 8 (backspace)
Thanh ghi S6: xác định thời gian đợi sau khi truy cập đường điện thoại và trước khi tiến hành quoay digit đầu tiên trong một lệnh quay số. Ðây là thời gian trì hoãn cho phép để dial tone cung cấp từ đường truyền. Giá trị mặc nhiên và tối thiểu là 2s.
Thanh ghi S7: xác định thời gian mà modem đợi tín hiệu sóng mang trước khi gác máy. Giá trị mặc định là 30s.
Thanh ghi S8: xác định thời gian tạm dừng cho mỗi dấu phẩy ',' trong chuỗi lệnh quay số. Giá trị mặc định là 2s
Thanh ghi S9: xác định thời gian mà tín hiệu sóng mang phải hiện diện để modem có thể nhận biết được, giá trị mặc định là 600ms. Giá trị này nếu quá lớn sẽ gây lỗi trong dữ liệu truyền.
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.

Các thông báo của Modem

Lập trình điều khiển Modem như sau:

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
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
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."
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 
Private SendFlag As Boolean 
Private FileReceive As Integer 
Private CRFlag As Boolean 
Private Sub cmdBrowse_Click()
 On Error GoTo Loi 
Private ReceiveFlag As Boolean 
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
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 
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
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

0 Comment:

Đăng nhận xét

Thank you for your comments!