Professional Documents
Culture Documents
Module lập trình điều khiển hệ thống cung cấp các kiến thức về: Cấu trúc vật
lý và giao tiếp của các cổng LPT, COM, USB, cổng trò chơi (Game), card âm thanh
và một số card mở rộng khác; Sử dụng các điều khiển truyền thông nối tiếp, lớp
SerialPort, thư viện DLL trong VB, C++ hoặc C# để lập trình cho các cổng giao
tiếp; Một số thiết bị ngoại vi cơ bản.
Cuốn đề cương này được biên soạn dựa trên khung chương trình module
“Lập trình điều khiển hệ thống” thuộc chương trình đào tạo theo định hướng nghề
nghiệp trong khuôn khổ dự án Hà Lan.
Cuốn đề cương này chứa nội dung của 29 bài học theo đúng trình tự và mục
tiêu thiết kế của chương trình.
MỤC LỤC
LÝ THUYẾT
- Giao diện song song LPT: cổng LPT được thiết kế với mục đích chủ yếu là
ghép nối với máy in và để xuất dữ liệu in ấn cũng như điều khiển máy in. Tuy nhiên
với khả năng ghép nối và điều khiển lập trình, cổng này cũng có thể được sử dụng
trong ghép nối và điều khiển các thiết bị khác. Mặc dù là cổng song song nhưng tốc
độ điều khiển, truyền dữ liệu trên cổng này cũng không cao, khó khăn trong giao
tiếp vật lý cũng như lập trình điều khiển. Trong thực tế ít được dùng để ghép nối các
thiết bị khác.
- Giao diện USB: đây là chuẩn truyền thông nối tiếp cho phép truyền với tốc
độ cao và có khả năng tương thích tốt với nhiều loại thiết bị. Cổng này hiện nay
đang được sử dụng khá rộng rãi trong việc ghép nối và điều khiển các thiết bị từ
máy tính.
Cổng này có một số ưu điểm nổi trội:
+ Tốc độ cao
+ Giao tiếp đơn giản
+ Dễ tương thích
+ Hỗ trợ nguồn 5V công suất nhỏ
- Một số giao diện khác: giao diện GAME (thường dùng ghép nối cần điều
khiển để điều khiển chương trình trò chơi trên máy tính), các cổng vào ra trên Card
âm thanh, các khe cắm mở rộng (ISA, PCI, ...).
Phần biểu diễn các số liệu, trạng thái của thiết bị trên giao diện nên thiết kế
sao có sát với các thiết bị thể hiện trên thiết bị thực như các đèn báo, LED 7 thanh,
đồng số, đồng hồ kim, thậm chí là sự chuyển động của các thành phần của thiết bị
thực,... Để thực hiện được yêu cầu này, thông thường phần mềm điều khiển cần có
phần mô phỏng các thiết bị thực và hoạt động của nó.
Phần công cụ điều khiển nên bố trí các nút bấm, cần gạt, núm xoay... ở
những vị trí cũng như có hình dạng tương tự như trên bàn điều khiển của máy (nếu
có). Các điều khiển dạng này thường không có sẵn trong bộ công cụ chuẩn của các
ngôn ngữ hay môi trường phát triển phần mềm. Người lập trình cần thiết kế bổ
sung.
1.4. Lập trình điều khiển thông qua các cổng
Tùy nhu cầu và khả năng ghép nối của thiết bị cần điều khiển với máy tính
mà phần mềm có sự lựa chọn và lập trình truyền thông trên các cổng tươong ứng.
Nói chung, với mỗi cổng lựa chọn cần đảm bảo thực hiện được các hoạt động gửi
và nhận dữ liệu chính xác; phân tích và tổng hợp được gói tin theo đúng định dạng
yêu cầu của thiết bị và cổng truyền thông.
Với các cổng có hỗ trợ sẵn giao thức truyền thông, việc lập trình trở lên đơn
giản hơn, chỉ cần xử lý dữ liệu để đáp ứng được yêu cầu điều khiển của thiết bị
được điều khiển. Những cổng không hỗ trợ sẵn giao thức truyền thông, việc lập
trình truyền thông qua các cổng này cẩn thiết phải bổ sung giao thức để đảm bảo
truyền đúng dữ liệu (phát hiện, sửa sai) và điều khiển được lưu lượng cũng như tốc
độ dữ liệu được truyền.
1.5. Công cụ lập trình điều khiển
Để lập trình điều khiển các thiết bị từ máy tính ta có thể sử dụng nhiều ngôn
ngữ khác nhau tùy thuộc yêu cầu, môi trường làm việc, cổng truyền thông được sử
dụng. Một số ngôn ngữ lập trình được sử dụng phổ biến hiện nay có hỗ trợ để lập
trình ghép nối điều khiển thiết bị từ máy tính như: Visual C, C++, Visual Basic 6.0,
.Net, ....
Ngôn ngữ hỗ trợ mạnh trong lập trình can thiệp sâu đến các lớp thiết bị và
phù hợp cho lập trình điều khiển thiết bị trên môi trường Window là C++. Tuy
nhiên ngôn ngữ lập trình Visual Basic 6.0 cũng là một công cụ cho phép thực hiện
các công việc này khá tốt. Đặc biệt là thuận tiện trong thiết kế giao diện và viết mã
điều khiển.
Các biểu mẫu (Form) - khối xây dựng các chương trình Visual basic - xuất
hiện trong cửa sổ form. Hộp công cụ để thêm các điều khiển vào các biểu mẫu của
đề án. Project explorer hiển thị các đề án mà bạn đang làm cũng như các thành phần
của các đề án. Bạn duyệt và cài đặt các thuộc tính của điều khiển, biểu mẫu và
module trong cửa sổ property. Cuối cùng, bạn bố trí và xem xét một hoặc nhiều
biểu mẫu trên màn hình thông qua cửa sổ form layout.
2.1.2. Thêm và xoá các thanh công cụ trong IDE của Visual basic
Thanh công cụ là tập hợp các nút bấm mang biểu tượng chứa trong một
thanh thường đặt dưới thanh menu. Các nút này đảm nhận các chức năng thông
dụng trong cấu trúc menu của Visual basic. Thanh công cụ rất hửu ích, thay vì phải
lần lượt chọn qua menu và menu con, ta nhấn một nút bấm nào đó trong thanh công
cụ để gọi một chức năng tương tự trên menu.
Sử dụng thanh công cụ debug: Thanh công cụ debug dùng để kiểm tra
chương trình và giải quyết các lỗi có thể xảy ra. Khi gỡ rối chương trình, ta làm một
số việc như chạy từng dòng lệnh chương trình, kiểm tra giá trị các biến, và dừng
chương trình tại một điểm nghi ngờ hoặc dưới những điều kiện nào đó.
Sử dụng thanh công cụ Edit: Thanh công cụ Edit được dùng để viết
chương trình trong cửa sổ code. Các tính năng của thanh công cụ Edit tương tự như
các tính năng khác ở menu edit. Bạn có thể Cut, Paste văn bản...
Một tính năng lý thú của IDE là thanh công cụ Edit dùng tính năng Coplete
Word, tự động hoàn tất từ khoá. Tính năng Complete Word rất hữu ích để tránh các
lỗi cú pháp.
Sử dụng thanh công cụ Form Editor: Thanh công cụ form editor dùng để
kéo giãn, di chuyển và sắp xếp các điều khiển trên biểu mẫu. Thanh công cụ Form
editor có các tính năng như menu Format.
Sử dụng thanh công cụ chuẩn(Standard): Là thanh công cụ trọng yếu
trong IDE. Thanh công cụ chuẩn cung cấp nhiều tính năng trong menu file, Project,
Debug, và Run.
2.1.3. Thêm các điều khiển vào hộp công cụ
Hộp công cụ là bảng chứa các điều khiển và ta thiết kế giao diện người sử
dụng bằng cách chọn các điều khiển từ hộp công cụ và đưa chúng vào các biểu mẫu.
Một số điều khiển có sẵn trong Visual basic và không thể gỡ bỏ khỏi hộp
công cụ. Một số khác nằm bên ngoài Visual basicvà chứa trong các tập tin mà có
phần mở rộng là. ocx. Các điều khiển này có thể được thêm vào hoặc gỡ bỏ khỏi
thanh công cụ.
2.1.4. Định hướng thông qua cửa sổ form và code
Nếu điều khiển là những khối bê tông mà ta tập hợp trong ứng dụng thì biểu
mẫu là nền móng để ta xây dựng các khối này.
Các biểu mẫu chứa trong cửa sổ Thiết kế biểu mẫu. Ta sẽ làm việc trong cửa
sổ này để thêm các điều khiển vào biểu mẫu.
Đối với từng cửa sổ thiết kế mẫu, ta cũng có thể mở cửa sổ code. Cửa sổ
code là nơi ta viết các đoạn chương trình chạy bên dưới biểu mẫu. Ta có thể mở cửa
sổ code bằng cách nhấn đúp lên biểu mẫu hoặc điều khiển, hoặc chọn code từ menu.
2.1.5. Quản lý ứng dụng với project explorer
Project explorer trong Visual basic giúp quản lý và định hướng nhiều đề án.
Visual basic cho phép tổ chức nhiều đề án trong một nhóm gọi là project
group. Ta có thể lưu tập hợp các đề án trong Visual basic thành một tập tin nhóm đề
án. Các tập tin này có phần mở rộng là.vbg.
2.1.6. Cửa sổ properties
Mỗi thuộc tính có một hoặc nhiều giá trị. Cửa sổ properties giúp bạn xem sửa
đổi và điều khiển các thuộc tính của các điều khiển ActivateX trong chương trình.
2.1.7. Hiển thị IDE
Ta có thể xem IDE của Visual basic bằng 2 cách: MDI hoặc SDI. Hiển thị
kiểu MDI(Multiple document interface) cho phép trình bày tất cả các cửa sổ thành
phần trong IDE như là các cửa sổ con chứa trong một cửa sổ lớn.
Trái lại đối với hiện thị SDI(single document interface), các cửa sổ thành
phần hiển thị một cách độc lập với nhau. Không có một cửa sổ chính để chứa và
thống nhất các thành phần.
Chuyển đổi từ hiển thị MDI sang SDI
- Chọn Tools\option\
- Trên tang Advance, chọn hộp đánh dấu SDI development Enviroment;
nhấn OK. IDE của Visual basic sẽ định lại cấu hình cho hiển thị SDI trong lần khởi
động tiếp sau của Visual basic.
- Nhấn OK, thoát và khởi động lại Visual basic
2.1.8. Trợ giúp
Không những làm chủ ngôn ngữ lập trình Visual basic, bạn cũng cần phải sử
dụng thuần thục môi trường Visual basic cũng như hiểu các thông điệp mà Visual
basic gửi ra. Microsoft cung cấp một trong những hệ thống trợ giúp tốt nhất cho các
công cụ phát triển ứng dụng.
Trợ giúp nhạy với ngữ cảnh
Tại một vị trí bất kỳ trong Visual basic, bạn nhấn phím F1, nút trợ giúp. Nó
sẽ kích hoạt hệ thống trợ giúp của Visual basic, nơi có thể giải thích hoặc đưa ra
những lời khuyên, cũng như các đoạn chương trình mẫu.
Visual basic có hệ thống trợ giúp là hệ thông thư viện MSDN được sử dụng
rộng rãi cho các công cụ phát triển của Microsoft để cung cấp truy cập đến sổ tay
hướng dẫn sử dụng sản phẩm trực tuyến.
như biểu mẫu(form), khung(frame), gay hộp ảnh (picture box) cũng là một đối
tượng.
VB 6 hỗ trợ một cách lập trình tương đối mới, lập trình hướng đối tượng
(Object Oriented Programming).
Trong lập trình cổ điển, ta có kiểu lập trình theo cấu trúc. Nếu như ứng dụng
được thiết kế để giải quyết một vấn đề lớn, thì lập trình viên có thể chia thành nhiều
vấn đề nhỏ và viết các đoạn chương trình nhỏ để giải quyết riêng từng cái.
Với lập trình hướng đối tượng, lập trình viên sẽ chia nhỏ vấn đề cần giải
quyết hành các đối tượng. Từng đối tượng sẽ có đời sống riêng của nó. Nó có các
đặc điểm mà ta gọi là thuọcc tính và những chức năng riêng biệt mà ta gọi là
phương thức.
Lập trình viên cần đưa ra các thuộc tính và phơưng thức mà các đối tượng
cần thể hiện.
Thuộc tính
Nói một cách đơn giản, thuộc tính mô tả đối tượng.
Mỗi đối tượng cộng đều có một bộ thuộc tính mô tả đối tượng. Biểu mẫu và
điều khiển đều có thuộc tính. Thậm chí màn hình và máy in là những đối tượng chỉ
cho phép can thiệp lúc thi hành cũng có thuộc tính.
Mặc dù mỗi đối tượng có những bộ thuộc tính khác nhau, nhưng trong đó
vẫn còn một số thuộc tính thông dụng cho hầu hết các điều khiển.(bạn có thể xem
toàn bộ thuộc tính của một điều khiển bằng cách chọn vào điều khiển và mở cửa
sổ PROPERTIES trong Visual Basic).
Các thuộc tính thông dụng:
Một thuộc tính quan trọng khác là BorderStyle, quyết định các thành phần
của cửa sổ (như thanh tiêu đề, nút phóng to thu nhỏ…) mà một biểu mẫu sẽ có
Bảng sau đây liệt kê 6 giá trị của thuộc tính này.
Phương thức
Là những đoạn chương trình chứa trong điều khiển, cho điều khiển biết cách
thức để thực hiện một công việc nào đó, chảng hạn dời điều khiển đến một vị trí
mới trên biểu mẫu. Tương tự thuộc tính, mỗi điều khiển có những phương thức
khác nhau, nhưng vẫn có một số phương thức rất thông dụng cho hầu hết các điều
khiển..
Các phương thức thông dụng
Sự kiện
Nếu như thuộc tính mô tả đối tượng, phương thức chỉ ra cách thức đối tượng
hành động thì sự kiện là những phản ưúng của đối tượng.
Tương tự thuộc tính và phương thức, mỗi điều khiển có những bộ sự kiện
rất thông dụng với hầu hết các điều khiển. Các sự kiện này xảy ra thường là kết quả
của một hành động nào đó, như là di chuyển chuột, nhấn nút bàn phím, hiặc gõ vào
hộp văn bản. kiểu sự kiện này được gọi là sự kiện khởi tạo bởi người sử dụng, và ta
sẽ phải lập trình cho chúng.
Các sự kiện thông dụng
c. thuộc tính
‘xuất hiện
frmMyForm.Visible =True
‘Biến mất
frmMyForm.Visible =False
d. phương thức
‘xuất hiện
frmMyForm.Show
‘Biến mất
frmMyForm.Hide
Thuộc tính Caption được đánh dấu, nghĩa là ta có thể sửa đổi thuộc tính này.
Từng thuộc tính có một giá trị mặc định. ta có thể sửa đổi bằng tay trong lúc
thiết kế, hoặc bằng chương trình trong lúc thi hành.
Một biểu mẫu có khoảng 40 thuộc tính được hiển thị trong lúc thiết kế,
nhưng ta có thể truy cập một số thuộc tính khác vào trong lúc thi hành.
Ta có thẻ xem toàn bộ thuộc tính xắp xếp theo thứ tự bảng chữ cái bằng cách
chọn vào tab Alphabetic, hoặc xem theo từng nhóm bằng cách chọn vào tab
Categozized.
Ta có thể mở cửa sổ Properties bằng nhiều cách:
a. nhấn chuộtvào biểu mẫu để chpnj nó như một đối tượng hiện hành, nhấn
phím F4 để hiển thị cửa sổ Properties
b. Hoặc là từ menu_View, chọn Properties
c. hoặc là nhấn nút phải chuột lên biểu mẫu, ta sẽ thấy một menu hiển thị
chọn Properties.
Để làm việc với cửa sổ này ta dùng menu nhạy với ngữ cảnh. menu này xuất
hiện khi ta nhấn nút phải chuột vào một tệp tin trong cửa sổ. Khi đó, ta có thể:
a. xem một tệp tin dưới dạng thiết kế biểu mẫu hoặc chương trình
b. xem thuộc tính của tệp tin
c. Thêm một biểu mẫu hoặc module vào đề án
d. Lưu tệp tin hiện hành
e. Xoá một tệp tin khỏi đề án
f. in tệp tin
g. ghi hoặc thả cho cửa sổ Project Explorer di động trong màn hình VB
h. che cửa sổ Project Explorer
Tạo đề án
Mỗi lần khởi động Visual Basic, ta sẽ thấy hộp thoại New Project. Từ đây, ta
có thể chọn loại đề án mà ta muốn tạo và ấn Open.
Khi Visual Basic đã có sẵn, ta có thể tạo đề án bằng cách: từ menu File chọn
New Project. Hộp thoại New Project xuất hiện, ta chọn loại đề án cần thiết và nhấn
OK.
Đổi thuộc tính đề án
Một số thông tin liên quan đề án như tên đề án, số phiên bản, chuỗi ký tự
dùng hiển thị trên thanh tiêu đề khi ứng dụng hoàn thành. Ta có thể xem các thông
tin khác trong hộp thoai Project Properties
Hộp thoại Project Properties
1. trong cửa sổ Project Explorer, nhấn nút phải chuột lên tệp tin đề án
2. trong menu ngữ cảnh, Chọn Project Name Properties. Hộp thoại
Project Properties xuất hiện
3. Hoặc là từ menu Properties, chọn Project Name Properties
Lưu đề án
Khi lưu đề án từng tập tin trong đề án sẽ được lưu trước kế tiếp là tệp tin đề
án. Trong lần lưu đề án đầu tiên, Visual Basic đề nghị tên cho từng tệp tin, thường
nó lấy tên biểu mẫu và có phần mở rrộngt uỳ thuộc vào loại tệp tin
1. từ menu file chọn Save Project
2. nếu đây là lần đầu lưu đề án hoặc ta vừa thêm một biểu mẫu hoặc
module, hộp thoại save File as xuất hiện lần lượt cho từng tệp tin
Đổi tên
Ta không nhất thiết dùng tên mà Visual Basic đề nghị, mà có thể đặt tuỳ ý,
tuy nhiên nên đặt tên sao cho gợi nhớ:
1. Đưa vào một tên và ấn nút save
2. Tập tin cuối cùng được lưu là tệp tin đề án Nếu ta đã đặt tên cho đề án
thông qua hộp thoại project properties, Visual Basic sẽ tự động đề nghị
Project_Name.vbp. Lúc này, ta có thể đổi lại tên khác tuỳ thích, ví dụ như
SaveTest.vbp
Mở đề án có sẵn
Ta có một số đề án đang làm việc. Khởi động Visual Basic, chọn menu File.
Phần dưới menu liệt kê danh sách các đề án mới nhất mà ta đã làm việc, chọn đề án
cần mở. Nếu đề án không xuất hiện trong danh sách, ta phải chỉ ra đường dẫn.
Mở tệp tin vào lúc khởi động Visual Basic
Lần đầu khởi động Visual Basic, hộp thoại New project xuất hiện. ta có thể
chọn mở đề án mới nhất hoặc có sẵn trên đĩa ngay từ hộp thoại này. nếu không
muốn hộp thoại này xuất hiện mỗi lần khởi động Visual Basic, xoá đánh dấu trên
hộp đánh dấu (checkbox) nằm ở bên dưới hộp thoại.
Mở đề án
a. Từ menu File, chọn Open Project.
b. trên trang Existing, chuyển đén thư mục chứa đề án. nếu đề án cần mở là
đề án lưu gần nhất, chuyển sang trang Recent
c. chọn tên tệp tin đề án và nhấn OK
b. Lớp (Class) là một trong những tính năngquan trọng nhất của Visual
Basic, được dùng trong lập trình hướng đối tượng để định nghĩa các khuôn mẫu cho
các đối tượng.
c. module chuẩn chứa các khai báo kiểu, hằng, biến, thủ thuộc phạm vi
public hoặc ở mức module
d. tệp tin tài nguyên; chứa hình ảnh, chuối ký tự và các dữ liệu khác ta có
thể soạn thảo mà không cần sửa lại mã nguồn
e. tài liệu ActiveX (.dob) tương tự biểu mẫu nhưng được hiển thị trong trình
duyệt xét WEB, như là Internet Explorer.
f. Module điều khiển (.ctl) và module Property page (.pag) tương tự biểu
mẫu, nhưng được dùng để tạo điều khiển ActiveX và danh sách các thuộc tính của
chúng để hiển thị khi thiết kế
g. điều khiển ActiveX (.ocx) có thể được thêm vào hộp công cụ để dùng
trong biểu mẫu. Khi Visual Basic được cài đặt, một số tệp tin dạng này kèm theo
Visual Basic sẽ được chép vào trong máy
h. đối tượng, như là Worksheet của Excel
i. tham chiếu (Reference)
j. trình thiết kế ActiveX : là công cụ dùng để thiết kế các lớp cho đối tượng.
Giao diện thiết kế biểu mẫu là một trình thiết kế mặc định
k. các điều khiển thông dụng là nút lệnh điều khiển khung được Visual
Basic cung cấp sẵn.ẫnt có thể thêm tệp tin bằng hai cách;
Cách 1:
- từ menu Project, chọn Add, một hộp thoại xuất hiện
- nếu muốn tạo mới, chọn tab new. Visual Basic cung cấp các danh sách có
sẵn
- nếu muốn dùng một tệp tin có sẵn, chọn Tab Existing, chọn tên tệp tin,
nhấn Open
Cách 2:
- Nhấn nút chuột trong cửa sổ Project Explorer
- Trong menu ngữ cảnh chọn Add
- xuất hiện hộp thoại như trên
Để thêm điều khiển ActiveX vào hộp thoại Components, nhấn nút Browse
để tìm đường dẫn cho tệp tin.OCX mỗi điều khiển ActiveX có kèm theo một tệp tin
mở rộng là.OCA Tệp tin này chứa các thông tin cảu thư viện kiểu lưu trữ và các dữ
liệu liên quan đến điều khiển.
Các tệp tin.OCA chứa trong cùng thư mục với điều khiển ActiveX và được
tạo lại khi cần.
Xoá điều khiển khỏi đề án
1. từ menu project, chọn Components
2. hộp thoại Components xuất hiện, chọn điều khiển mà ta muốn xoá, xoá
hộp đánh dấu kế bên nó, điều khiển sẽ bị xoá khỏi hộp công cụ. Chú ý là chỉ bỏ
được điều khiển khỏi công cụ khi nó không được sử dụng trong đề án.
Sử dụng đối tượng của ứng dụng khác
Để lấy đối tượng từ một ứng dụng nào đó, ví dụ ta muốn sử dụng thư viện
đối tượng của Microsoft Excel, đặt tham chiếu đến thư viện đối tượng của ứng dụng
đó Thêm tham chiếu đến thư viện đối tượng của ứng dụng khác
1. từ menu Project, chọn References
2. Hộp thoại References xuất hiện, chọn vào hộp đánh dấu. nếu tên tham
chiếu chưa có sẵn trong danh sách, nhấn Browse vào ứng dụng và ấn OK .
Nếu không muốn tiếp tục sử dụng đối tượng của thư viện tham chiếu. Ta nên
xoá đánh dấu tham chiếu để giảm số tham chiếu mà Visual Basic đang quản lý,
giảm được thời gian biên dịch đề án,...
Khi có tham chiếu đến thư viện đối tượng, ta có thể lấy được đối tượng cùng
với các thuộc tính và phương thức của nó bằng cách vào menu view, chọn Object
Browser.
Thêm tệp tin tài nguyên vào đề án
Tệp tin tài nguyên chứa toàn bộ các hình ảnh, biểu tượng, chuỗi văn bản hiển
thị trên màn hình và các thành phần khác liên quan đến việc địa phương hoá ứng
dụng.
a. từ menu project, chọn Add File
b. Chọn tệp tin tài nguyên có sẵn (.RES) và chọn Open
Một đề án đơn giản chỉ có một tệp tin tài nguyên, nếu thêm một tệp tin.RES
thứ hai, Visual Basic sẽ báo lỗi.
nghĩa là ta không thể truy nhập biến từ bên ngoài thủ tục. Nhờ đó, ta có thể dùng
trùng tên biến cục bộ trong những thủ tục khác.
Kiểu dữ liệu trong khai báo Dim có thể là những kiểu cơ bản như Integer,
String hoặc Currency. Ta cũng có thể dùng đối tượng của VB (như Object, Form1,
TextBox) hoặc của các ứng dụng khác.
Khai báo biến trong phần Declarations của một module nghĩa là biến đó tồn
tại và có tầm hoạt động trong module đó.
Khai báo biến với từ khoá Public nghĩa là biến đó tồn tại và có tầm hoạt
động của toàn ứng dụng .
Khai báo biến cục bộ với từ khoá Static nghĩa là mặc dầu biến đó biến mất
khi thủ tục chấm dứt, nhưng giá trị của nó vẫn được giữ lại để tiếp tục hoạt động khi
thủ tục được gọi trong lần sau.
2.3.2. Khai báo ngầm
Nghĩa là ta không cần khai báo tường minh trước khi sử dụng biến. Ví dụ:
Function SafeSqr(num)
TempVal = Abs(num)
SafeSqr = Sqr(TempVal)
End Function
Mặc dù cách này có vẻ thuận tiện nhưng có thể gây lỗi nếu ta gõ nhầm tên
biến.
Function SafeSqr(num)
TempVal = Abs(num)
SafeSqr = Sqr(TemVal)
End Function
Hàm này trả về zero. Khi VB gặp tên mới, nó tạo ra một biến khác với tên
đó.
2.3.3. Khai báo tường minh
Để tránh những rắc rối trên, ta nên quy định VB phải báo lỗi khi gặp một tên
biến không khai báo. Ta đặt dòng lệnh:
Option Explicit
Trong phần Declarations của mô-đun. Một cách khác, từ menu Tools, chọn
Options, chọn tab Editor và đánh dấu vào tuỳ chọn Require Variable Declaration.
VB tự động chèn dòng lệnh Option Explicit vào một mô-đun mới, nhưng không
phải là những mô-đun đã được tạo. Do đó, đối với các mô-đun này, ta phải thêm
dòng lệnh bằng tay.
Option Explicit chỉ hoạt động trên từng mô-đun. Vì vậy, ta phải thêm dòng
này vào mỗi mô-đun của biểu mẫu, mô-đun chuẩn, hay mô-đun lớp.
2.3.4. Hằng
Dùng để chứa những dữ liệu tạm thời nhưng không thay đổi trong suốt thời
gian chương trình hoạt động. Sử dụng hằng số làm chương trình sáng sủa và dễ đọc
nhờ những tên gợi nhớ thay vì các con số. VB cung cấp một số hằng định nghĩa sẵn,
nhưng ta có thể tự tạo hằng.
Ta có thể dùng cửa sổ Object Browser để xem danh sách các ứng dụng hằng
có sẵn của VB và VBA( Visual basic for Application). Các ứng dụng khác cung cấp
những thư viện đối tượng, như Microsoft Exel, Microsoft Project, hoặc các thư viện
của điều khiển ActiveX cũng có hằng định nghĩa sẵn.
Trong trương hợp trùng tên hằng trong những thư viện khác nhau, ta có thể
dung cách chỉ rõ tham chiếu hằng:
[<Libname>][<tên mô-đun>]<tên hằng>
Libname là tên lớp, tên điều khiển hoặc tên thư viện.
Khai báo hằng
|Public|private|Const<tên hằng>[As<kiểu dữ liệu>]= <biểu thức>
Tầm hoạt động
Hằng cũng có tầm hoạt động tương tự biến:
• Hằng khai báo trong thủ tục chỉ hoạt động trong thủ tục
• Hằng khai báo trong mô-đun chỉ hoạt động trong mô-đun
• Hằng khai báo Public trong phần Declarations của mô-đun chuẩn có tầm
hoạt động trên toàn ứng dụng.Khai báo Public không thể dùng trong mô-đun của
biểu mẫu hoặc mô-đun lớp.
Kiểu String
Mặc định, biến hay tham số kiểu chuỗi có chiều dài thay đổi, nó có thể tăng
hoặc giảm tuỳ theo ta gán dữ liệu. Ta có thể khai báo chuỗi có chiều dài cố định:
Dim EmpName As String *50
Nếu ta gán một chuỗi ngắn hơn 50 ký tự, EmpName sẽ được thêm vào phần
đuôi các kỹ tự khoảng trắng cho đầy 50 ký tự, nếu chuỗi gán vào dài hơn 50 ký tự,
VB tự động chặt bỏ.
Khi làm việc với chuỗi, ta cần dùng các ham Trim và RTrim để cắt bỏ các ký
tự trắng không cần thiết. Ngoài ra một số hàm thông dụng để thao tác trên chuỗi
như:
a. Len: Lấy chiều dài chuỗi
b. Mid$: Trích chuỗi con từ chuỗi gốc
c. Left$: Trích chuỗi con từ phần đầu chuỗi gốc.
d. Right$:Trích chuỗi con từ phần đuôi của chuỗi gốc.
e. InStr: Tìm chuỗi con trong chuỗi gốc. Nếu hàm InStr trả về 0, nghĩa là
không tìm thấy.
Tìm kiếm không phân biệt cõ chữ. Nhưng nếu tham số thứ 3 là
vbBinaryCompare thì đây là tìm kiếm chuỗi có phân biệt chữ in hoa và chữ in
thường.
f. Replace: Tìm và thay thể chuỗi. Replace(“Peter PeterWright”,” Peter
”,John,6). Chuỗi kết quả là “John Wright”, bắt đầu từ vị trí thứ 6. Nếu muốn giữ lại
phần đầu ta làm như sau:
Left$(“Peter Peter Wright”,5)&Replace (“Peter Peter
Wright”,”Peter”,”John”,6)
Một tham số khác là số lần thay thế:
Replace(“Peter Peter Peter Wright”,”Peter”,”Hooray”,1,2)
Kết quả là “Hooray Hooray Peter Wright”, nghĩa là hai lần thay thế. THam
số này mang giá trị mặc định là -1, nghĩa là thay thế toàn bộ.
Tham số cuối cùng tương tự hàm Instr(), cho biết nó có phân biệt chữ in hoa
và chữ thường hay không
Kiểu Date
Khi các kiểu dữ liệu khác được chuyển sang Date, giá trị đứng trước dấu
chấm là ngày, giá trị đứng sau dấu chấm là giờ. Nửa đêm là 0, giữa ngày là 0,5. Dấu
âm thể hiện ngày trước 30/12/1999. Kiểu Date đã giải quyết vấn đề Y2K.
Nhấn Ctrl-G để hiển thị cửa sổ Immediate.
Gõ vào:
“01/02/98” và nhấn Enter.
Nếu hiểu theo người Mỹ, “01/02/98” có nghĩa là ngày 2 tháng Giêng năm
1998, nếu hiểu theo người Anh thì đây là ngày 1 tháng 2 năm 1998. Nếu dùng ngày
như trong hình trên thì VB hiểu rằng lấy 1 chia cho 2 rồi lấy kết quả chia cho 98!
Trở lại cửa sổ Immediate gõ vào: ?#01/02/98#
Dấu # cho biết là dữ liệu kiểu Date, không phải một biểu thức toán học. Tuy
nhiên, định dạng ngày tháng hiển thị phụ thuộc vào quy định của Windows.
Hộp thoại này hiển thị khi người sử dụng nhấp đúp chuột vào biểu tượng
Regional Setting trong cửa sổ Control Panel của Windows. Nó cho phép quy định
kiểu ngày tháng tuỳ thuộc quốc gia. Bên trong chương trình VB xử lý ngày tháng
theo kiểu Mỹ #01/02/98# là ngày 2 tháng Giêng năm 1998, nhưng nếu máy đang
dùng theo hệ Anh thì nó sẽ hiển thị trên cửa sổ Immediate là 2/1/98.
Kiểu Object
Biến kiểu Object chứa một địa chỉ 4 byte (32bit) trỏ đến đối tượng trong ứng
dụng hiện hành hoặc các ứng dụng khác. Dùng lệnh Set để chỉ ra đối tượng thực sự:
Dim objDb As Object
Set objDb=OpenDatabase(“c:\vb5\Biblio.mdb”)
Khi khai báo biến đối tượng, nên chỉ ra tên lớp tường minh, như TextBox
thay vì Control, Database thay vì Object). Ứng dụng sẽ chạy nhanh hơn, ta có thể
xem danh sách các lớp trong cửa sổ Object Browser.
Kiểu Variant
Có thể chứa mọi loại dữ liệu, số, thậm chí mảng. Ta không cần chuyển đổi
kiểu dữ liệu, VB làm việc đó một cách tự động.
Dim Somevalue 'Variant by default
Somevalue = "17" 'SomeValue contains "17"(a two character
string).
Somevalue = Somevalue – 15 'somevalue now cotains the numeric value
2.
Somevalue = "U" & Somevalue 'somevalue now cotains.
Variant cũng thuận tiện khi ta không biết trước kiểu dữ liệu
Trong một biến Variant, Error là một giá trị đặc biệt thể hiện một điều kiện
lỗi vừa xảy ra trong thủ tục. Tuy nhiên, không như các lỗi khác, các xử lý lỗi thông
thường của ứng dụng không xảy ra. Do đó, ta có thể xử lý dựa trên các giá trị lỗi.
Giá trị Error được sinh ra bằng cách chuyển đổi giá trị lỗi dùng cho hàm CVErr.
Kiểu mảng(Array)
Mảng là một xâu các biến có cùng tên và cùng kiểu dữ liệu. Dung Array làm
chương trình đơn giản và rút gọn, vì ta có thể dùng vòng lặp. Mảng có biên trên và
biên dưới, và các thành phần trong mảng là liên tục giữa 2 biên.
Khái niệm mảng ở đây khác với mảng các điều khiển (Control Array).
Control Array không cho phép nạp hay thoát khỏi một thành phần ở giữa Array.
Có 2 loại biến mảng mảng có chiều dài cố định và mảng động, có chiều dài
thay đổi lúc thi hành. Mảng có chiều dài cố định có thể được khai báo Public trong
ứng dụng.
Private trong mô-đun hoặc Private trong một thủ tục.
Mảng có chiều dài cố định
Có biên trên và biên dưới. Biên trên được xác định ngay lúc khai báo.
Dim counters(14) As Integer
Public sums(20) As Double
Mặc định, biên dưới là 0. Ta có thể khai báo tường minh biên dưới:
Dim counter(1 To 15) As Integer
Dim sums(100 To 120) As String
a. Hàm UBound trả về phần tử cuối của mảng(Upper Bound).
b. Hàm LBound trả về phần tử đầu tiên của mảng (Lower Bound).
Mảng trong mảng
Private Sub command1_click()
Dim intX As Integer
'Declare and populate an integer array
Dim countersA(5) As Integer
For intX = 0 To 4
countersA(intX) = 5
Next intX
'Declare and populate a string array
Dim countersB(5) As String
For intX = 0 To 4
countersB(intX) = "Hello"
Next intX
Dim arrX(2) As Variant 'Declare a new two-member
arrX(1) = countersA()
arrX(2) = countersB()
MsgBox arrX(1)(2) ' display a member of each array
MsgBox arrX(2)(3)
End Sub
Mảng nhiều chiều
Ta khai báo một mảng 2 chiều có 10 phần tử
Static MatrixA(9, 9) As Double
Static MatrixA(1 To 10, 1 To 10) As Double
Dim MultiD(3, 1 To 10, 1 To 15)
Khai báo này tạo ra một mảng 3 chiều có kích cỡ 4×10×15, là số phần tử của
ma trân là 600. Nên thận trọng trong khi sử dung các mảng nhiều chiều, nhất là các
mảng các Variant vì nó lớn hơn các kiểu dữ liệu khác.
Mảng động (dynamic Array)
Mảng này có thể thay đổi kích cỡ. là một trong những ưu điểm của Visual
Basic, mảng động giúp quản lý bộ nhớ một cách hiệu quả. Ta có thể dùng một mảng
lớn trong thời gian ngắn, sau đó xoá bỏ để trả vùng nhớ cho hệ thống
Khai báo
• Khai báo Public hoặc Dim trong mô-đun, hoặc khai báo Static hay Dim
trong thủ tục. Khai báo một mảng động bằng cách cho nó một danh sách không
theo chiều nào cả.
Dim DynArray()
• Cấp phát số phần tử thực sự bằng dòng lệnh ReDim.
ReDim DynArray(x+1)
Sử dụng ReDim
Dòng lệnh ReDim chỉ có thể xuất hiện trong thủ tục. Khác với Dim hay
Static, ReDim là một dòng lệnh thi hành, nó làm ứng dụng phải thực hiện một hành
động lúc chạy chương trình. Sử dụng ReDim tương tự trong mảng có chiều dài cố
định, dùng thay đổi số phần tử cũng như biên trên hoặc biên dưới. tuy nhiên, số
chiều không thay đổi.
ReDim DynArray(4 to 12)
Dim Matrix1() as integer
Sub CalcValuesNow()
-
-
-
ReDim Matrix1(19,29)
End sub
Mỗi lần gọi ReDim, tất cả các giá trị chứa trong mảng hiện hành bị mất. Vb
khởi tạo lại giá trị cho chúng (Empty đối với mảng Variant, 0 cho mảng số, chuỗi
rỗng cho mảng chuỗi, hoặc nothing cho mảng các đối tượng). Cách này tiện lợi khi
ta muốn thêm dữ liệu mới hoặc muốn xoá bớt vùng nhớ. Đôi khi, ta muốn thay đổi
kích cỡ của mảng mà không mất dữ liệu. Ta dùng ReDim với từ khoá Preserve. Ví
dụ, mở rộng mảng thêm một phần tử và không mất dữ liệu:
ReDim Preserve DynArray(UBound(DynArray)+1)
Tuy nhiên chỉ có biên trên của chiều cuối cùng trong mảng được thay đổi khi
ta dùng Preserve. Nếu thay đổi chiều khác, hoặc biên dưới của chiều cuối cùng VB
sẽ báo lỗi.
Một số tính năng mở rộng của mảng
Không những gán mảng cho một mảng, ta còn tạo các hàm trả về mảng và
các thuộc tính trả về mản. Trong nhiều trường hợp, những kỹ thuật này sẽ cải tiến
đáng kể tốc độ xử lý chương trình
Sao chép mảng
Trong Visual Basic 5, để sao chép từ một mảng sang một mảng khác, ta phải
dung vòng lặp For Each quét qua mảng nguồn, rồi tuần tự ReDim lại mảng đích để
copy từng phần tử.
Tuy nhiên cách này chỉ áp ụng cho mảng Dynamic mà thôi. Khi gán biến, có
một số quy luật mà ta cần nhớ. Ví dụ: Ta có thể gán một giá trị kiểu Integer vào
biến long, không vấn đề nhưng gán Long cho Integer sẽ gây lỗi tràn. Ngoài quy luật
về kiểu dữ liệu, việc gán mảng cũng có những quy luật liên quan đên số chiều, kích
thước của chiều và laọi mảng gì (mảng có chiều dài cố định hay mảng động).
Gán mảng với chiều và kiểu dữ liệu khác nhau có thể không thành công, do
những nguyên nhân sau:
• Mảng bên trái dấu gán(=) là mảng chiều dài cố định hay mảng động
• Số chiều của mảng bên trái có đồng nhất với số chiều của mảng bên phải
không
• Số phần tử trên mỗi chiều của mỗi bên có tương thích không. Chiều có thể
tương thích thậm chí khi khai báo khác nhau, ví dụ như một mảng bắt đầu từ số 0
trong khi mảng kia bắt đầu từ số 1 miên là chúng có cùng số phần tử Kiểu dữ liệu
cảu các phần tử mỗi bên phải tương thích.
Tương tự như nhiều ngôn ngữ lập trình bậc cao khác, VB cung cấp cho
người lập trình các cấu trúc điều khiển chương trình theo vòng lặp và rẽ nhanh theo
điều kiện.
Cấu trúc điều kiện khá phong phú: cấu trúc If với nhiều cách sử dụng khác
nhau, cấu trúc Select case cho phép rẽ nhánh theo nhiều hướng.
Cấu trúc lặp có các dạng For, Do while,...
3.2. Cấu trúc điều kiện
3.2.1. If.. Then
Một dòng lệnh
If <điều kiện> Then <dòng lệnh>
Nhiều dòng lệnh
If <điều kiện> Then
<dòng lệnh>
End if
Điều kiện là một so sánh hay một biểu thức mang giá trị số. Visual basic
thông dịch giá trị này thành True / False. Nếu True thì Visual basic thi hành dòng
lệnh sau từ khoá Then.
3.2.2. If.. Then...Else
If <điều kiện 1> Then
[Khối lệnh - 1]
ElseIf <điều kiện 2> Then
[Khối lệnh - 2]
......
Else
[Khối lệnh - n]
End if
3.2.3. Select Case
Giải quyết trường hợp có quá nhiều ElseIf được dùng, giúp chương trình
sáng sủa dễ đọc. Biểu thức để so sánh được tính toán một lần vào đầu cấu trúc. Sau
đó Visual basic so sánh kết quả biểu thức với từng Case. Nếu bằng nó thi hành khối
lệnh trong Case đó.
Select Case <biểu thức kiểm tra>
Case <danh sách biểu thức 1>
Khối lệnh 1
Case <danh sách biểu thức 2>
Khối lệnh 2
....................
Case else
Khối lệnh n
End Select
Mỗi danh sách biểu thức chứa một hoặc nhiều giá trị, các giá trị cách nhau
bằng dấu phảy. Mỗi khối lệnh có thể chứa từ 0 đến nhiều dòng lệnh. Nếu có hơn
một Case thoả mãn điều kiện thì Case đầu tiên được thực hiện. Case else không nhất
thiết phải có, dùng trong trường hợp còn lại của các Case trước.
Wend
3.3.5. Câu lệnh GoTo
Được dùng cho bẫy lỗi.
On Error Goto ErrorHandler
Khi có lỗi, chương trình sẽ nhảy đến nhãn ErrorHandler và thi hành lệnh ở
đó.
Trong trường hợp không khai báo As <type>, mặc định, VB hiểu là kiểu
variant.
4.4. Tham số
Tham số được sử dụng cả trong thủ tục và hàm để truyền vào hoặc lấy ra các
giá trị. Tham số có 2 loại là tham số dạng tham biến (tham chiếu) và tham số dạng
tham trị (theo giá trị).
Tham biến: được xác định vởi từ khóa byref khi khai báo. Tham số dạng này
có thể nhận giá trị trả về. Khi gọi chương trình con, với tham số là tham biến cần
phải truyền một biến có kiểu tương ứng.
Tham trị: được xác định bởi từ khóa byval. Tham số dạng này không thể
nhận giá trị trả ra từ chương trình con. Khi gọicó thể truyền trực tiếp giá trị hoặc
biến có kiểu tương thích.
Basic(ví dụ DataCombo, Datalist,....) hoặc là các điều khiển chỉ hiện diện trong ấn
bản Professional và Enterprise(như ListView,Toolbar,Animation ). Ngoài ra, còn rất
nhiều điều khiển ActiveX do các nhà cung cấp thứ ba đưa ra
• Đối tượng chèn được, ví dụ như đối tượng bảng tính (Worksheet) của
Microsoft Excel chứa một danh sách các nhân viên của một công ty hay đối tưọng
lịch biểu (Calendar) của Microsoft Project chứa việc lập biểu thông tin cho một đề
án. Bởi vì chúng có thể thêm vào hộp công cụ, chúng có thể là các điều khiển được
chuẩn bị chu đáo. Một vài đối tượng kiểu này cũng cung cấp phần Automation lập
trình với các đối tượng sinh ra từ những ứng dụng khác ngay trong ứng dụng của
Visual Basic.
5.2. Các điều khiển thông dụng
Bảng sau liệt kế một số điều khiển thông dụng (nhóm điều kiện nội tại):
If KeyCode = 13 Then
MgBox" Nội dung văn bản vừa vào là: "& T1.Text
End if
End Sub
Vd: Tạo một Form, đưa một hộp danh sách vào biểu mẫu đưa đoạn chương
trình sau vào sự kiện Load của Form
- Giải thích hoạt động: Dùng Phương thức AddItem của danh sách để tạo
danh sách. Vì danh sách rỗng vào lúc khởi tạo nên số đếm bắt đầu bằng 0 thuộc tính
LitsCount được Windown cập nhật tự động và luôn chứa tổng số thành phần(phần
tử) trong danh sách.
- Thuộc tính IntegralHeight có giá tri bằng True. Tức là hộp danh sách sẽ tự
động điều chỉnh kíck cỡ cho vừa khít với số phần tử có trong danh sách. Nếu đổi
thuộc tính này là False, danh sách chỉ hiển thị một phần.
- Để sắp xếp mục chọn trong danh sách ta đổi thuộc tính Sorted = True.
- Các phàn tử trong danh sách xẽ dược sắp xếp theo thử tự Abc ( chỉ được
đổi khi thiết kế ).
- Chọn phần tử trong danh sách ta có thể kiểm tra giá trị thuộc tính Text
(hoặc thuộc tính Value) của danh sách khi người sử dụng nhắp chuột vào hộp danh
sách (sự kiện Click sẽ sảy ra ). Nếu không có phần tử nào được chọn thuộc tính
Text = Null.
- Xoá phần tử trong danh sách:(dùng thuộc tính Removeitem )
Lits1. ReMoveItem 3 : Dòng lệnh này sẽ xoá phần tử thứ 3 trong danh
sách. Ta có thể dùng phương thức Clear để xoá toàn bộ phần tử trong danh sách .
- Dòng lệnh này sẽ xoá phần tử hiện hành :
Lits 1. RemoveItem Lits1.LitsIndex
- Dòng lệnh này sẽ xoá toàn bộ nội dung trong danh sách
List1.Clear
+ Hiển thị nhiều cột: Đây là điểm tiện lợi của hộp danh sách so với hộp kết
hợp (ComBox) dùng thuộc tính Comlumns, ta có thể hiển thị danh sách theo nhiều
cột.
Trở lại vị dụ trên, tìm và đổi thuộc tính Columns = 2 (Nghĩa là 2 cột)
Luôn hiển thị danh sách và cho phép người sử dụng gõ vào hộp văn
bản.
Hộp kết hợp thả xuống(Drop-Down ListBox):kiểu =2
Tương tự kiểu 0, danh sách không hiển thị sẵn nếu không nhấn vào
mũi tên xuống. Người sử dụng chỉ có thể chọn từ danh sách, gõ vào hộp văn bản thì
danh sách sẽ cuộn đến đúng phần tử yêu cầu và đánh dấu nó.
Vd: CMDQuit, hộp văn bản thường là TXT, nút tuỳ chọn là OPT..vv.
Chú ý : Khi đặt tên cho các điều khiển, ta cần tuân theo một số quy tắc, điều
này sẽ giúp chương trình của chúng ta sáng sủa, dễ đọc, nhất là khi gỡ rối và bảo trì
chương trình.
+ Phân biệt hai thuộc tính Caption và Text.
- Caption: Dùng cho các đối tượng như biểu mẫu, khung, nút lệnh và thường
để hiển thị tiêu đề cho đối tượng.
+ Text: dùng cho những điều khiển thuộc loại nhận dữ liệu từ người sử dụng
nhập vào như hộp văn bản (Textbox), hộp kết hợp (Conbobox).
- Ngoài ra ta có thể quy định phím nóng (Hotkey) cho các điều khiển có
thuộc tính Caption bằng cách đặt dấu "&" kế bên ký tự.
Vd: Nút lệnh có Caption = &Quit = Quit(Ký tự Q sẽ được VB gạch chân):
- Khi người sử dụng ấn Alt + Q, nút lệnh Quit sẽ được kích hoạt,
tương tự nhấn chuột vào nút lệnh.
Vd: Hộp văn bản chỉ nhận ký tự số.
Private Sub Txt_Keypress (KeySscii as integer)
If KeyAscii < asc("0") or KeyAscii > Asc("9") then
KeyAscii = 0
End if
EndSub
- Giải thích:
Dòng lệnh KeyAscii as integer đặt trong dấu ngoặc đơn cho biết đây là tham
số của thủ tục. Khi một phím được nhấn, tham số này sẽ giữ mã Ascii của phím đó.
Vd: Nếu nhấn vào ký tự "A", KeyAscii sẽ = 65.
Acs("0") trả về mã ASCII của ký tự "0".
- Dòng lệnh if kiểm tra: Nếu phím gõ vào nằm ngoài khoảng từ 0 đến 9 thì
tắt phím đó đi = cách cho KeyAscii = 0.
+ Điều khiển Timer đáp ứng với thời gian trôi qua. Chúng độc lập với
người sử dụng, ta có thể lập trình với chúng để thi hành một hành động trong các
khoảng thời gian đều đặn.
+ Điều khiển Timer chỉ xuất hiện trên biểu mẫu lúc thiết kế (lúc thi
hành người sử dụng sẽ không nhìn thấy).
- Thuộc tính Interval chỉ ra số phần nghìn giây giữa hai sự kiện timer.
- Thuộc tính Enable = True điều khiển timer mới hoạt động = False
điều khiển timer ngưng hoạt động
Tham số tuỳ chọn Len chỉ ra số ký tự trong vùng đệm khi sao chép dữ liệu
giữa tập tin và chương trình.
Sau khi mở tập tin với Input, Output hoặc Append ta phải đóng nó bằng lệnh
Close.
6.2.2. Soạn thảo nội dung
Trước hết, đọc nội dung tập tin vào biến, sửa biến và ghi biến vào tập tin.
Đọc chuỗi từ tập tin:
Mở tập tin với Input. Sau đó, dùng dòng lệnh Line Input #, Input() hoặc
Input # để sao chép nội dung tập tin vào biến. Visual basic cung cấp những hàm để
đọc ghi 1 ký tự hoặc một dòng vào tập tin. Đoạn code sau đọc từng dòng:
Dim LinesFromFile, NextLine As String
Do Until EOF(FileNum)
Line Input #FileNum, NextLine
LinesFromFile = LinesFromFile + NextLine + Chr(13) + Chr(10)
Loop
Mặc dù Line Input# nhận ra cuối chuỗi khi nó đọc đến ký tự xuống dòng,
nhưng nó không lấy ký tự này khi đưa và biến. Nếu muốn lấy ký tự xuống dòng ta
phải tự xử lý code.
Ta cũng có thể dùng Input # để đọc một danh sách gồm các số hay chuỗi
trong tập tin. Ví dụ, để đọc một dòng trong tập tin danh sách thư điện tử:
Input #filename, name, street, city,state,zip
Dùng Input để sao chép một số ký tự từ tập tin vào biến:
LinesFromFile = Input(n, Filename)
Để copy toàn bộ tập tin vào biến, dùng InputB để copy từng byte. Vì InputB
trả về
chuỗi ANSI, ta phải dùng StrConv để chuyển đổi từ ANSI sang UNICODE.
LinesFromFile= StrConv(InputB(LOF(FileNum), FileNum), vbUnicode)
Ghi chuỗi và tập tin
Để ghi nội dung biến vào tập tin, mở tập tin với Output hay Append, sau đó
dùng Print #. Ví dụ, tình soạn thảo văn bản copy nội dung của hộp văn bản vào tập
tin:
Print #FileNum, Thebox.text
Visual basic cũng hỗ trợ lệnh Write #, dùng để ghi một danh sách các số,
chuỗi vào tập tin. Dấu phẩy được dùng để tách biệt:
Dim strString as String, intNumber as Integer
strString = “AnyCharacters”
intNumber = 23456
Write #Filenum, strString, intNumber
Đoạn code này ghi một chuỗi và một số vào một tập tin được chỉ ra bởi
FileNum.
- Lần lượt hiển thị hỉnh ảnh biểu diễn bị trí, trạng thái của vật chuyển động
theo tiến trình chuyển động.
- Sử dụng timer để điều khiển chuyển động một cách tự động và thực hiện
song song với các hoạt động khác.
Tạo điều khiển riêng: trong VB, người lập trình có thể tạo ra điều khiển của
riêng mình và sử dụng giống như các điều khiển có sẵn của VB bằng kỹ thuật tạo
Usercontrol.
7.3. Lập trình sử dụng các hàm API, thư viện DLL
7.3.1. Thư viện liên kết động
Đối với các ngông ngữ lập trình cổ điển như C, khi biên dịch chương trình,
ta có một tập tin EXE duy nhất có thể được thi hành mà không cần bất cứ tập tin
nào khác (tập tin.vbp của Visual Basic không phảI trường hợp này, vì nó chỉ chạy
trong môi trường Visual Basic). Toàn bộ chương trình cần thiết được chứa hết trong
một tập tin EXE. Tuy nhiên, cũng có rất nhiều thư viện C được dùng rộng rãi. Vấn
đề là làm sao sử dụng lạI các đoạn chương trình viết sẵn trong chương trình của ta.
Đó chính là liên kết (link). Có hai loạI liên kết : liên kết tĩnh ( static link) và liên
kết động (dynalic link).
Liên kết tĩnh
Cung cấp một kết nốI nền vững giữa chương trình và module viết sẵn ngay
lúc thiết kế; tương tự ta tạo module trong Visual Basic và gọI thủ tục trong đó, chỉ
khác là liên kết tĩnh thì chứa bên ngoài Visual Basic. Tuy nhiên, để sử dụng liên
kết tĩnh, ta cần copy phần chương trình viết sẵn của thư viện vào tập tin chương
trình khi biên dịch. Từ đó trở đi, chúng trở thành một phần của chương trình và bị
khoá chặt với chương trình.
gửi thông điệp cho nó. Khi thi hành, các thông điệp này là những cuộc gọi đến các
hàm/thủ tục, yêu cầu phần chương trình nào đó của DLL được thi hành.
7.3.2. Sử dụng API
Tìm kiếm API
Ta có thể tìm các API thông qua tập tin Trợ giúp (Help) của Visual Basic,
qua sách tra cứu.
Trình duyệt API (Text API Viewer)
Được cung cấp sẵn khi cài Visual Basic. Khi ta cần tra cứu cú pháp chính
xác của hàm API, ta dùng Text API Viewer. Tuy nhiên, để có thông tin chi tiết hơn
như hàm API làm gì, truyền tham số gì, trả về giá trị gì, ta cần có quyển sách tra
cứu. Ngoài ra, chương trình này còn cho phép copy nội dung API đến clipboard để
dán vào chương trình.
a. KERNEL32:
Là DLL chính, đảm nhiệm quản lý bộ nhớ, thưc hiện chức năng đa nhiệm và
những hàm ảnh hưởng trực tiếp đến hoạt động của Windows.
b. USER32:
Thư viện quản lý Windows. Thư viện này chứa các hàm xử lý menu, định
giờ, truyền tin, tập tin và nhiều phần không được hiển thị khác của Windows.
c. GDI32:
Giao diện thiết bị đồ hoạ (Graphics Device Interface). Thư viện này cung cấp
các hàm vẽ trên màn hình, cũng như kiểm tra phần biểu mẫu nào cần vẽ lại.
d. WINNM:
Cung cấp các hàm multimedia để xử lý âm thanh, nhạc, video thờI gian thực,
lấy mẫu, v.v… Nó là DLL 32 bit. (Thư viện 16 bit tên là MMSYSTEM)
Ta có thể tìm các tập tin này trong thư mục \Windows\system. Ngoài ra, còn
có các DLL nhỏ hơn, cũng được dùng phổ biến để cung cấp các dịch vụ đặc biệt
cho ứng dụng.
Trên đây là các tên DLL 32 bit. Phiên bản VB4 là bản cuốI cùng còn hỗ trợ
16 bit.
Khai báo API tương tự khai báo hằng/ thủ tục thông thường. Ta vẫn bắt đầu
bằng từ khoá Sub/Function, chỉ khác là trước đó phải có từ khoá Declare.
Ví dụ:
Private Declare Function FlashWindow Lib "User32" _
(ByVal hWnd As Long, _
ByVal bInvert As Long) As Long
Cổng LPT là song song gồm có 4 đường điều khiển, 5 đường trạng thái và 8
đường dữ liệu bao gồm 5 chế độ hoạt động:
- Chế độ tương thích (compatibility).
- Chế độ nibble.
- Chế độ byte.
- Chế độ EPP (Enhanced Parallel Port).
- Chế độ ECP (Extended Capabilities Port).
Ba chế độ đầu tiên sử dụng port song song chuẩn (SPP – Standard Parallel
Port) trong khi đó chế độ 4, 5 cần thêm phần cứng để cho phép hoạt động ở tốc độ
cao hơn. Sơ đồ chân của máy in như sau:
Chân Tín hiệu Mô tả
1 STR (Out) Mức tín hiệu thấp, truyền dữ liệu tới máy in
2 D0 Bit dữ liệu 0
3 D1 Bit dữ liệu 1
4 D2 Bit dữ liệu 2
5 D3 Bit dữ liệu 3
6 D4 Bit dữ liệu 4
7 D5 Bit dữ liệu 5
8 D6 Bit dữ liệu 6
9 D7 Bit dữ liệu 7
10 ACK (In) Mức thấp: máy in đã nhận 1 ký tự và có khả
năng nhận nữa
11 BUSY (In) Mức cao: ký tự đã được nhận; bộ đệm máy in
đầy;
12 khởi động
PAPER EMPTY (In) Mức máy
cao: hết in; máy in ở trạng thái off-line.
giấy
13 SELECT (In) Mức cao: máy in ở trạng thái online
14 AUTOFEED (Out) Tự động xuống dòng; mức thấp: máy in
xuống dòng tự động
15 ERROR (In) Mức thấp: hết giấy; máy in ở offline; lỗi máy in
16 INIT (Out) Mức thấp: khởi động máy in
17 SELECTIN (Out) Mức thấp: chọn máy in
18-25 GROUND 0V
x: không sử dụng
IRQ Enable: yêu cầu ngắt cứng; 1 = cho phép; 0 = không cho phép
Chú ý rằng chân BUSY được nối với cổng đảo trước khi đưa vào thanh
ghi trạng thái, các bit SELECTIN , AUTOFEED và STROBE được đưa qua
cổng đảo trước khi đưa ra các chân của cổng máy in.
Thông thường tốc độ xử lý dữ liệu của các thiết bị ngoại vi như máy in chậm
hơn PC nhiều nên các đường ACK , BUSY và STR được sử dụng cho kỹ thuật bắt
tay. Khởi đầu, PC đặt dữ liệu lên bus sau đó kích hoạt đường STR xuống mức thấp
để thông tin cho máy in biết rằng dữ liệu đã ổn định trên bus. Khi máy in xử lý xong
dữ liệu, nó sẽ trả lại tín hiệu ACK xuống mức thấp để ghi nhận. PC đợi cho đến khi
đường BUSY từ máy in xuống thấp (máy in không bận) thì sẽ đưa tiếp dữ liệu lên
bus.
Đầu nối 25 chân phía máy tính thông thường là female 25-pin D Connector
còn phía sợi cáp là male connector.
Mạch điện:
Mạch điện được thiết kế bên trong máy tính, cable chỉ là phương tiện mở
rộng đường truyền cho cổng LPT.
Cable:
Hầu hết các cable đều sử dụng đầu nối 25 chân kiểu male connector. Một số
khác sử dụng đầu nối 36 chân nhưng sợi cable thì chủ yếu vẫn là loại 25 sợi.
Cáp nối giữa máy in và máy tính bao gồm 25 sợi, nhưng không phải tất cả
điều được sử dụng mà trên thực tế chỉ có 18 sợi được nối với các chân cụ thể. Từ
đặc điểm quan trong này giúp chúng ta tận dụng và khắc phục được những cáp nối
mà trong lõi đã bị đứt một vài sợi.
Qua cách mô tả chức năng của từng tín hiệu riêng lẽ ta có thể nhận thấy các
đường dẫn dữ liệu có thể chia thành 3 nhóm:
- Các đường dẫn tín hiệu, xuất ra từ máy tính PC và điều khiển máy tính,
được gọi là các đường dẫn điều khiển.
- Các đường dẫn tín hiệu, đưa các thông tin thông báo ngược lại từ máy in về
máy tính, được gọi là các đường dẫn trạng thái.
- Đường dẫn dữ liệu, truyền các bit rieng lẽ của các ký tự cần in.
Tùy theo công dụng của từng loại cable mà cách ghép nối khác nhau. Sơ đồ
ghép nối cụ thể một số loại cable nhau sau:
Ghép nối máy tính với máy in:
Hai đầu sợi cable nối tương ứng các chân, nghĩa là chân 1 đầu thứ nhất nối
với chân 1 đầu thứ 2, chân 2 đầu thứ nhất nối với chân 2 đầu thứ 2,...
Ghép nối máy tính với máy tính:
Quá trình giao tiếp với cổng song song dùng 2 chế độ: chế độ chuẩn SPP và
chế độ mở rộng. Việc giao tiếp ở chế độ chuẩn mô tả như sau:
P P
Chức năng Chức năng
D0 ERROR
D1 SELECT
D2 PAPER
D3 ACK
D4 BUSY
BUSY D4
ACK D3
PAPER D2
SELECT D1
ERROR D0
GND GND
Ngoài ra, việc kết nối giữa 2 máy tính sử dụng cổng song song có thể dùng
chế độ mở rộng, chế độ này cho phép giao tiếp với tốc độ cao hơn.
P P
Chứ Chứ
D0 D0
D1 D1
D2 D2
D3 D3
D4 D4
D5 D5
D6 D6
D7 D7
SEL SEL
BUS INIT
ACK STR
S SEL
INIT BUS
STR ACK
Để đọc dữ liệu, có thể dùng một IC ghép kênh 21 74LS257 và dùng 4 bit
trạng thái của cổng song song còn xuất dữ liệu thì sử dụng 8 đường dữ liệu D0 –
D7.
- Strobe (1): Với một mức logic thấp ở chân này, máy tính thông báo cho
máy in biết có một byte đang sẵn sàng trên các đường dẫn tín hiệu để được truyền.
- D0 đến D7: Các đường dẫn dữ liệu
- Acknowledge: với một mức logic thấp ở chân này, máy in thông báo cho
máy tính biết là đã nhận được kí tự vừa gửi và có thể tiếp tục nhận.
- Busy (báo bận – 11): máy in gửi đến chân này mức logic cao trong khi
đang đón nhận hoặc in ra dữ liệu để thông báo cho máy tính biết là các bộ đệm
trong máy tính biết là các bộ đệm trong máy tính đã bị đầy hoặc máy in trong trạn
thái Off-line.
- Paper empty (hết giấy – 12): Mức cao ở chân này có nghĩa là giấy đã dùng
hết.
- Select (13): Một mức cao ở chân này, có nghĩa là máy in đang trong trạng
thái kích hoạt (On-line)
- Auto Linefeed (tự nạp dòng): Có khi còn gọi là Auto Feed. Bằng một mức
thấp ở chân này máy tính PC nhắc máy in tự động nạp một dòng mới mỗi khi kết
thúc một dòng.
- Error (có lỗi): Bằng một mức thấp ở chân này, máy in thông báo cho máy
tính là đã xuất hiện một lỗi, chẳng hạn kẹt giấy hoặc máy in đang trong trạng thái
Off-Line.
- Reset (đặt lại): Bằng một mức thấp ở chân này, máy in được đặt lại trạng
thái được xác định lúc ban đầu.
- Select Input: bằng một mức thấp ở chân này, máy in được lựa chọn bởi máy
tính.
tính đều được hệ điều hành bảo vệ. Các chương trình người dùng không được phép
truy cập trực tiếp trên các cổng này. Muốn truy cập vào các cổng, chương trình cần
phải được viết để chạy trong chế độ Kernel mode.
Sau đây là một ví dụ chương trình điều khiển được viết trên VB giao tiếp với
thiết bị (theo sơ đồ thiết kế đã giới thiệu ở mục trước). Chương trình này sử dụng
thư viện IO.DLL bao gồm các hàm:
- Hàm PortOut: xuất 1 byte ra cổng
Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal
Data As Byte)
Port: địa chỉ cổng, Data: dữ liệu xuất
- Hàm PortWordOut: xuất 1 word ra cổng
Private Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer,
ByVal Data As Integer)
- Hàm PortDWordOut: xuất 1 double word ra cổng
Private Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer,
ByVal Data As Long)
- Hàm PortIn: nhập 1 byte từ cổng, trả về giá trị nhập
Private Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As
Byte
- Hàm PortWordIn: nhập 1 word từ cổng
Private Declare Function PortWordIn Lib "IO.DLL" (ByVal Port As Integer)
As Integer
- Hàm PortDWordIn: nhập 1 double word từ cổng
Private Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As
Integer) As Long
Giao diện của chương trình:
Width = 1095
End
Begin VB.CheckBox chkSW
Height = 375
Index = 7
Left = 1800
TabIndex = 17
Top = 3480
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 6
Left = 1800
TabIndex = 16
Top = 3000
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 5
Left = 1800
TabIndex = 15
Top = 2520
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 4
Left = 1800
TabIndex = 14
Top = 2040
Width = 1575
End
Begin VB.CheckBox chkSW
Height = 375
Index = 3
Left = 1800
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 = 2400
TabIndex = 9
Top = 3960
Width = 975
End
Begin VB.CommandButton cmdSend
Caption = "Send"
Height = 495
Left = 0
TabIndex = 8
Top = 3960
Width = 1095
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED7"
Height = 375
Index = 7
Left = 240
TabIndex = 7
Top = 3480
Width = 1095
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED6"
Height = 375
Index = 6
Left = 240
TabIndex = 6
Top = 3000
Width = 975
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED5"
Height = 375
Index = 5
Left = 240
TabIndex = 5
Top = 2520
Width = 975
End
Begin VB.Label lblLED
BackStyle = 0 'Transparent
Caption = "LED4"
Height = 375
Index = 4
Left = 240
TabIndex = 4
Top = 2040
Width = 975
End
Begin VB.Label lblLED
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
Top = 3480
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 6
Left = 840
Shape = 3 'Circle
Top = 3000
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 5
Left = 840
Shape = 3 'Circle
Top = 2520
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 4
Left = 840
Shape = 3 'Circle
Top = 2040
Width = 375
End
Begin VB.Shape shpLED
BorderColor = &H000000FF&
FillColor = &H000000FF&
FillStyle = 0 'Solid
Height = 375
Index = 3
Left = 840
Shape = 3 'Circle
Top = 1560
Width = 375
End
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
'IO.DLL
Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port
As Integer, ByVal Data As Byte)
Private Declare Function PortIn Lib "IO.DLL" (ByV
Port As Integer) As Byte
'Variable
Private BA_LPT As Integer
Dim n1 As Integer
Dim i As Integer
PortOut BA_LPT, t
PortOut BA_LPT, 1 'STROBE = 1
PortOut BA_LPT, 0 'STROBE = 0
End Sub
- Đơ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.
Các đặc tính kỹ thuật của chuẩn RS-232 như sau:
Các tốc độ truyền dữ liệu thông dụng trong cổng nối tiếp là: 1200 bps, 4800
bps, 9600 bps và 19200 bps.
Khi thực hiện kết nối như trên, quá trình truyền phải bảo đảm tốc độ ở đầu
phát và thu giống nhau. Khi có dữ liệu đến DTE, dữ liệu này sẽ được đưa vào bộ
đệm và tạo ngắt.
Ngoài ra, khi thực hiện kết nối giữa hai DTE, ta còn dùng sơ đồ sau:
Khi DTE1 cần truyền dữ liệu thì cho DTR tích cực Æ tác động lên DSR của
DTE2 cho biết sẵn sàng nhận dữ liệu và cho biết đã nhận được sóng mang của
MODEM (ảo). Sau đó, DTE1 tích cực chân RTS để tác động đến chân CTS của
DTE2 cho biết DTE1 có thể nhận dữ liệu. Khi thực hiện kết nối giữa DTE và DCE,
do tốc độ truyền khác nhau nên phải thực hiện điều khiển lưu lượng. Quá trinh điều
khiển này có thể thực hiện bằng phần mềm hay phần cứng. Quá trình điều khiển
bằng phần mềm thực hiện bằng hai ký tự Xon và Xoff.
Ký tự Xon được DCE gởi đi khi rảnh (có thể nhận dữ liệu). Nếu DCE bận thì
sẽ gởi ký tự Xoff. Quá trình điều khiển bằng phần cứng dùng hai chân RTS và CTS.
Nếu DTE muốn truyền dữ liệu thì sẽ gởi RTS để yêu cầu truyền, DCE nếu có khả
năng nhận dữ liệu (đang rảnh) thì gởi lại CTS.
Các chíp giao tiếp, hỗ trợ chuyển đổi mức logic TTL sang mức điện áp thích
hợp trên cổng RS232: MAX232, MAX233,...
Khi không truyền dữ liệu, đường truyền sẽ ở trạng thái mark (điện áp -10V).
Khi bắt đầu truyền, DTE sẽ đưa ra xung Start (space: 10V) và sau đó lần lượt truyền
từ D0 đến D7 và Parity, cuối cùng là xung Stop (mark: -10V) để khôi phục trạng
thái đường truyền. Dạng tín hiệu truyền mô tả như sau (truyền ký tự A):
Trong khi giao tiếp với các thiết bị, do cấu tạo và khả năng làm việc của mỗi
thiết bị đều rất khác nhau, đặc biệt là tốc độ xử lý. Một vấn đề đặt ra là phải xử lý
sao cho các thiết bị làm việc với tốc độ khác nhau vẫn có thể kịp truyền, nhận và xử
lý thông tin. Chức năng điều khiển luồng trong truyền thông nối tiếp qua RS232
nhằm giải quyết vấn đề này. Mỗi khi truyền hay nhận máy tính sẽ xác định xem
thiết bị được ghép nối có sẵn sàng để truyền hay nhận chưa. Khi nào thiết bị sẵn
sàng mới tiến hành truyền hoặc nhận. Như vậy sẽ đảm bảo kiểm soát được lưu
lượng thông tin trên đường truyền và đảm bảo dữ liệu được gửi hay nhận một cách
chính xác hơn.
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:
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:
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:
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):
STB (Stop Bit) = 0: 1 bit stop, =1: 1.5 bit stop (khi dùng 5 bit dữ liệu) hay 2
bit stop (khi dùng 6, 7, 8 bit dữ liệu).
WLS (Word Length Select):
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ỏ.
Cách bổ sung điều khiển Microsoft Comm Control vào hộp công cụ của VB:
ActiveX MsComm được bổ sung vào một Visual Basic Project thông qua
menu Project > Components:
Biểu tượng của MsComm trên hộp công cụ là , và các thuộc tính cơ bản
mô tả như sau:
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
InputString = 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.
CDTimeout:
Đặt và xác định khoảng thời gian lớn nhất (tính bằng ms) từ lúc phát hiện
sóng mang cho đến lúc có dữ liệu. Nếu quá khoảng thời gian này mà vẫn chưa có
dữ liệu thì sẽ gán thuộc tính CommEvent là CDTO (Carrier Detect Timeout Error)
và tạo sự kiện OnComm.
Cú pháp:
MSComm1.CDTimeout = NumTime
DSRTimeout:
Xác định thời gian chờ tín hiệu DSR trước khi xảy ra sự kiện OnComm.
CTSTimeout:
Đặt và xác định khoảng thời gian lớn nhất (tính bằng ms) đợi tín hiệu CTS
trước khi đặt thuộc tính CommEvent là CTSTO và tạo sự kiện OnComm. Cú pháp:
MSComm1.CTSTimeout = NumTime
CTSHolding:
Xác định đã có tín hiệu CTS hay chưa, tín hiệu này dùng cho quá trình bắt
tay bằng phần cứng (cho biết DCE sẵn sàng nhận dữ liệu), trả về giá trị True hay
False.
DSRHolding:
Xác định trạng thái DSR (báo hiệu sự tồn tại của DCE), trả về giá trị True
hay False.
CDHolding:
Xác định trạng thái CD, trả về giá trị True hay False.
DTREnable:
Đặt hay xoá tín hiệu DTR để báo sự tồn tại của DTE. Cú pháp:
MSComm1.DTREnable = True | False
RTSEnable:
Đặt hay xoá tín hiệu RTS để yêu cầu truyền dữ liệu đến DTE. Cú pháp:
MSComm1.RTSEnable = True | False
NullDiscard:
Cho phép nhận các ký tự NULL (rỗng) hay không (= True: cấm). Cú pháp:
MSComm1.NullDiscard = True | False
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:
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 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.
12.6. Xử lý lỗi
Trong quá trình truyền thông, việc phát sinh lỗi là khó tránh khỏi. Do vậy
cần chú ý bẫy lỗi và xử lý các lỗi để tránh làm ngắt chương trình giữa chừng do lỗi
phát sinh.
Các vị trí bẫy và xử lý lỗi cần chú ý:
- Mở, đóng cổng
- Gửi, nhận dữ kiệu
Chương trình:
File Comm.vbp:
Type=Exe
Form=Form1.frm
Reference=*\G{00020430-0000-0000-C000-
000000000046}#2.0#0#C:\WINDOWS\system32\stdole2.tlb#OLE Automation
Object={648A5603-2C6E-101B-82B6-000000000014}#1.1#0;
MSCOMM32.OCX
IconForm="Form1"
Startup="Form1"
HelpFile=""
ExeName32="Comm.exe"
Command32=""
Name="Comm"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="DHSPKTHY"
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
File Form1.frm:
VERSION 5.00
Object = "{648A5603-2C6E-101B-82B6-000000000014}#1.1#0";
"MSCOMM32.OCX"
Begin VB.Form Form1
Caption = "COM Communication"
ClientHeight = 2055
ClientLeft = 60
ClientTop = 450
ClientWidth = 5100
LinkTopic = "Form1"
ScaleHeight = 2055
ScaleWidth = 5100
StartUpPosition = 3 'Windows Default
Begin VB.Timer Timer1
Interval = 100
Left = 3300
Top = 120
End
Begin VB.CommandButton cmdColse
Caption = "Close"
Height = 315
Left = 4020
TabIndex = 8
Top = 1500
Width = 975
End
Begin VB.TextBox txtRead
Height = 315
Left = 1200
TabIndex = 6
Top = 1020
Width = 3795
End
Begin VB.CommandButton cmdSend
Caption = "Send"
Enabled = 0 'False
Height = 315
Left = 4020
TabIndex = 5
Top = 600
Width = 975
End
Begin VB.TextBox txtSend
Height = 315
Left = 1200
TabIndex = 4
Top = 600
Width = 2715
End
Begin VB.CommandButton cmdOpenPort
Caption = "Open port"
Height = 315
Left = 1260
TabIndex = 2
Top = 180
Width = 1395
End
Begin VB.TextBox txtPort
Height = 315
Left = 600
TabIndex = 1
Text = "1"
Top = 180
Width = 555
End
Begin MSCommLib.MSComm MSComm1
Left = 4440
Top = 60
_ExtentX = 1005
_ExtentY = 1005
_Version = 393216
DTREnable = -1 'True
End
Begin VB.Label Label1
AutoSize = -1 'True
Caption = "Read data:"
Height = 195
Index = 2
Left = 120
TabIndex = 7
Top = 1080
Width = 795
End
Begin VB.Label Label1
AutoSize = -1 'True
Caption = "Data to send:"
Height = 195
Index = 1
Left = 120
TabIndex = 3
Top = 660
Width = 960
End
Begin VB.Label Label1
AutoSize = -1 'True
Caption = "Port:"
Height = 195
Index = 0
Left = 120
TabIndex = 0
Top = 240
Width = 330
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
'Quy trinh:
'1. Thiet lap thong so: CONG, toc do, parity,...
'2. Mo cong: chi mo mot lan
'2. Gui/Nhan du lieu
'3. Ket thuc: dong cong
cmdSend.Enabled = False
MSComm1.CommPort = Val(txtPort.Text) 'Xac dinh cong truyen thong
MSComm1.PortOpen = True 'Mo cong
cmdSend.Enabled = True
Exit Sub
loi:
MsgBox Err.Description
End Sub
USB (Universal Serial Bus) là một chuẩn kết nối tuần tự trong máy tính.
USB sử dụng để kết nối các thiết bị ngoại vi với máy tính, chúng thường được thiết
kế dưới dạng các đầu cắm cho các thiết bị tuân theo chuẩn cắm-là-chạy (plug-and-
play) mà với tính năng gắn nóng (hot swapping) thiết bị (cắm và ngắt các thiết bị
không cần phải khởi động lại hệ thống).
Cổng USB đang được sử dụng khá phổ biến cho các thiết bị ghép nối với
máy tính hiện nay.
Các đặc điểm của USB bao gồm:
- Máy tính hoạt động như một Host.
- Có tới 127 thiết bị có thể kết nối vào máy tính bao gồm cả nối trực
tiếp hay qua USB Hub.
- Các cáp USB (USB Cable) của từng thiết bị có thể dài tới 5m hay
30m với Hub.
- Chuẩn USB2.x cho phép truyền dữ liệu trên Bus tới tốc độ 480
Mbps.
- Một cáp USB có hai dây cung cấp điện và một đôi dây xoắn
truyền dữ liệu.
- Trên dây cung cấp điện năng, điện áp có thể lên tới 500mA - 5V.
- Các thiết bị sử dụng ít điện năng được cung cấp điện năng trực tiếp
từ Bus. Các Hub có thể cung cấp điện năng cho các thiết bị nối với
nó từ nguồn điện riêng của chúng.
- Các thiết bị USB có khả năng hoán đổi nhanh, có thể cắm vào hay
rút ra khỏi Bus bất kỳ lúc nào.
- Các thiết bị USB có thể đặt ở chế độ “ngủ” (Sleep Mode) khi máy
tính chuyển sang chế độ Power-Saving.
- Các thiết bị nối với cổng USB dùng cáp USB để truyền tải dòng
điện hay dữ liệu. Khi máy tính hoạt động, nó truy vấn tới tất cả các
thiết bị nối vào Bus và gán cho mỗi thiết bị một địa chỉ. Quá trình
này được gọi là liệt kê các thiết bị. Máy tính cũng sẽ tìm ra cách
truyền dữ liệu của từng thiết bị:
- Interrupt: Các thiết bị như bàn phím gửi lượng dữ liệu rất nhỏ và
ngắt đoạn sẽ được chọn kiểu Interrupt Mode.
- Bulk: Các thiết bị như máy in thường nhận những gói dữ liệu lớn,
dùng kiểu Bulk Transfer Mode. Từng đoạn dữ liệu (64 Byte) được
gửi tới máy in và được kiểm tra tính chính xác.
- Isochronous: Các thiết bị truyền dữ liệu theo dạng Stream như loa
sẽ dùng Isochronous Mode. Dữ liệu tức thời được truyền giữa thiết
bị và máy tính và không có cơ chế sửa lỗi.
4 tiếp điểm trải phẳng. Đầu nối chuẩn B sử dụng đầu nối vuông, các tiếp điểm xếp
thành 2 hàng.
USB kiểu A bao gồm một hàng chân đánh số 1 2 3 4 còn kiếu B gồm hai
hàng chân song song đánh số 2 1 3 4 (nhìn đối điện, đếm chữ Z ,từ trái qua phải, từ
trên xuống dưới)
của USB là rất cao và phương thức truyền cũng khá phức tạp.! vì vậy tuỳ theo mục
đích sử dụng mà ta phải chọn cho đúng loại cáp (từ chiều dài cho đến loại đầu nối).
Ngoài ra để hỗ trợ cho người dùng có thể tự chế tạo các module ghép nối qua
USB, các nhà chế tạo cũng có sẵn các đế cắm USB đơn có chân để hàn lên mạch in.
Một điểm đáng lưu ý là, USB có thể có các tốc truyền dữ liệu khác nhau
(low-speed, full-speed và high-speed) thế nên sẽ ngẫu nhiên xảy ra tình huống là
một thiết bị USB tốc độ cao lại được đấu nối vào một cái khác có tốc độ thấp hơn
(VD: high-speed USB flash disk được cắm vào đầu cắm low-speed USB của PC có
mainboard đời cũ), hay một thiết bị USB tốc độ cao lại được đấu nối vào PC qua
một cáp nối tốc độ thấp. Để khắc phục tình trạng này, tất cả các thiết bị có USB đều
được trang bị hệ thống phần cứng và phần mềm thích nghi và tất cả các cáp nối đều
là loại tốc độ cao . Loại cáp tốc độ thấp được chỉ định cho những trường hợp ứng
dụng cụ thể và được nhà sản xuất ghi rõ. (vd cáp nối dùng cho chuột USB); còn
những ứng dụng video đều sử dụng cáp tốc độ cao.
Hight speed:
Cho phép truyền nhận với tốc độ lên đến 480Mbps. Chế độ truyền
thông hight speed được hỗ trợ ở USB phiên bản 2.0. Các phiên bản trước mới chỉ
hỗ trợ các tốc độ thấp và đầy đủ.
Trường địa chỉ: đầu cuối được định địa chỉ bởi 2 trường là trường địa chỉ và
trường đầu cuối.
Trường địa chỉ bao gồm 7 bit, mã hóa được 128 địa chỉ khác nhau. Cấu trúc
trường này được mô tả như hình sau:
Trường đầu cuối bao gồm 4 bit cho phép định địa chỉ một cách linh hoạt các
đầu cuối. Cấu trúc của trường này như sau:
Trường số hiệu khung: bao gồm 11 bit dùng để đánh thứ tự khung truyền.
Giá trị này sẽ tự động được tăng bởi host. Khi tăng đến giá trị tối đa thì quay về 0.
Trường dữ liệu: có độ lớn từ 0 đến 1024 byte và phải là số nguyên các byte.
Định dạng của trường này được thể hiện như ở hình sau:
Gói Token: bao gồm PID, xác định kiểu là IN, OUT hay SETUP và các
trường ADDR, ENDP.
Luông truyền thông USB được thể hiện chi tiết ở hình sau:
Bus Enumeration
Khi thiết bị USB được nối vào máy tính hoặc bị ngắt khỏi máy tính, máy tính
sẽ sử dụng một tiến trình được gọi là Bus Enumeration để nhận biết và quản lý sự
thay đổi trạng thái các thiết bị. Khi một thiết bị USB được ghép nối vào máy tính,
các xử lý sau sẽ được thực hiện:
- Khi thiết bị được ghép nối vào cổng USB, thiết bị ở trạng thái bật
nguồn
- Máy tính xác định các thay đổi bằng việc gửi các truy vấn đến
hub.
- Sau khi xác định được cổng mã thiết bị đã ghép nối vào, máy tính
chờ khoảng 100ms cho phép các kết nối được hoàn tất. Máy tính
gửi lệnh khởi tạo đến cổng.
- Hub tiến hành khởi tạo lại cổng, khi kết thúc quá trình khởi tạo,
cổng được chép phép kích hoạt. Thiết bị USB vào trạng thái mặc
định và có thể tiêu thụ một dòng điện không quá 100mA của
Vbus. Tất cả các thanh ghi và trạng thái đều được khởi tạo.
- Máy tính gán cho thiết bị một địa chỉ duy nhất, đưa thiết bị vào
trạng thái định địa chỉ.
- Trước khi thiết bị nhận được địa chỉ duy nhất, ống điều khiển mặc
định vấn duy trì truy cập thông qua địa chỉ mặc định. Máy tính
được các thông tin mô tả thiết bị và xác định kích thước dữ liệu tối
đa mà thiết bị này có thể nhận để ống mặc định sử dụng truyền
thông với thiết bị.
- Máy tính đọc các thông tin cấu hình của thiết bị bằng cách đọc các
cấu hình từ 0 đến n-1 khi có n cấu hình. Tiến trình này có thể phải
mất vài ms để hoàn tất.
- Trên cở sở các thông tin cấu hình máy tính xác định được thiết bị
hoạt động như thế nào. Máy tính sẽ gán một cấu hìnhg cho thiết bị.
Thiết bị bây giờ chuyển vào trạng thái đã được cấu hình.
Khi thiết bị được tháo khỏi cổng USB, Hub sẽ gửi một thông báo đến máy
tính. Máy tính sẽ vô hiệu hóa cổng mà thiết bị vừa tháo khỏi.
Sử dụng trình điều khiển riêng: có những lúc các trình điều khiển có sẵn của
windows hay của các hãng sản xuất chip không đáp ứng được yêu cầu sử dụng, khi
đó ta cần phải tạo ra trình điều khiển riêng cho thiết bị.
tích hợp sẵn trên motherboards. Microsoft không còn tiếp tục hỗ trợ cho cổng
GAME từ phiến bản hệ điều hành Windows Vista, vì vậy có thể các nhà sản xuất sẽ
không chế tạo ra các board có hỗ trợ cổng này nữa.
THỰC HÀNH
Bài 17: Cơ bản về VB6
- Bài 2: Viết chương trình nhập vào 2 số nguyên n1, n2 và hiển thị các số
lẻ từ n1 đến n2 và tổng của chúng.
Nhập:
Kết quả:
- Bài 2: Viết thủ tục hoán đổi 2 giá trị cho nhau
Đầu vào là 2 biến có kiểu bất kỳ
Đầu là các biến đã truyền vào nhưng với nội dung đã được hoán đổi.
- Xừ lý ảnh, vẽ hình
- Kỹ thuật tạo chuyển động
23.2. Bài tập thực hành
- Bài 1: Lập trình vật di chuyển theo 1 quỹ đạo thẳng
- Bài 2: Lập trình động cơ quay, có đảo chiều, tốc độ
- Bài 3: Lập trình băng tải phân loại hàng
Bài 29: Lập trình mô phỏng điều khiển hệ thống qua cổng COM
[1] Jan Axelson, "Paranell Port Complete", Lakeview Research LLC, 2007
[2] Jan Axelson, "Serial Port Complete", Lakeview Research LLC, 2007
[5] Nguyễn Hữu Anh , "Lập trình Visual Basic 6.0", Nhà xuất bản Giáo dục,
2000