BÁO cáo THỰC HÀNH lập TRÌNH hệ THỐNG BÁO cáo THỰC HÀNH lập TRÌNH hệ THỐNG BÁO cáo THỰC HÀNH lập TRÌNH hệ THỐNG BÁO cáo THỰC HÀNH lập TRÌNH hệ THỐNG BÁO cáo THỰC HÀNH lập TRÌNH hệ THỐNG BÁO cáo THỰC HÀNH lập TRÌNH hệ THỐNG BÁO cáo THỰC HÀNH lập TRÌNH hệ THỐNG
Trang 1I Lý thuyết chung về cổng COM
1 Cổng nối tiếp (cổng COM)
Cổngnốitiếpđượcsử dụngđểtruyềndữliệuhaichiềugiữamáytínhvàngoạivi, có cácưuđiểmsau:
- Khoảngcáchtruyềnxahơntruyềnsongsong;
- Sốdâykếtnốiít;
- Cóthểtruyềnkhôngdâydùnghồngngoại;
- CóthểghépnốivớiviđiềukhiểnhayPLC(ProgrammableLogicDevice);
- Chophépnốimạng;
- Cóthểtháolắpthiếtbịtronglúcmáytínhđanglàmviệc;
- Cóthểcungcấpnguồnchocácmạchđiệnđơngiản
Cácthiếtbịghépnốichiathành2loại:DTE(DataTerminalEquipment)vàDCE
(DataCommunicationEquipment).DCElàcácthiếtbị
trunggiannhưMODEMcònDTElà
cácthiếtbịtiếpnhậnhaytruyềndữliệunhưmáytính,PLC,viđiềukhiển,…Việctraođổi tínhiệuthôngthườngqua2 chânRxD(nhận)vàTxD(truyền).Cáctínhiệucònlạicóchức nănghỗtrợđểthiếtlậpvàđiềukhiểnquátrìnhtruyền,đượcgọilà cáctín hiệubắttay (handshake).Ưuđiểmcủaquátrìnhtruyềndùngtínhiệubắttaylà cóthểkiểmsoátđường truyền
Tínhiệutruyền theochuẩn RS-232 củaEIA (Electronics Industry Associations) ChuẩnRS-232quyđịnhmứclogic1ứngvớiđiệnáptừ-3Vđến-25V(mark),mứclogic0 ứngvớiđiệnáptừ3Vđến25V(space)vàcó khảnăngcungcấpdòngtừ10mAđến20 mA Ngoàira,tấtcảcácngõrađềucóđặctínhchốngchậpmạch
ChuẩnRS-232chophéptruyềntín hiệuvới tốcđộđến20.000bpsnhưngnếucáp truyềnđủngắncóthểlênđến115.200bps
CácphươngthứcnốigiữaDTEvàDCE:
- Đơncông(simplexconnection):dữliệuchỉđượctruyềntheo1hướng
- Bánsongcông(half-duplex):dữliệutruyềntheo2hướng,nhưngmỗithờiđiểm
chỉđượctruyềntheo1hướng
- Songcông(full-duplex):sốliệuđượctruyềnđồngthờitheo2hướng
ĐịnhdạngcủakhungtruyềndữliệutheochuẩnRS-232:
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
Các đặc tính kỹ thuật của chuẩn RS-232 như sau:
Trang 2Chiềudàicablecựcđại 15m Tốcđộdữliệucựcđại 20Kbps Điệnápngõracựcđại ±25V Điệnápngõracótải ±5Vđến±15V
Trởkhángngõvào 3Kđến7K
Cáctốcđộtruyềndữliệuthôngdụngtrongcổngnốitiếplà:1200bps,4800bps,9600bpsvà 19200bps
CổngCOMcóhailoại:đầunốiDB25(25chân)vàđầunốiDB9(9chân), hiện nay được
sử dụng phổ biến hơn cả là loại 9 chân
Hình 1 – Sơ đồ chân cổng COM loại DB9
Ýnghĩacủacácchân đượcmôtảnhưsau:
Chân Tín hiệu Hướng
truyền
Mô tả
1 DCD DCE DTE Data Carrier detect: DCE phát hiện sóng
mang
2 RxD DCE DTE Received Data: dữ liệu nhận
3 TxD DTE DCE Transmitted Data: dữ liệu truyền
4 DTR DTE DCE Data Terminal ready: DTE sẵn sàng làm
việc
6 DSR DCE DTE Data set ready: DCE sẵn sàng làm việc
7 RTS DTE DCE Request to send: DTE yêu cầu truyền dữ
liệu
8 CTS DCE DTE Clear to send: DCE sẵn sàng nhận dữ liệu
9 RI DCE DTE Ring Indicator: báo chuông
Trang 32 Truyền thông giữa hai nút.
Các sơ đồ khi kết nối dùng cổng nối tiếp:
Hình 2 – Kết nối đơn giản trong truyền thông nối tiếp.
Khithựchiệnkếtnốinhưtrên,quátrìnhtruyềnphảibảođảmtốcđộởđầuphátvà
thugiốngnhau.KhicódữliệuđếnDTE,dữliệunàysẽđượcđưavàobộđệmvàtạongắt.Ngo
ài ra khi thực hiện kết nối giữa 2 DTE, ta còn dùng sơ đồ sau:
Hình 3 –Kết nối trong truyền thông nối tiếp dùng tín hiệu bắt tay.
KhiDTE1cầntruyềndữliệuthìchoDTRtíchcựctácđộnglênDSRcủaDTE2
chobiếtsẵnsàngnhậndữliệuvàchobiếtđãnhậnđượcsóngmangcủaMODEM(ảo).Sau đó,DTE1tíchcựcchânRTSđểtácđộngđếnchânCTScủaDTE2chobiếtDTE1cóthể
nhậndữliệu.KhithựchiệnkếtnốigiữaDTEvà DCE,do tốcđộ truyềnkhácnhaunênphải thựchiệnđiềukhiểnlưulượng.Quátrinhđiềukhiểnnàycóthểthựchiệnbằngphầnmềm hayphầncứng.Quátrìnhđiềukhiểnbằngphầnmềmthựchiệnbằnghaikýtự XonvàXoff KýtựXonđượcDCEgửiđikhirảnh(cóthểnhậndữliệu).NếuDCEbậnthìsẽgửikýtự
Xoff.QuátrìnhđiềukhiểnbằngphầncứngdùnghaichânRTSvà CTS.NếuDTEmuốn truyềndữliệuthìsẽ gửiRTSđểyêucầutruyền,DCEnếucó khảnăngnhậndữliệu(đang rảnh)thìgửilạiCTS
3 Truy xuất trực tiếp thông qua cổng.
Cáccổngnốitiếptrongmáytínhđượcđánhsốlà COM1,COM2,COM3,COM4với cácđịachỉ nhưsau:
Tên Địa chỉ Ngắt Vị trí chứa địa chỉ
Trang 4COM2 2F8h 3 0000h:0402h
GiaotiếpnốitiếptrongmáytínhsửdụngvimạchUARTvớicácthanhghichotrong bảngsau:
0
0 W THR TransmitterHoldingRegister(đệmtruyền)
0 R RBR ReceiverBufferRegister(đệmthu)
1 R/W BRDL BaudRateDivisorLatch(sốchiabytethấp)
1 0 R/W IER InterruptEnableRegister(chophépngắt)
1 R/W BRDH Sốchiabytecao
2 R IIR InterruptIdentificationRegister(nhậndạngngắt)
W FCR FIFOControlRegister
3 R/W LCR LineControlRegister(điềukhiểnđườngdây)
5 R LSR LineStatusRegister(trạngtháiđườngdây)
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)
4 Truyền thông nối tiếp dùng ActiveX.
4.1 Mô tả:
ViệctruyềnthôngnốitiếptrênWindowsđượcthựchiệnthôngquamộtActiveXcó sẵnlà MicrosoftCommControl.ActiveXnàydượclưu trữ trongfile MSCOMM32.OCX
Quátrìnhnàycóhaikhảnăngthựchiệnđiềukhiểntraođổithôngtin:
- Điều khiển sự kiện:Truyền thông điều khiển sự kiện là phương pháp tốt nhất trong quá trình điều khiển việc trao đổi thông tin Quá trình điều khiển thực hiện thông qua sự kiện OnComm
- Hỏi vòng:Quá trinh điều khiển bằng phương pháp hỏi vòng thực hiện thông qua kiểm tra các giá trị của thuộc tính CommEvent sau một chu kỳ nào đó để xác định xem có sự kiện nào xảy ra hay không Thông thường phương pháp này sử dụng cho các chương trình nhỏ
ActiveX MSComm được bổ sung vào một Visual Basic Project thông qua menu Project Components:
Trang 5Hình 4 –Bổ sung đối tượng MSComm vào VBP
Cácthuộctínhcơbản của MSComm đượcmôtảnhưsau:
CommPort Sốthứtựcổngtruyềnthông
Input Nhậnkýtựtừbộđệm
Output Xuấtkýtựracổngnốitiếp
PortOpen Mở/đóngcổng
Settings Xácđịnhcácthamsốtruyền
Hình 06: Các thuộc tính của đối tượng MSComm
4.2 Các thuộc tính:
- Settings:Xác định các tham số cho cổng nối tiếp
Trang 6Cú pháp:
MSComm1.Settings = ParamString
Trong đó: MSComm1: là tên đối tượng
ParamString: là một chuỗi có dạng như sau: "BBBB,P,D,S"
+ BBBB: tốc độ truyền dữ liệu (bps) trong đó các giá trị hợp lệ là:
300 9600 (măc định) 56000
+ P: kiểm tra chẵn lẻ, với các giá trị:
O Odd (kiểm tra lẻ)
E Even (kiểm tra chẵn)
M Mark (luôn bằng 1)
S Space (luôn bằng 0)
N Không kiểm tra
+ D: số bit dữ liệu (4, 5, 6, 7 hay 8), mặc định là 8 bit
+ S: số bit stop (1, 1.5, 2)
- CommPort:Xác định số thứ tự của cổng truyền thông
Cú pháp:
MSComm1.CommPort = PortNumber
Trong đó: PortNumber là giá trị nằm trong khoảng từ 1 đến 99, mặc định là 1.
- PortOpen:Đặt trạng thái hay kiểm tra trạng thái đóng / mở của cổng nối tiếp.
Nếu dùng thuộc tính này để mở cổng nối tiếp thì phải sử dụng trước 2 thuộc tính Settings và CommPort
Cú pháp:
MSComm1.PortOpen = True | False
Giá trị xác định là True sẽ thực hiện mở cổng và False để đóng cổng đồng thời xoá nội dung của các bộ đệm truyền, nhận
- Các thuộc tính nhận dữ liệu:
Input:nhận một chuỗi ký tự và xoá khỏi bộ đệm.
Cú pháp:
InputString = MSComm1.Input
Thuộc tính này kết hợp với InputLen để xác định số ký tự đọc vào Nếu InputLen = 0 thì sẽ đọc toàn bộ dữ liệu có trong bộ đệm
InBufferCount: số ký tự có trong bộ đệm nhận
Trang 7Cú 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
- 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)
Trang 8Cú 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 (Protocol) truyền bao gồm:
ComNone 0 Không băt tay (mặc định)
ComXon/Xoff 1 Bắt tay phần mềm (Xon/Xoff)
ComRTSXon/Xoff 3 Bắt tay phần cứng và phàn mềm
- CommEvent: Trả lại các lỗi truyền thông hay sự kiện xảy ra tại cổng nối tiếp.
Các sự kiện:
ComEvSend 1 Đã truyền ký tự
ComEvReceive 2 Khi có ký tự trong bộ đệm nhận
ComEvCTS 3 Có thay đổi trên CTS (Clear To Send)
ComEvDSR 4 Có thay đổi trên DSR (Data Set
Ready) ComEvCD 5 Có thay đổi trên CD (Carrier Detect)
ComEvRing 6 Phát hiện chuông
ComEvEOF 7 Nhận ký tự kết thúc file
Các lỗi truyền thông:
trị
Mô tả
ComBreak 1001 Nhận tín hiệu Break
ComCTSTO 1002 Clear To Send Timeout
ComFrame 1004 Lỗi khung
ComOver 1006 Phần cứng không đọc ký tự trước khi gửi ký
tự kế ComCDTO 1007 Carrier Detect Timeout
ComRxOver 1008 Tràn bộ đệm nhận
Trang 9ComRxParity 1009 Lỗi Parity
ComTxFull 1010 Tràn bộ đệm truyền
4.3 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
Trang 10II Giới thiệu phần mềm tạo cổng COM ảo “Virtual Serial Port Driver”.
1 Giao diện chương trình
2 Chức năng
- Không giới hạn số lượng cặp cổng nối tiếp ảo được tạo ra
- Cổng nối tiếp ảo hoàn toàn giống với cổng thực nên các ứng dụng không thể nhận biết được sự khác biệt
- Link giữa các cổng nối tiếp ảo nhanh hơn nhiều so với kết nối dây cáp null-modem thực và chỉ phụ thuộc vào tốc độ bộ xử lý (tốc độ truyền tải trung bình khoảng 5.5 Mbytes/s)
- Dòng tín hiệu có sẵn gồm: DTR/DSR/CTS/RTS/DCD/RI
- Hỗ trợ kiểm soát HandFlow (Hardware và Xon/Xoff)
- Có thể đặt tên cho cổng nối tiếp theo ý muốn, thậm chí giống với tên cổng thực
- Các cổng có thể được tự động tạo lại khi khởi động lại hệ thống (trước khi đăng nhập user)
- Có thể thay đổi tên của cổng nối tiếp ảo được tạo bởi VSPD hiển thị trong Device Manager
- Hỗ trợ công nghệ Windows kernel driver (WDM, WMI, Power Management, PnP,…)
Trang 11- Không cần khởi động lại sau khi cài đặt VSPD, tạo và thiết lập cấu hình cho cổng nối tiếp ảo
III Nội dung thực hành
Bài thực hành 1:Dùng các đối tượng Form, Label, Textbox, CommandButton,
Vscrollbar, Timer, MSComm để thiết kế chương trình thu phát một thông số qua cổng COM với yêu cầu: giá trịđược truyền đi từ Textbox này sang Textbox kia sau mỗi lần click nút bấm, các đèn báo hiệu thông báo trạng thái kết nối của cổng COM và thông báo khi có tín hiệu được truyền đi.
a) Giao diện chương trình:
b) Code lệnh:
Private Sub cmdClear_Click()
Text1.Text = ""
GXLight2.LampOn = False
End Sub
Private Sub cmdExit_Click()
Unload Me
End Sub
Trang 12Private Sub cmdSend_Click()
MSComm1.Output = Text2.Text GXLight2.LampOn = True
End Sub
Private Sub Form_Load()
cmdSend.Caption = "&Send"
Text1.Text = ""
Text2.Text = ""
Text1.Enabled = False
cmdExit.Caption = "&Exit"
With MSComm1
.Settings = "9600,N,8,1"
.CommPort = 1
.RThreshold = 1
.SThreshold = 0
.InputMode = comInputModeText InputLen = 0
.Handshaking = comNone
.InBufferSize = 1024
.OutBufferSize = 1024
If PortOpen = False Then
PortOpen = True
End If
End With
With MSComm2
.Settings = "9600,N,8,1"
.CommPort = 2
.RThreshold = 1
.SThreshold = 0
.InputMode = comInputModeText InputLen = 0
Trang 13.Handshaking = comNone
.InBufferSize = 1024
.OutBufferSize = 1024
If PortOpen = False Then
PortOpen = True
End If
End With
End Sub
Private Sub MSComm2_OnComm()
Dim Buffer As Variant
If MSComm2.CommEvent = comEvReceive Then
Text1.Text = Text1.Text + MSComm2.Input
End If
End Sub
Private Sub Timer1_Timer()
If MSComm1.PortOpen = True Then
GXLight1.LampOn = True
Else
GXLight1.LampOn = False
End If
End Sub
Bài thực hành 2: Dùng các đối tượng Form, Label, Textbox, CommandButton,
Vscrollbar, Timer, MSComm để thiết kế chương trình thu phát một thông số qua cổng COM1 với yêu cầu: thông số phát đi có giá trị từ 0 đến 200 được tạo ra từ đối tượng Vscrollbar, thông số được chuyển thành khoảng giá trị từ 0 tới 100.
a) Giao diện chương trình:
Trang 14a) Code lệnh:
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm2.CommPort = 2
MSComm2.Settings = "9600,N,8,1"
MSComm2.PortOpen = True
End Sub
Private Sub MSComm2_OnComm()
If MSComm2.CommEvent = comEvReceive Then Text1.Text = Str(Asc(MSComm2.Input) * 0.5) End If
End Sub
Private Sub Timer1_Timer()
MSComm1.Output = Chr(GXSlider1.Value) End Sub
Trang 15Bài thực hành 3: Dùng các đối tượng Form, Label, Textbox, CommandButton,
Vscrollbar, Timer, MSComm để thiết kế chương trình thu phát một thông số qua cổng COM2 với yêu cầu:Khung tin gồm một kí tự khởi đầu, một kí tự kết thúc 4 ký
tự mang thông số trong đó 2 thông số đầu mang trạng thái của hai nút ấn, 2 thông
số sau chứa giá trị của 2 Vsrollbar trong khoảng 0 đến 200.
a) Giao diện chương trình:
b) Code lệnh:
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm2.CommPort = 2
MSComm2.Settings = "9600,N,8,1"
MSComm2.PortOpen = True
End Sub
Private Sub GXSwitch1_Click()
Trang 16If GXSwitch1.SwitchOn = True Then
Text1.Text = "1"
Else
Text1.Text = "0"
End If
End Sub
Private Sub GXSwitch2_Click()
If GXSwitch2.SwitchOn = True Then
Text4.Text = "1"
Else
Text4.Text = "0"
End If
End Sub
Private Sub MSComm2_OnComm()
If MSComm2.CommEvent = comEvReceive Then Text2.Text = Str(Asc(Chr(GXSlider1.Value))) Text3.Text = Str(Asc(Chr(GXSlider2.Value))) End If
End Sub
Private Sub Timer1_Timer()
MSComm1.Output = Chr(GXSlider1.Value) End Sub
Private Sub Timer2_Timer()
MSComm1.Output = Chr(GXSlider2.Value) End Sub