Chương III :
CHƯƠNG TRÌNH TRUYỀN THÔNG BẰNG NGÔN NGỮ VISUAL BASIC
6.0
I. Tổng quan về Visual Basic :
Visual Basic là ngôn ngữ lập trình trên môi trường Windows ra đời sớm nhất,
và đã thực sự tạo nên một cuộc cách mạng trong công nghệ phần mềm .cho nên khi
phát hành Visual Basic 1.0 vào năm 1991, ông Bill Gates, chủ tòch hãng Microsoft đã
gọi Visual Basic là một sản phẩm “đáng nể”, còn các nhân vật nổi tiếng khác trong
giới công nghệ phần mềm cũng không tiếc lời khen ngợi công cụ lập trình trực quan
này.
Nếu đã từng cảm thấy thực sự thích thú khi chuyển từ việc sử dụng hệ điều
hành MS-DOS sang Windows thì ta cũng dễ hiểu những lời khen ngợi này. Trước đây,
khi làm việc trong môi trường DOS, không ít người đã cảm thấy thực sự khó khăn với
việc phải nhớ những câu lệnh để nhập vào từ dấu nhắc DOS. Windows đã giải quyết
khó khăn này cho người dùng bằng cách sử dụng một giao diện đồ họa với những nút
lệnh, hộp thoại chuẩn, các menu để chọn lựa…Tuy nhiên trước khi Visual Basic ra đời
thì để tạo được một ứng dụng trong Windows, các lập trình viên sử dụng C phải tốn
rất nhiều công sức dành cho việc tạo giao diện cho chương trình. Chỉ có việc tạo một
nút lệnh không thôi đã cần phải dùng đến hàng trăm dòng ma.
Với VisualBasic, công việc tạo giao diện đã trở nên dễ dàng hơn bao giờ hết.
Chỉ với một vài thao tác click – drag đơn giản, ta đã có thể bổ sung vào các cửa sổ
còn trống các lệnh đơn, các hộp văn bản, các nút lệnh, các nút tùy chọn, các nhãn,
các hộp kiểm…Sau khi tạo giao diện thì công việc của ta chỉ là viết mã cho các đối
tượng này (gọi là các điều khiển : Control). Như vậy, có thể nói, với Visual Basic
công việc tạo giao diện đồ họa cho ứng dụng đã được Visual Basic đảm nhận.
Visual Basic cho phép ứng dụng tạo ra liên kết với các ứng dụng Windows
khác rất dễ dàng, cho phép dễ dàng tạo ra các ứng dụng thiên về quản lý dữ liệu và
mạng.
Visual Basic cho phép người sử dụng giao tiếp với thư viện liên kết động DLL.
Điều này giúp giảm kích cỡ chương trình, tập tin thực thi và đặc biệt là làm cho
chương trình có khả năng được nâng cấp dễ dàng hơn.
Visual Basic còn cung cấp một số phương pháp bẫy lỗi trong ứng dụng. Đây là
một công cụ rất mạnh của Visual Basic.
II. Truyền thông nối tiếp dùng visual basic:
Do sự phát triển ngày càng tăng của các ứng dụng truyền thông qua cổng nối
tiếp ,từ phiên bản 4.0 của Visual Basic ,điều khiển truyền thông đã được hoàn chỉnh
để sử dụng cho việc lập trình ghép nối máy tính qua cổng nối tiếp .Trong phần này ta
sẽ tìm hiểu về điều khiển này .
1. Điều khiển truyền thông:
Bình thường khi chạy phần mềm Visual Basic ta chỉ thấy có một số thành phần
quen thuộc trên hộp công cụ (toolbox) .Nhưng Visual Basic cho phép nhiều thành
phần có thể được bổ sung thêm vào .Điều khiển truyền thông Mscomm của Visual
Basic là một trong số các đối tượng có thể được bổ sung để tham gia vào một số ứng
dụng cần việc chuyển nhận dữ liệu qua cổng nối tiếp .
Trong Visual Basic 5.0 và 6.0 ta có thể bổ sung thành phần Mscomm đề cập ở
trên như sau : Chọn Project => Components (Ctrl – T) ,cửa sổ sau sẽ xuất hiện.
Điều khiển truyền thông cung cấp hai khả năng để 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 được sử dụng trong quá trình điều khiển việc trao đổi thông tin nối tiếp
khi nó giải phóng máy tính để làm các công việc khác .Trong nhiều tình huống, ta cần
được thông báo về sự thay đổi. Thí dụ như ta cần biết khi có ký tự gửi đến hoặc sự
thay đổi xảy ra trên đường DCD (Data Carrier Detect ) hoặc đường RTS (Request To
Send). Để làm điều đó ta sẽ sử dụng sự kiện truyền thông OnComm để bẫy và điều
khiển các sự kiện. Điều khiển truyền thông còn phát hiện và điều khiển các lỗi
truyền thông.
• Hỏi Vòng (Polling): Ta cũng có thể hỏi vòng các sự kiện và lỗi
bằng cách kiểm tra giá trò của đặc tính ComEvent sau mỗi chu kỳ của chương trình để
xác đònh xem liệu một sự kiện hoặc một lỗi đã xuất hiện. Chẳng hạn, chương trình có
thể tạo vòng lặp để chờ một ký tự cần được nhận. Cứ mỗi lần như vậy, ký tự được đọc
từ bộ đệm nhận. Thông thường phương pháp này được sử dụng khi chương trình có
thời gian để tiến hành hỏi vòng bộ nhận thông tin, hay nói cách khác là trong các ứng
dụng không lớn.
Visual Basic sử dụng các bộ điều khiển cửa sổ chuẩn cho các cổng truyền tin
nối tiếp (như serialui.dll và serial.vxd ). Điều khiển truyền thông được bổ sung cho
ứng dụng của một cổng nối tiếp, nói khác đi mỗi điều khiển truyền thông mà ta dùng
chỉ có thể điều khiển một cổng nối tiếp. Nếu cần truy nhập nhiều cổng trong ứng
dụng thì ta phải dùng nhiều điều khiển truyền thông. Đòa chỉ cổng và đòa chỉ ngắt có
thể thay đổi nhờ Control Panel trong Windows .Các tham số (như tốc độ truyền theo
bit ,chẵn lẻ ,…) đều có thể được thay đổi bằng cách lựa chọn: Control Panel =>
System => Device Manager => Port (COM và LPT) =>Port Settings. Việc thiết lập
các cổng truyền thông (IRQ và đòa chỉ cổng) có thể thay đổi bằng cách lựa chọn
Control Panel => System => Device Manager => Port (COM và LPT) =>
Resources.
2 .Thuộc tính (property):
Thành phần Comm được bổ sung vào biểu mẫu ( Form ) bất cứ lúc nào cần đến
việc truyền thông nối tiếp. Theo mặc đònh, cổng thứ nhất tạo ra đối tượng có tên
MSComm1, đối tượng ứng với cổng thứ hai được gọi là MSComm2,…Có thể nhìn thấy
các đặc tính chính của đối tượng là : CommPort, DTREnable, EOFEnable,
HandShaking ,InBufferSize, Index, InputLen, Inputmode, Left, Name, NullDiscard,
OutBufferSize, ParityReplace, Rthreshold, RTSEnable, Settings, SThreshold, Tag,
Top. Ta thấy điều khiển truyền thông có nhiều thuộc tính, nhưng để có thể làm việc
với điều khiển truyền thông, trước hết ta cần hiểu kỹ các thuộc tính chính được liệt kê
trong bảng sau .
Các
thuộc
tính
CommPort
Input(nhập
vào)
Output(xuất
ra)
PortOpen
Settings
Sự mô tả
Đặt và trả lại số cổng truyền thông
Trả lại và loại bỏ các ký tự khỏi bộ đệm nhận
Viết một xâu ký tự tới vào bộ đệm truyền
Mở/Đóng một cổng (tùy thuộc vào thông số) và đặt
thông số cho cổng .
Đặt và trả lại các tham số truyền thông như :tốc độ
truyền theo bit ,chẵn lẻ ,số các bit dữ liệu ,…
Thí dụ sau đây chỉ ra cách truyền thông qua cổng nối tiếp có thể được tiến
hành như thế nào bằng cách sử dụng một Modem.
Private sub Form_load()
‘biến để lưu giữ chuỗi nhập vào
Dim Instring as String
‘sử dụng COM1
Mscomm11.ComPort = 1
‘9600 baud ,no parity ,8 bit data ,1 stop bit
Mscomm11.Settings = ”9600 ,N,8,1”
‘ra lệnh cho điều khiển Mscomm1 đọc hết bộ đệm nhận khi dùng
‘lệnh Input
Mscomm11.InputLen = 0
‘mở cổng
Mscomm11.PortOpen = True
‘gửi lệnh attention tới MODEM
Mscomm11.Output = “ATV1Q0” & Chr$(13) ‘để chắc rằng
‘MODEM trả lời “OK”
‘đợi dữ liệu trả lời gửi về cổng nối tiếp
Do
DoEvents
Buffer$ = Buffer$ & MSComm1.Input
Loop Until InStr(Buffer$ , “OK” &vbCRLF)
‘đọc dữ liệu trả lời “OK”
‘đóng cổng nối tiếp
Mscomm11.PortOpen = False
End Sub
Sau đây ta sẽ lần lượt tìm hiểu một số thuộc tính quan trọng của điều khiển
truyền thông .
Thuộc tính Settings
Thuộc tính Settings đặt và trả lại các thông số truyền
thông cho cổng RS-232, như tốc độ baud, tính chẵn
lẻ, số bit dữ liệu và số các bit dừng.
Cú pháp của câu lệnh là :
[form.]Mscomm1.Settings [=paramString$]
•
Nếu paramString$ không hợp lệ (valid) thì khi mở cổng, điều khiển
truyền thông sẽ phát sinh lỗi 380 ( lỗi giá trò thuộc tính không hợp lệ ).
•
ParamString$ là một chuỗi chứa 4 thông số thiết lập cho cổng truyền
thông RS-232 và có dạng như sau :
“BBBB ,P ,D ,S”
Ở đây BBBB xác đònh tốc độ baud, P là bit chỉ tính chẵn lẻ, D là số bit dữ liệu
và S là số các bit dừng (stop bits). Giá trò mặc đònh của paramString$ là : “9600, N,
8,1”
Bảng sau đây liệt kê các giá trò baud hợp lệ :
Số bit dữ liệu hợp lệ trong một
• lần truyền (khung truyền) là : 4 ,5 ,6 ,7
Thô,8ng(default)
số
110
2400
19200
57600
300
4800
28800 115200
600
9600
38400 128000
1200 14400 56000 256000
Số bit Stop hợp lệ là : 1 ,1.5 ,2.
Thí dụ sau cho phép đặt thông số cho cổng truyền ở tốc độ baud là 4800,không
kiểm tra bit chẵn lẻ ,8 bit dữ liệu ,1 bit dừng :
Mscomm11.Settings =”4800 ,N ,8 ,1”
Kiểu dữ liệu của Mscomm11.Settings là : String .
Thuộc tính CommPort :
Thuộc tính này đặt và trả lại số cổng truyền thông .Cú pháp của câu lệnh là :
[form.].CommPort [=portnumber%]
Trong khi thiết kế (design time) ta có thể đặt Portnumber% bằng một giá trò
nằm trong khoảng từ 1 đến 16 (giá trò mặc đònh là 1). Trước khi dùng lệnh PortOpen
phải thiết lập cổng bằng CommPort. Nếu ta dùng thuộc tính PortOpen trước khi thiết
lập cổng bằng CommPort thì điều khiển truyền thông sinh ra lỗi 68 (cổng không tồn
tại).
Kiểu dữ liệu : Integer
Thuộc tính PortOpen :
Thuộc tính PortOpen đặt và trả lại trạng thái của cổng truyền thông (đóng hoặc
mở). Thuộc tính này không có trong thời gian thiết kế chương trình. Cú pháp của câu
lệnh là :
[form.] MSComm.PortOpen [={True/ False}]
Thông số thiết lập là True để mở cổng, còn False để đóng (giải phóng) cổng và
xóa nội dung các bộ đệm nhận và truyền MSComm tự động đóng cổng nối tiếp khi
ứng dụng kết thúc (Terminated).
Trước khi dùng thuộc tính này (PortOpen), phải đặt thông số cổng bằng thuộc
tính CommPort với một giá trò hợp lệ, nếu ta quên đi thuộc tính này lỗi 68 sẽ phát
sinh.
Thí dụ sau đây mở cổng truyền thông số 1 (COM1) với tốc độ baud là 4800
baud, không kiểm tra tính chẵn lẻ, 8 bit dữ liệu, 1 bit stop:
MSComm1.Settings = “4800 ,N ,8 ,1”
MSComm1.CommPort=1
MSComm1.PortOpen=True
Kiểu dữ liệu : Boolean.
Các thuộc tính phục vụ việc nhập dữ liệu (Input ,InBufferCount và
InBufferSize)
a. Thuộc tính Input :
Thuộc tính Input trả lại và xóa bỏ một chuỗi ký tự từ bộ đệm nhận. Thuộc tính
này không sẵn có trong khi thiết kế và là chỉ đọc (Read_only) khi chạy chương trình.
Cú pháp của câu lệnh là :
[form.] MSComm.Input
Thuộc tính InputLen quy đònh số ký tự được đọc bởi câu lệnh Input. Để xác
đònh số các ký tự trong bộ đệm, thuộc tính InBufferCount được kiểm tra. Đặt InputLen
là 0 để đọc toàn bộ nội dung của bộ đệm nhận.
Thuộc tính InputMode quyết đònh kiểu dữ liệu thu về qua thuộc tính Input. Nếu
thuộc tính này được set là CommInputModeText thì thuộc tính Input sẽ trả về dữ liệu
kiểu text vào 1 biến Variant. Nếu InputMode là comInputModeBinary thì Input sẽ trả
về dữ liệu nhò phân trong một mảng các byte vào một biến Variant .
Thí dụ dưới đây chỉ ra cách đọc dữ liệu từ bộ đệm nhận.
MSComm1.InputLen= 0 ‘đọc toàn bộ nội dung của bộ đệm ‘nhận
‘kiểm tra có dữ liệu hay không
If MSComm1.InbufferCount then
‘đọc dữ liệu
InString$ = MSComm1.Input
End if
Kiểu dữ liệu Variant.
b. Thuộc tính InBufferSize:
Thuộc tính InBufferSize đặt và trả lại kích thước bộ đệm nhận, tính theo số
byte. Cú pháp của câu lệnh là :
[form.]MSComm .InBufferSize [=numbyte%]
Thuộc tính này có liên quan đến kích thước bộ đệm nhận. Giá trò mặc đònh là
1024 bytes. Kích thước của bộ đệm phải được đặt sao cho có thể cất giữ được số lớn
nhất của các ký tự sẽ được nhận trước khi chương trình ứng dụng có thể đọc chúng từ
bộ đệm, trừ khi ta làm việc ở chế độ bắt tay (handshaking).
Kiểu dữ liệu của thuộc tính này là Integer.
c. Thuộc tính InBufferCount:
Thuộc tính InBufferCount trả lại số ký tự trong bộ đệm nhận. Nó cũng có thể
được sử dụng để xóa bộ đệm bằng cách đặt số của các ký tự bằng 0. Thuộc tính này
không có trong thời gian thiết kế chương trình (design time). Cú pháp câu lệnh như
sau:
[form.]MSComm.InBufferCount [=count%]
Ta có thể xóa bộ đệm nhận bằng cách đặt thuộc tính InBufferCount = 0.
Kiểu dữ liệu của thuộc tính này là Integer.
Các thuộc tính phục vụ việc xuất dữ liệu (Output ,OutBufferCount và
OutBufferSize )
a. Thuộc tính Output:
Thuộc tính Output sẽ viết một chuỗi ký tự vào bộ đệm truyền, thuộc tính này
không có trong thời gian thiết kế chương trình. Cú pháp câu lệnh là :
[form.]MSComm.Output [=outstring$]
Thí dụ sau đây cho biết cách gửi các ký tự mà người dùng gõ vào từ bàn phím:
Private Sub Form_load (KeyAscii as Integer)
MSComm1.Outport =Chr$(KeyAscii)
End Sub
Thuộc tính Output có thể xuất dữ liệu dạng text hay dạng binary. Để gửi dữ
liệu text, ta phải khai báo một biến kiểu Variant và cho nó chứa chuỗi muốn gửi, sau
đó gán biến này cho thuộc tính Output. Để gửi dữ liệu dạng binary, ta phải truyền một
biến Variant chứa một mảng các byte cho thuộc tính Output .
Thông thường, nếu ta gửi một chuỗi theo chuẩn ANSI tới ứng dụng, ta có thể
gửi dữ liệu dạng text. Nếu ta có dữ liệu mà chứa các ký tự điều khiển được nhúng
(embedded) như các ký tự NULL,… thì ta sẽ truyền dữ liệu theo dạng binary.
Kiểu dữ liệu của thuộc tính này là Variant.
b. Thuộc tính OutBufferSize :
Thuộc tính OutBufferSize đặt và trả lại kích thước của các ký tự trong bộ đệm
truyền. Cú pháp của câu lệnh là :
[form.] MSComm.OutBufferSize [=numbyte%]
Giá trò mặc đònh của thuộc tính này là 512 bytes. Không nên nhầm lẫn giữa hai
thuộc tính OutBufferCount và OutBufferSize với nhau. Thuộc tính OutBufferCount
nói lên số bytes hiện đang có trong bộ đệm truyền, còn OutBufferSize quy đònh tổng
kích thước của bộ đệm truyền. Không nên để kích thước bộ đệm truyền quá lớn. Tuy
nhiên nếu để quá nhỏ thì sẽ xảy ra hiện tượng tràn dữ liệu (trừ khi làm việc ở chế độ
bắt tay). Thông thường nên bắt đầu với kích thước bộ đệm truyền là 512 bytes. Nếu
lỗi tràn xảy ra thì phải tăng kích thước bộ đệm cho thích hợp với ứng dụng hiện tại.
Kiểu dữ liệu của thuộc tính này Integer.
c. Thuộc tính OutBufferCount :
Thuộc tính OutBufferCount trả lại số ký tự trong bộ đệm truyền. Nhờ thuộc
tính này ta có thể xóa nội dung bộ đệm truyền bằng cách đặt giá trò của
OutBufferCount=0. Cú pháp của câu lệnh là :
[form.]MSComm.OutBufferCount [=value%]
Kiểu dữ liệu của thuộc tính này là Integer.
d. Thuộc tính RTSEnable :
Thuộc tính này xác đònh xem liệu có cho phép đường RTS hay không.
Thông thường tín hiệu RTS (Request To Send) được gửi từ máy tính tới MODEM để
yêu cầu sự cho phép truyền dữ liệu. Cú pháp câu lệnh như sau:
[form.]Mscomm1.RTSEnable [=(True | False)]
Ta xác lập giá trò này là True để đặt đường RTS lên mức cao nếu cổng đang
mở và xuống mức thấp nếu cổng đang đóng. Đường RTS được sử dụng khi có bắt tay
phần cứng sử dụng RTS/CTS. Thuộc tính RTSEnable cho phép hỏi vòng đường RTS
nếu ta cần xác đònh trạng thái của nó.
Kiểu dữ liệu của thuộc tính này : Boolean.
e. Thuộc tính CommEvent :
Thuộc tính này trả lại hầu hết sự kiện hoặc lỗi truyền thông gần nhất. Thuộc
tính này không có sẵn trong khi thiết kế và là chỉ đọc khi chạy chương trình. Cú pháp
câu lệnh là:
[form.]Mscomm1.CommEvent
Mặc dù sự kiện OnComm được phát sinh mỗi khi có một sự kiện hay lỗi truyền
thông xảy ra nhưng thuộc tính CommEvent lại chứa mã số của sự kiện hay là lỗi
truyền thông đó .Như vậy để xác đònh xem điều gì đã xảy ra thì ta phải kiểm tra thuộc
tính CommEvent .
Các lỗi truyền thông bao gồm :
Hằng số
Giá trò Mô tả
comEventBreak
1001
Đã nhận được tín hiệu Break
comEventFrame
1004
Phần cứng phát hiện một lỗi khung truyền
comEventOverrun 1006
Tràn cổng .Phần cứng không thể đọc được ký tự
này trước khi ký tự kế gửi đến và bò mất
comEventRxOver 1008
Tràn bộ đệm nhận .Hết chỗ trong bộ đệm nhận
comEventRxParit 1009
Phần cứng phát hiện ra một lỗi chẵn lẻ
y
comEventTxFull
1010
comEventDCB
1011
Bộ đệm truyền đầy .Bộ đệm truyền bò đầy khi cố
đưa thêm ký tự vào hàng đợi
Một lỗi xuất hiện ở bộ điều khiển dữ liệu(Data
Control Block) của port
Các sự kiện truyền thông bao gồm:
Hằng số
ComEvSend
Giá
trò
1
Mô tả
Có ít hơn số ký tự đònh bởi SThreshold trong bộ đệm
truyền
comEvReceive 2
Đã nhận số ký tự bằng với số ký tự đònh bởi Rthreshold
.Sự kiện này được phát ra liên tục cho đến khi ta dùng
thuộc tính Input để chuyển dữ liệu khỏi bộ đệm nhận .
ComEvCTS
3
Có sự thay đổi trên đường CTS
ComEvDSR
4
Có sự thay đổi trên đường DSR .Sự kiện này chỉ phát
sinh khi DSR chuyển từ 1 về 0
ComEvCD
5
Có sự thay đổi trên đường CD (Carrier Detect)
ComEvRing
6
Phát hiện tiếng chuông (gọi). Một số vi mạch UART
không hỗ trợ việc này.
ComEvEOF
7
Ký tự EOF (Mã ASCII 26) được nhận.
Kiểu dữ liệu của thuộc tính này : Integer
f. Thuộc tính InputLen
Đặt và trả lại số ký tự mà thuộc tính Input đọc được từ bộ đệm nhận .Giá
trò mặc đònh của thuộc tính này là bằng 0 .Đặt InputLen =0 để điều khiển truyền
thông đọc hết nội dung bộ đệm nhận .Cú pháp câu lệnh như sau :
[form.] Mscomm1.InputLen [=numchars%]
Thuộc tính này rất có hữu ích khi đọc dữ liệu từ các máy có lối ra được đònh
dạng cố đònh về chiều dài khối dữ liệu .
Kiểu dữ liệu của thuộc tính này : Integer
g. Thuộc tính ParityReplace
Đặt và trả lại ký tự dùng thay thế ký tự không hợp lệ trong dòng dữ liệu khi lỗi
chẵn lẻ xảy ra .Cú pháp :
[form.]Mscomm1.ParityReplace [=char$]
Bit chẵn lẻ là bit được truyền cùng với các bit dữ liệu và được dùng cho việc
kiểm tra lỗi .Khi dùng bit chẵn lẻ ,điều khiển truyền thông sẽ cộng tất cả các bit có
giá trò bằng 1 và kiểm tra tổng số các bit đó xem là chẵn hay lẻ (tương ứng với việc
xác lập bit chẵn lẻ khi mở cổng ) .Theo mặc đònh ,điều khiển dùng dấu chấm hỏi (?)
để thay thế các ký tự không hợp lệ .Đặt ParityReplace là “ “ để bỏ khả năng thay thế
ký tự khi lỗi chẵn lẻ xuất hiện .Sự kiện OnComm vẫn được phát sinh và thuộc tính
CommEvent được đặt thành comEventRxParity .
Kiểu dữ liệu của thuộc tính này : String
h. Thuộc tính Rthreshold
Đặt và trả lại số ký tự sẽ nhận trước khi điều khiển Mscomm1 đặt thuộc tính
comEvent thành comEvReceive và phát sinh sự kiện OnComm .Cú pháp :
[form.] Mscomm1.Rthreshold [=numchar%]
Xác lập bằng 0 để làm mất khả năng phát sinh sự kiện OnComm khi nhận các
ký tự .Xác lập bằng 1,chẳng hạn, để làm phát sinh sự kiện OnComm mỗi khi có 1 ký
tự được nhận vào bộ đệm nhận
Kiểu dữ liệu của thuộc tính này : Integer
♣ Hàm ComInput
Trả lại và xóa chuỗi ký tự ở bộ đệm nhận .Cú pháp như sau :
ComInput(ByVal hwnd As Integer ,LpData as Any ,ByVal do Data as Integer )
As Integer
Hàm này tương tự như thuộc tính Input nhưng trả lại số byte nhận được .
♣ Hàm ComOutput
Viết một chuỗi ký tự vào bộ đệm truyền .Cú pháp như sau :
ComOutput(ByVal hwnd As Integer ,LpData as Any ,ByVal do Data as
Integer ) As Integer
Hàm này tương tự như thuộc tính Output nhưng trả lại số byte ký tự được gửi đi
3. Sự kiện Oncomm
Sự kiện OnComm được phát sinh vào bất cứ khi nào giá trò của thuộc tính
CommEvent thay đổi . Cú pháp sự kiện :
Private Sub [form.]Mscomm1_OnComm()
Thuộc tính CommEvent chứa mã số của lỗi hay sự kiện phát sinh bởi sự kiện
OnComm. Nếu đặt các thuộc tính Rthreshold hoặc SThreshold bằng 0 sẽ vô hiệu bẫy
sự kiện Receive và Send .
4. Hỏi vòng ở cổng RS-232 :
Thường khi làm việc với điều khiển Mscomm1, ta dùng phương pháp điều
khiển theo sự kiện .Nhưng ta cũng có thể sử dụng kỹ thuật hỏi vòng để thông tin qua
cổng RS-232. Chương trình ví dụ sau đây sử dụng COM2 để gửi thông báo “Hello” và
sau đó chờ chuỗi nhận. Kỹ thuật này quy đònh là sẽ nhận được đáp ứng bằng cách
kiểm tra liên tục số các ký tự nhận được trong bộ đệm nhận (InBufferCount). Khi có
nhiều hơn một ký tự trong bộ đệm lối vào thì ký tự này sẽ được đọc. Chương trình như
sau :
Private Sub Form_Load()
Dim Str as String ‘chuỗi để chứa dữ liệu nhập
Mscomm11.ComPort =2 ‘dùng COM2
Mscomm11.Settings=”9600 ,N ,8 ,1” ‘9600 baud ,không
‘parity ,8 bits data ,1 ‘stop bit
Mscomm11.InputLen=0
‘đọc hết bộ đệm lối vào khi Input đã
được dùng
Mscomm11.PortOpen=True ‘mở cổng
Text1.text=”Sending : Hello”
Mscomm11.Output=”Hello”‘gửi thông báo
Do
‘chờ đáp ứng từ cổng
DoEvents
Loop Until Mscomm11.InBufferCount>=2
Str = Mscomm11.Input
‘đọc bộ đệm Input
Text2.Text=”Received:” +Str
Mscomm11.PortOpen=False‘đóng cổng nối tiếp
End Sub
5. Các thông báo lỗi (Error Messages Code)
Số
lỗi
Mô tả
Số lỗi
380
Giá trò thuộc tính không hợp lệ
8009
Thuộc tính là chỉ đọc,
comSetNotSupport
Thuộc tính là chỉ đọc,
394
comGetNotSupport
Tác động không hợp lệ lên
8000
cổng đã mở
8001 Giá trò timeout cần phải lớn hơn
383
8010
8011
Mô tả
Lỗi ở các thông số mặc
đònh
Phần cứng không sẵn dùng
(bò khóa bởi thiết bò khác)
Không thể đònh vò được
hàng đợi (queues)
8012
Cổng chưa mở
8013
Cổng đã mở rồi
Zero
8002
8003
8004
8005
8006
8007
8008
Số cổng không hợp lệ
Thuộc tính chỉ có khi chạy
chương trình
Thuộc tính là chỉ đọc khi chạy
chương trình
Cổng đã mở rồi
Số nhận dạng thiết bò là không
hợp lệ hoặc không được hỗ trợ
Giá trò Baud xác đònh là không
hợp lệ
Kích thước byte xác đònh là
không hợp lệ
III. Phần giao diện :
8014
8015
8016
8018
8019
8020
8021
Không thể cho phép khai
báo(nitification)comm
Không đặt trạng thái cho
comm được
Không đặt mặt nạ sự kiện
comm được
Tác động chỉ hợp lệ khi
cổng đã mở
Thiết bò bận
Lỗi đọc thiết bò truyền
thông
Lỗi bên trong liên quan
khối điều khiển thiết bò của
port
Chương trình giao tiếp nối tiếp dùng ngôn ngữ Visual Basic như sau:
‘Phần khai báo biến toàn cục trrong module
public LenhT, DiaChi As String 'bien chua ma lenh dua ve cho
vi xu ly
Public GTNhan As Variant
' bien chua data tu vi xu
ly gui len
Public Byte1, Byte2, Byte3, Byte4 As String
'la 4 byte nhan duoc tu vi xu ly
'byte1 chua dia chi cua vxl
'byte2 chua gia tri nhiet do
'byte3 chua so nguoi trong phong
'byte4 trang thai den va quat
Public Byte21, Byte22, Byte23, Byte24 As String
'cac bien cho phong 2
Public Const AnNinh = "Khong co nguoi la xam nhap"
Public Const KAnNinh = "Canh bao co nguoi la xam nhap"
‘ ham truyen du lieu toi cac vi xu li
Public Sub TRUYEN(GIATRI As String)
Dim i As Integer
frmchinh.MSComm1.RTSEnable = True
frmchinh.MSComm1.Output = GIATRI
For i = 0 To 10000
i = i + 1
Next i
frmchinh.MSComm1.RTSEnable = False
End Sub
‘ Ham nhan du lieu tu vi xu li
Public Sub NHAN()
Dim i, thongbao As Integer
Dim Test As String
frmchinh.MSComm1.RTSEnable = False
For i = 1 To 30000
i = i + 1
Next i
Do
DoEvents
Loop Until (frmchinh.MSComm1.InBufferSize >= 4) Or (i >=
30000)
GTNhan = frmchinh.MSComm1.Input
'thuc hien gan gia tri cho bytei (i=1-4)
Test = Left$(GTNhan, 1)
If Test = "A" Then
Byte1 = Left$(GTNhan, 1)
Byte2 = Mid$(GTNhan, 2, 1)
Byte3 = Mid$(GTNhan, 3, 1)
Byte4 = Right$(GTNhan, 1)
Else
If Test = "B" Then
Byte21 = Left$(GTNhan, 1)
Byte22 = Mid$(GTNhan, 2, 1)
Byte23 = Mid$(GTNhan, 3, 1)
Byte24 = Right$(GTNhan, 1)
Else
thongbao = MsgBox("So lieu truyen ve bi loi.Can
xem lai duong truyen", vbOKOnly, "Loi duong truyen")
End If
End If
End Sub
‘********************************************************
‘Chuong trinh trong Frmchinh
‘*******************************************************
Dim ToanCuc As Variant
Dim Dem, i, j As Integer
Dim NHAN As String
Private Sub ChkP01_Click()
If ChkP01.Value = 1 Then frmP01.Show
If ChkP01.Value = 0 Then
Unload frmP01
End If
'******************************
End Sub
Private Sub ChkP02_Click()
If ChkP02.Value = 1 Then frmP02.Show
If ChkP02.Value = 0 Then
Unload frmP02
End If
'***************************
End Sub
Private Sub Command1_Click()
End
End Sub
Private Sub Form_Load()
Dim i1, i2 As Integer
ChkP03.Enabled = False
ChkP04(1).Enabled = False
LblTThai.Caption = "Binh thuong"
TxtChinh = CStr(2)
OptAuto.Value = True
'*********************************
'PHAN GIA DINH BIEN
Byte2 = "!"
Byte3 = "!"
Byte4 = "O"
Byte22 = "!"
Byte23 = "!"
Byte24 = "O"
LenhT = "a"
'*********************************
'KHOI DONG COM
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.PortOpen = True
'cho thu du lieu dua ve tu vi xu ly
frmP02.Timer1.Enabled = True
frmP01.Timer1.Enabled = True
'hien thi so nguoi len frmchinh
frmchinh.Timer1 = True
End Sub
Private Sub OptAuto_Click()
With frmP01
frmP01.fraDkP01.Enabled = False
frmP01.OptTdenP01.Enabled = False
frmP01.OptMdenP01.Enabled = False
frmP01.OptTquatP01.Enabled = False
frmP01.OptMquatP01.Enabled = False
frmP01.Frame1.Enabled = False
frmP01.Frame2.Enabled = False
End With
With frmP02
frmP02.FraDkP02.Enabled = False
frmP02.OptTdenP02.Enabled = False
frmP02.OptMdenP02.Enabled = False
frmP02.OptTquatP02.Enabled = False
frmP02.OptMquatP02.Enabled = False
frmP02.Frame2.Enabled = False
frmP02.Frame3.Enabled = False
End With
frmP01.cmdDongYP01.Enabled = False
frmP02.cmDongYP02.Enabled = False
'***********************************
End Sub
Private Sub OptDenChinh_Click()
FrmDkDen.Show
End Sub
Private Sub OptManual_Click()
With frmP01
frmP01.fraDkP01.Enabled = True
frmP01.OptTdenP01.Enabled = True
frmP01.OptMdenP01.Enabled = True
frmP01.OptTquatP01.Enabled = True
frmP01.OptMquatP01.Enabled = True
frmP01.Frame1.Enabled = True
frmP01.Frame2.Enabled = True
End With
With frmP02
frmP02.FraDkP02.Enabled = True
frmP02.OptTdenP02.Enabled = True
frmP02.OptTquatP02.Enabled = True
frmP02.OptMdenP02.Enabled = True
frmP02.OptMquatP02.Enabled = True
frmP02.Frame2.Enabled = True
frmP02.Frame3.Enabled = True
End With
frmP01.cmdDongYP01.Enabled = True
frmP02.cmDongYP02.Enabled = True
'************************************
End Sub
Private Sub OptQuatChinh_Click()
FrmDkQuat.Show
End Sub
Private Sub Timer1_Timer()
' xuat so nguoi ra frmchinh
i1 = Val(frmP01.TxtSoNguoiP01.Text)
i2 = Val(frmP02.TxtSoNguoiP02.Text)
TxtChinh.Text = CStr(i1 + i2)
End Sub
Private Sub cmdDongYP01_Click()
Dim Test As String
'xac dinh lenh hoat dong cho vxl
If (OptMdenP01.Value = False And OptMquatP01.Value =
False) Then LenhT = "C"
If (OptMdenP01.Value = False And OptMquatP01.Value =
True) Then LenhT = "D"
If (OptMdenP01.Value = True And OptMquatP01.Value =
False) Then LenhT = "F"
If (OptMdenP01.Value = True And OptMquatP01.Value =
True) Then LenhT = "G"
'xac dinh dia chi truyen la vxl 1
DiaChi = "A"
Test = LenhT
'goi ham truyen LenhT cho vi xu ly
Call TRUYEN(DiaChi)
Call TRUYEN(Test)
Stop
End Sub
Private Sub cmdThoatP01_Click()
Unload Me
frmchinh.ChkP01.Value = False
End Sub
Private Sub Option1_Click()
End Sub
Private Sub Form_Load()
If frmchinh.OptAuto.Value = True Then
With frmP01
frmP01.fraDkP01.Enabled = False
frmP01.OptTdenP01.Enabled = False
frmP01.OptMdenP01.Enabled = False
frmP01.OptTquatP01.Enabled = False
frmP01.OptMquatP01.Enabled = False
frmP01.Frame1.Enabled = False
frmP01.Frame2.Enabled = False
End With
With frmP02
frmP02.FraDkP02.Enabled = False
frmP02.OptTdenP02.Enabled = False
frmP02.OptMdenP02.Enabled = False
frmP02.OptTquatP02.Enabled = False
frmP02.OptMquatP02.Enabled = False
frmP02.Frame2.Enabled = False
frmP02.Frame3.Enabled = False
End With
End If
'**************************************
'KHOI DONG COM
If frmchinh.MSComm1.PortOpen = True Then
frmchinh.MSComm1.PortOpen = False
frmchinh.MSComm1.CommPort = 1
frmchinh.MSComm1.Settings = "9600,n,8,1"
frmchinh.MSComm1.PortOpen = True
'Cap nhat trang thai cua phong
frmP01.Timer1.Enabled = True
End Sub
Private Sub CapnhatP01()
Dim NhietdoP01, SoNguoiP01, i As Integer
Dim thongbao As String
NhietdoP01 = Asc(Byte2)
txtNhietDoP01.Text = Val(NhietdoP01)
'hien thi nhiet
do
SoNguoiP01 = Asc(Byte3)
TxtSoNguoiP01.Text = Val(SoNguoiP01)
nguoi
If Byte4 = "O" Then
'hien thi so
txtDenP01.Text = "OFF"
txtQuatP01.Text = "OFF"
frmchinh.LblTThai = AnNinh
End If
If Byte4 = "P" Then
txtDenP01.Text = "OFF"
txtQuatP01.Text = "OFF"
frmchinh.LblTThai = KAnNinh
End If
If Byte4 = "Q" Then
txtDenP01.Text = "OFF"
txtQuatP01.Text = "ON"
frmchinh.LblTThai = AnNinh
End If
If Byte4 = "R" Then
txtDenP01.Text = "OFF"
txtQuatP01.Text = "ON"
frmchinh.LblTThai = KAnNinh
End If
If Byte4 = "S" Then
txtDenP01.Text = "ON"
txtQuatP01.Text = "OFF"
frmchinh.LblTThai = AnNinh
End If
If Byte4 = "T" Then
txtDenP01.Text = "ON"
txtQuatP01.Text = "OFF"
frmchinh.LblTThai = AnNinh
End If
If Byte4 = "U" Then
txtDenP01.Text = "ON"
txtQuatP01.Text = "ON"
frmchinh.LblTThai = AnNinh
End If
If Byte4 = "X" Then
txtDenP01.Text = "ON"
txtQuatP01.Text = "ON"
frmchinh.LblTThai = KAnNinh
End If
'BAO LOI TRUYEN (lenh truyen ve sai)
Select Case Byte4
Case "O"
GoTo TB
Case "P"
GoTo TB
Case "Q"
GoTo TB
Case "R"
GoTo TB
Case "S"
GoTo TB
Case "T"
GoTo TB
Case "U"
GoTo TB
Case "X"
GoTo TB
End Select
thongbao = MsgBox("Ban can kiem tra lai he thong.Chu
trong cac he thong chong trom", vbOKOnly, "Loi dieu khien")
TB:
i = i + 1
End Sub
Private Sub Timer1_Timer()
Dim Kich As String
Kich = "E"
Call TRUYEN(DiaChi)
Call TRUYEN(Kich)
Call CapnhatP01
End Sub