- Cửa sổ chương trình Visual Basic - Vùng thiết kế: Thiết kế giao diện của chương trình - Project Explorer: Hiển thị tất cả các Form và Module có trong chương trình - Properties Window:
Trang 1PHẦN D : LẬP TRÌNH CỔNG NỐI TIẾP
MỤC ĐÍCH THÍ NGHIỆM
Giúp sinh viên bằng thực nghiệm khảo sát các vấn đề chính sau đây :
- Lập trình trao đổi thơng tin qua cổng nối tiếp
- Lập trình điều khiển Modem
THIẾT BỊ SỬ DỤNG
1 Máy vi tính
2 Null Modem
3 Modem
4 Tổng đài
I Cơ bản về Visual Basic 6
- Khởi động Visual Basic: Start > All Programs > Microsoft Visual Studio 6.0 > Visual Basic 6.0
- Mở một Project mới: File > New Project
Trang 2Chọn Project là Standard EXE
- Cửa sổ chương trình Visual Basic
- Vùng thiết kế:
Thiết kế giao diện của chương trình
- Project Explorer:
Hiển thị tất cả các Form và Module có trong chương trình
- Properties Window:
Hiển thị và cho phép sửa đổi thuộc tính của các đối tượng
- Thanh công cụ:
Tạo các đối tượng cho Project:
Vùng thiết kế
Properties Window
Trang 3- Các thuộc tính cơ bản của các đối tượng trong VB6:
Name: tên của đối tượng, mỗi đối tượng phải có tên khác nhau
Caption: hiển thị nội dung trên cửa sổ thiết kế
TabIndex: thứ tự chuyển đến khi nhấn phím Tab
Font: chọn font hiển thị trên đối tượng
BackColor, ForeColor: chọn màu hiển thị
Value: giá trị của đối tượng (dùng cho Check box và Option để xác định trạng thái được chọn hay không chọn)
Text: nội dung chứa trong một Textbox
MultiLine: cho phép hiện nhiều dòng trên Textbox hay không
Enable: cho phép đối tượng hoạt động hay không
Duration: xác định thời gian Timer tràn (đơn vị là ms)
- Các sự kiện cơ bản của các đối tượng trên VB6:
Form_Load: xảy ra mỗi khi mở một form
Click: xảy ra khi thực hiện nhấn chuột trái trên đối tượng
Timer: xảy ra mỗi khi Timer tràn
Command Button
Option Check box
Frame
Timer
Trang 4II Các lệnh cơ bản trong Visual Basic 6
- Lệnh IF – THEN – ELSE:
Cấu trúc lệnh:
IF Điều_kiện_1 THEN
Công_việc_1
ELSEIF Điều_kiện_2 THEN
Công_việc_2
ELSEIF Điều_kiện_3 THEN
Công_việc_3
…
ELSE
Công_việc
Câu lệnh IF – THEN có thể bao gồm nhiều phát biểu ELSEIF hoặc không
có phát biểu nào
Ví dụ:
IF a > 10 THEN MsgBox “Lon hon 10”
ELSEIF a > 0 THEN MsgBox “Lon hon 0 va nho hon 10”
ELSE
MsgBox “Nho hon 0”
- Lệnh SELECT CASE:
Trong trường hợp có nhiều lựa chọn cho một biểu thức điều kiện, ta có thể thay bằng lệnh Select Case
Trang 5Cấu trúc:
SELECT CASE Biểu_thức_điều _kiện CASE Điều_kiện_1
Lệnh CASE Điều_kiện_2
Lệnh CASE Điều_kiện_3
Lệnh …
ELSE Điều_kiện
Lệnh
- Lệnh FOR:
FOR dùng để tạo vòng lặp xác định trước số lần lặp
Cấu trúc:
FOR Biến_đếm = Giá_trị_đầu TO Giá_trị_cuối STEP Bước_nhảy
Lệnh NEXT Biến_đếm
Ví dụ:
FOR i = 1 TO 100 STEP 2 Result = Result + 1
Nếu bỏ qua phát biểu STEP thì xem như bước nhảy là 1 và có thể yêu cầu kết thúc vòng lặp FOR bằng lệnh EXIT FOR
Trang 6- Lệnh DO:
Lệnh DO dùng để tạo vòng lặp vô tận và chỉ kết thúc khi điều kiện kiểm tra thoả mãn Lệnh DO có 2 dạng: kiểm tra điều kiện trước khi thực hiện vòng lăp và sau khi thực hiện vòng lặp
Cấu trúc:
DO
Lệnh LOOP WHILE Điều_kiện
Hay:
DO WHILE Điều_kiện
Lệnh LOOP
III Giao tiếp cổng nối tiếp dùng đối tượng MSComm
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:
- Đ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:
Trang 7Biểu tượng của MsComm và các thuộc tính cơ bản mô tả như sau:
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
Biểu tượng của MSComm
Trang 82 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à:
300 9600 (măc định) 56000
600 14400 188000
1200 19200 256000 P: kiểm tra chẵn lẻ, với các giá trị:
Giá trị Mô tả
O Odd (kiểm tra lẻ)
E Even (kiểm tra chẵn)
M Mark (luôn bằng 1)
S Space (luôn bằng 0)
N Không kiểm tra 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
Trang 9 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
MSComm1.InputLen = 0
If MSComm1.InBufferCount <> 0 Then
Trang 10InputString = 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
SThreshold:
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:
ComNone
ComXon/Xoff
ComRTS
ComRTSXon/Xoff
0
1
2 3
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
CommEvent:
Trả lại các lỗi truyền thông hay sự kiện xảy ra tại cổng nối tiếp
Các sự kiện:
ComEvSend
ComEvReceive
ComEvCTS
ComEvDSR
ComEvCD
ComEvRing
ComEvEOF
1
2
3
4
5
6
7
Đã truyền ký tự 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
Nhận ký tự kết thúc file
Trang 113 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
I KẾT NỐI TRỰC TIẾP
- Dùng Null Modem kết nối qua cổng COM của máy tính
- Dùng VB6 tạo giao diện sau:
Thêm đối tượng MSComm vào form với các thuộc tính:
Name = MSComm1
RTheshold = 1
CommPort = 1 (hay 2 tuỳ theo máy tính)
Chương trình cho Form1:
Private Sub cmdClear_Click()
txtReceive.Text = ""
End Sub
Textbox
Name = txtSend
MultiLine = True
Command Button Name = cmdExit Caption = Exit
Textbox
Name = txtReceive
MultiLine = True
Locked = True
Command Button
Name = cmdOpen
Caption = Open Port
Command Button Name = cmdClear Caption = Clear
Command Button Name = cmdSend Caption = Send
Trang 12Private Sub cmdExit_Click()
Unload Me
End Sub
Private Sub cmdOpen_Click()
MSComm1.PortOpen = Not MSComm1.PortOpen
If MSComm1.PortOpen Then
cmdOpen.Caption = "Close Port"
Else
cmdOpen.Caption = "Open Port"
End If
End Sub
Private Sub cmdSend_Click()
MSComm1.Output = txtSend.Text
End Sub
Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen Then MSComm1.PortOpen = False End Sub
Private Sub MSComm1_OnComm()
Dim t As String
Select Case MSComm1.CommEvent
Case comEvReceive
t = MSComm1.Input
txtReceive.Text = txtReceive.Text + t
End Select
End Sub
- Nhập một chuỗi vào Textbox Send và nhấn nút Send Quan sát dữ liệu nhần được ở máy thu
- Sửa đổi chương trình để thực hiện giao tiếp bằng cách bắt tay:
+ Máy tính truyền sẽ truyền chuỗi “START” để yêu cầu quá trình truyền
+ Máy tính nhận sau khi nhận được chuỗi “START’ sẽ gởi lại chuỗi
“OK” để bắt đầu quá trình
+ Máy tính truyền sau khi nhận chuỗi “OK” sẽ bắt đầu quá trình truyền
và kết thúc bằng chuỗi “STOP”
+ Máy tính nhận sau khi nhận được chuỗi “STOP” sẽ kết thúc quá trình
Trang 13II KẾT NỐI THÔNG QUA MODEM
- Kết nối Modem vào cổng COM
- Cắm dây điện thoại vào ngõ Line của Modem
- Dùng VB6 tạo giao diện sau:
Thêm đối tượng MSComm vào form với các thuộc tính:
Name = MSComm1
RTheshold = 1
Handshaking = 2 – RTS
RTSEnable = True
CommPort = 1 (hay 2 tuỳ theo máy tính)
Chương trình cho Form1:
Private Sub cmdClear_Click()
txtReceive.Text = ""
End Sub
Private Sub cmdCommand_Click()
If MSComm1.PortOpen Then
If Trim(txtCommand.Text) <> "" Then
MSComm1.Output = Trim(txtCommand.Text) +
vbCr
Else
MsgBox "Enter command"
End If
Else
Textbox
Name = txtSend
MultiLine = True
Command Button Name = cmdExit Caption = Exit
Textbox
Name = txtReceive
MultiLine = True
Locked = True
Command Button
Name = cmdOpen
Caption = Open Port
Command Button Name = cmdClear Caption = Clear
Command Button Name = cmdSend Caption = Send
Textbox
Name = txtCommand
Command Button Name = cmdCommand Caption = Command
Label Caption = Send:
Label Caption = Receive:
Label Caption = Enter command:
Trang 14MsgBox "Port Closed! Open Port"
End If
End Sub
Private Sub cmdExit_Click()
Unload Me
End Sub
Private Sub cmdOpen_Click()
MSComm1.PortOpen = Not MSComm1.PortOpen
If MSComm1.PortOpen Then
cmdOpen.Caption = "Close Port"
Else
cmdOpen.Caption = "Open Port"
connected = False
End If
End Sub
Private Sub cmdSend_Click()
MSComm1.Output = txtSend.Text
End Sub
Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen Then MSComm1.PortOpen = False End Sub
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
txtReceive.Text = txtReceive.Text + MSComm1.Input
End Select
End Sub
- Biên dịch chương trình và kết nối đến một máy tính khác
- Quan sát và ghi nhận các thông báo do Modem gởi đến máy tính
- Gởi lệnh cho Modem để thực hiện kết nối sau 5 hồi chuông
- Viết lại chương trình để hiển thị thông báo khi đã kết nối