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 hồ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
Sự mơ tả
CommPort Đặt và trả lại số cổng truyền thơng Input(nhập
vào) Trả lại và loại bỏ các ký tự khỏi bộ đệm nhận Output(xuất
ra)
Viết một xâu ký tự tới vào bộ đệm truyền
PortOpen Mở/Đĩng một cổng (tùy thuộc vào thơng số) và đặt thơng số cho cổng .
Settings Đặ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
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 , 8 (default)
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).
• Thơng số 110 2400 19200 57600 300 4800 28800 115200 600 9600 38400 128000 1200 14400 56000 256000
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 tồ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 tồ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à :
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
y 1009 Phần cứng phát hiện ra một lỗi chẵn lẻ
comEventTxFull 1010 Bộ đệm truyền đầy .Bộ đệm truyền bị đầy khi cố đưa thêm ký tự vào hàng đợi
comEventDCB 1011 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ố Giá
trị
Mơ tả
ComEvSend 1 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 .