Tải bản đầy đủ (.pdf) (25 trang)

tt dlcb (lop B)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (205.46 KB, 25 trang )

Chương
8

LẬP TRÌNH GIAO TIẾP NỐI TIẾP
8.1 LẬP TRÌNH TRONG DOS:
Ngôn ngữ QBASIC
Lệnh khởi động cổng COM n:
OPEN “COM n, [Baud], [Parity], [Data], [Stop]” for RANDOM
as #m trong đó n = 1, 2, 3, 4; m = 1 ÷ 255
Ví dụ: OPEN “COM 2, 9600, E, 7, 2” FOR RANDOM AS #1
Lệnh xuất ra một chuỗi S $
PRINT #1 , S $
Lệnh đọc vào một chuỗi R $
INPUT # 1, R $
Ngoài ra còn các lệnh truy xuất thanh ghi của vi mạch UART
Ngôn ngữ Pascal và C
Dùng các lệnh truy xuất thanh ghi như ở chương 7
Trong MS DOS ở dòng lệnh đánh
MODE COM n : 96, E, 7, 1 sẽ mở COM n
8.2 LẬP TRÌNH NGÔN NGỮ VISUAL BASIC 6.0

Ngôn ngữ Visual Basic có module phần mềm MSCOMM.OCX
phục vụ cho truyền thông, với Visual Basic 4.0 là MSCOMM16.OCX
còn với Visual Basic 6.0 là MSCOMM32.OCX
Muốn cài trình đơn truyền thông vào thanh công cụ ta vào
Project- Components – Controls chọn Microsoft Comm Control
6.0/ OK (Hình 8.1), biểu tượng hình điện thoại sẽ hiện trên thanh
công cụ. Có thể nhắp chuột kép để đưa vào form của chương
trình. Các bước trên có thể làm tắt bằng phím Ctrl T. Thành
phần Comm khi mới đưa vào form thường được gán tên MSComm1
cho cổng Com1 và ta có thể sửa tên hay thay đổi cổng com tùy ý.


Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 211

Thành phố Hồ Chí Minh, tháng 4 năm 2006
Các tính chất chính của trình đơn là Commport, DTREnable,
EOFEnable, Handshaking, InBuffersize, InputLen, InputMode,
NullDiscard, OutBuffersize, ParityReplace, Rthreshold, RTSEnable,
Settmgs, Sthreshold… được đặt khi viết chương trình, có thể thay
đổi khi chạy chương trình bằng các lệnh điều khiển.
Tính chất CommPort
Đặt cổng com được sử dụng
Object.CommPort [= Value]
Value = 1 đến 16, mặc đònh là 1 khi khởi động Visual Basic.
Tính chất này phải đặt trước khi mở cổng, nếu biểu thức
trong ngoặc không có thì trả về số cổng com đang hoạt động.



Tác giả: TS Nguyễn Đức Thành Trang 212




Đặt cấu hình cổng
Object.Settings [= Value]
Value = “BBBB, P, D, S”
Gía trò mặc đònh là
“9600, N, 8, 1”. Trong trường hợp đặt sai giá
trò sẽ báo sự cố.
Sau đây là các giá trò cho phép:
• Baud rate: 110, 300, 600, 1200, 2400, 9600 (Default), 14400,

19200, 28800, 38400, 56000, 128000, 256000
• Parity bit: E (even), M (Mark), N (Default), O (odd), S
(Space)
• Data bit: 4, 5, 6, 7, 8 (Default)
• Stop bit: 1, 1.5, 2
Ví dụ:
MSComm2. Settings = “9600, N, 8, 1”
Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 213

Thành phố Hồ Chí Minh, tháng 4 năm 2006
Mở cổng
Object.PortOpen [= True/ False]
Value = True : mở cổng
Value = False : đóng cổng và xóa bộ đệm truyền thu,
Cổng tự động đóng khi kết thúc chương trình áp dụng.
Nhập dữ liệu
String$= Object.Input
Dữ liệu chuỗi ở bộ đệm thu được đọc vào biến String$ . Liên
quan đến đọc dữ liệu có các lệnh sau:
Object.InputLen [= numByte%]
InputLen: qui đònh số ký tự đọc bởi Input. Chọn InputLen =
0 sẽ cho đọc toàn bộ vùng bộ đệm.
Object.InbufferSize = [numbyte%]
InBufferSize đặt và trả về kích thước theo byte của đệm thu,
mặc đònh là 1024.
Object.InbufferCount [= Count%]
InbufferCount: cho biết số ký hiệu có trong bộ đệm nhận. Xóa
bộ đệm bằng cách cho InbufferCount = 0
Object.InputMode [= value]
InputMode: cho biết loại dữ liệu là văn bản hay nhò phân

Value = 0 : ComInputModeText
Value = 1 : ComInputModeBinary
Ví dụ:
Dim Buffer as Variant
Dim Arr() as Byte
MSComm1.CommPort = 1
MSComm1.PortOpen = True
‘Set InputMode to read binary data
MSComm1.InputMode = comInputModeBinary
Do Until MSComm1.InBufferCount > 10
DoEvents
Loop
Buffer = MSComm1.Input
' Assign to byte array for processing
Tác giả: TS Nguyễn Đức Thành Trang 214


Arr = Buffer
Xuất dữ liệu
Object.Output [= value]
Xuất chuỗi ký tự hay chuỗi nhò phân ra cổng COM.
Giống như nhập dữ liệu ta có các lệnh hỗ trợ.
OutBufferSize: đặt và trả lại kích thước bộ đệm truyền
OutBufferCount: trả lại số ký tự trong bộ đệm truyền.
Ví dụ: gởi ký tự nhấn phím
Private Sub Form_KeyPress (KeyAscii As Integer)
Dim Buffer as Variant
MSComm1.CommPort = 1
MSComm1.PortOpen = True
Buffer = Chr$(KeyAscii)

MSComm1.Output = Buffer
End Sub

Ví dụ:
‘ gởi chuỗi ký tự
MsComm1.Output = "This is a text string”
‘ gởi số nhò phân
Dim Out( ) As Byte
MsComm1.Output = Out
Gởi tín hiệu Break
object.Break [= True/False]
Đọc chân DCD
inCD= object. CDHolding
nếu inCD True thì DCD ở mức cao, nếu False DCD ở mức
thấp.
Đặt thời gian chờ sóng mang
object. CDTimeout [= milliseconds]
Chờ khoảng thời gian cho DCD ở mức cao, nếu hết thời gian
mà CDHolding = false thì tạo sự kiện onComm CDTO (carrier
detect Timeout Error).
Đọc CTS
Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 215

Thành phố Hồ Chí Minh, tháng 4 năm 2006
object. CTS Holding
True: mức 1, False: mức 0
Đặt thời gian chờ CTS
Khi DTE gởi RTS thì modem phải gởi trả lại CTS, tính chất
object. CTSTimeout đònh thời gian chờ, nếu quá thời gian đó mà
không có CTS thì tạo sự kiện CTSTO.

Đọc DSR
object. DSRHolding
Đặt thời gian chờ DSR
object. DSRTimeout
Điều khiển DTR
object. DTREnable [=True/False] nếu True thì DTR mức 1 khi
mở cổng và mức 0 khi đóng cổng, nếu False thì DTR ở mức 0
Điều khiển RTS
object. RTSEnable [ =True/False]
Khi True RTS sẽ ở mức 1 khi mở cổng và mức 0 khi đóng
cổng
Sthreshold:
đặt số byte có trong bộ đệm truyền để báo sự kiện.
Nếu Sthreshold = 1 thì sẽ gọi onComm khi bộ đệm truyền
rỗng.
Nếu Sthreshold = 0 thì không gọi.
Đặt số byte của bộ đệm thu tối thiểu để báo sự kiện
object. Rthreshold [= value]
Nếu đặt bằng 1 thì sẽ gọi onComm khi nhận được 1 ký tự.
Nếu đặt bằng 0 thì không gọi.
Giao thức bắt tay
object.Handshaking [= value]
Value = 0 không bắt tay
Value = 1 bắt tay theo RTS/CTS
= 2 XON/XOFF
= 3 RTS/XON/XOFF

Ví dụ:
Private Sub Form_Load ( )
Dim Buffer$ as string

Tác giả: TS Nguyễn Đức Thành Trang 216


‘ Dùng COM 1, 9600 baud, không parity, 8 bit data, 1 bit stop
MSComm1. Comport = 1
MSComm1. Settings = “9600, N, 8, 1”
‘ Đọc toàn bộ bộ đệm
MSComm1. Inputlen = 0
‘ Mở cổng và gởi lệnh đến modem chế độ trả lời bằng chữ
MSComm1. PortOpen = True
MSComm1. Output = “ATV1Q0” & Chr$(13)
‘ Chờ trả lời “OK”, nếu có OK thì đóng cổng
Do
DoEvents
Buffer$ = Buffer$ & MSComm1. Input
Loop Until InStr (Buffer$, “OK” & vbCrLf)
MSComm1. PortOpen = False
End Sub
Chương trình trên dùng kỹ thuật hỏi vòng. Ta có thể dùng kỹ
thuật sự kiện object.CommEvent. Khi có sự kiện xảy ra chương
trình cho cổng object_OnComm () sẽ được gọi để xử lý các sự kiện
hay các lỗi.
Ví dụ:
Private Sub MSComm1_OnComm ( )
Select Case MSComm1. CommEvent
‘ Xử lý sự kiện hay lỗi bằng cách đặt lệnh dưới mỗi phát biểu Case
‘ Lỗi
Case ComEventBreak ‘Nhận Break
Case ComEventFrame ‘Sai frame
Case ComEventOverrun ‘Mất dữ liệu

Case ComEventRXOver ‘Đệm thu tràn
Case ComEventRXParity ‘Sai Parity
Case ComEventTXFull ‘Đệm phát đầy
Case ComEventDCB ‘Sai khi đọc DCB
‘ Sự kiện
Case ComEvCD ‘Đường CD thay đổi
Case ComEvCTS ‘CTS thay đổi
Case ComEvDSR ‘DSR thay đổi từ 1 xuống 0
Case ComEvRing ‘RI thay đổi
Case ComEvReceive ‘Số byte đệm thu đạt mức Rthreshold
Case ComEvSend ‘Số byte đệm phát ít hơn Sthreshold
Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 217

Thành phố Hồ Chí Minh, tháng 4 năm 2006
Case ComEvEOF ‘Nhận ký tự EOF kết thúc file (mã ASCII 26) trong chuỗi nhập
End Select
End Sub.
Các lỗi khi sử dụng MSComm trình bày trong bảng sau
Lỗi Gía trò Miêu tả
comInvalidPropertyValue 380 Sai thuộc tính
comSetNotSupported 383 Thuộc tính chỉ đọc
comGetNotSupported 394 Thuộc tính chỉ đọc
comPortOpen 8000 Không thực hiện khi cổng đã mở
8001 Gía trò Timeout phải lớn hơn 0
comPortInvalid 8002 Số cổng không giá trò
8003 Thuộc tính chỉ có khi chương trình chạy
8004 Thuộc tính chỉ đọc khi chương trình chạy
comPortAlreadyOpen 8005 Cổng đã mở rồi
8006 Số nhận dạng thiết bò không phù hợp
8007 Vận tốc truyền không phù hợp

8008 Số byte đã đặt không giá tri
8009 Thông số mặc đònh sai
8010 Thiết bò không có sẵn
8011 The function cannot allocate the queues
comNoOpen 8012 Thiết bò không mở
8013 Thiết bò đã mở
8014 Could not enable comm notification
comSetCommStateFailed 8015 Không thể đặt trạng thái truyền thông
8016 Không thể đạt mặt nạ che
comPortNotOpen 8018 Hoạt động chỉ thực hiện khi cổng mở
8019 Thiết bò bận
comReadError 8020 Error reading comm device
comDCBError 8021 Internal error retrieving device control block for the port


Ví dụ: chương trình quay số điện thoại qua modem

Option Explicit
' Variable names beginning with A through Z default to Integer.
DefInt A-Z
Taực giaỷ: TS Nguyeón ẹửực Thaứnh Trang 218


Dim CancelFlag, Default$
Private Sub CancelButton_Click()
' CancelFlag tells the Dial procedure to exit.
CancelFlag = True
CancelButton.Enabled = False
End Sub
Private Sub Dial(Number$)

Dim DialString$, FromModem$, dummy, i As Double
i = 0
DialString$ = "ATDT" + Number$ + vbCr
' Dial the number.
MSComm1.Output = DialString$
' Wait for "OK" to come back from the modem.
Do
i = i + 1
dummy = DoEvents()
' If there is data in the buffer, then read it.
If MSComm1.InBufferCount Then
FromModem$ = FromModem$ + MSComm1.Input
' Check for "OK".
If InStr(FromModem$, "OK") Then
' Notify the user to pick up the phone.
Beep
MsgBox "Please pick up the phone and either press Enter or click OK"
Exit Do
End If
End If
' Did the user choose Cancel?
If i > 100000 Then
Beep
MsgBox "TimeOut, Please check cable and modem"
Exit Do
End If
If CancelFlag Then
CancelFlag = False
Exit Do
End If

Loop
' Disconnect the modem.
Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 219

Thành phố Hồ Chí Minh, tháng 4 năm 2006
MSComm1.Output = "ATH" + vbCr
End Sub
Private Sub DialButton_Click()
Dim Number$, Temp$
DialButton.Enabled = False
QuitButton.Enabled = False
CancelButton.Enabled = True
' Get the number to dial.
Number$ = InputBox$("Enter phone number:", , Default$)
If Number$ = "" Then
DialButton.Enabled = True
QuitButton.Enabled = True
CancelButton.Enabled = False
Exit Sub
End If
Temp$ = Status
Default$ = Number$
Status = "Dialing - " + Number$
' Dial the selected phone number.
Dial Number$
DialButton.Enabled = True
QuitButton.Enabled = True
CancelButton.Enabled = False
Status = Temp$
End Sub

Private Sub Form_Load()
Default$ = "8654357"
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
On Error Resume Next
MSComm1.PortOpen = True
If Err Then
MsgBox "COM1: not available. Change the CommPort property to another port."
Exit Sub
End If
MSComm1.InBufferCount = 0
MSComm1.InputLen = 0
End Sub
Private Sub QuitButton_Click()

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×