25/05/2018, 00:12

Giao tiếp với MODEM

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 ...

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.

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.

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