
Ngườibáocáo:NgôHảiBắcTàiliệu:TUT01.03
Ngày:10/01/06Trang:1/78
Tutorialno01.02
Gửiđến:ĐoànHiệp,DoãnMinhĐăng,HuỳnhChâuThuận
picvietnam@googlegroups.com
Nộidung:LậptrìnhgiaotiếpmáytínhquacổngRS232..
MICROSOFTWORD
Tómtắt:
VấngiaotiếpgiữaPCvàviđiềukhiểnrấtquantrongtrongcácứngdụngđiềukhiển,đolường,..
trongthựctế.
DođótôixingiớithiệuchocácbạnviếtchươngtrìnhtrênPCdùngMSComm.Tôixinđưaramột
sốvấnđềnhưsau:
‐GiớithiệuchuẩngiaotiếpRS232vàđiềukhiểnActiveXMicrosoftCommunication6.0(
MSComm):cáchtínhchấtvàcáchthiếtlậpthamsốtốiưuchođiềukhiển.
‐LậptrìnhứngdụnggiaotiếptrêncơsởsửdụngphầnmềmVisualC++trongbộcôngcụVisual‐
Studio6.0củaMicrosft:
+Thiếtkếgiaodiệnchươngtrình.
+Viếtmãchochươngtrình.
1. ĐiềukhiểnMSComm
1.1. ChuẩngiaotiếpRS232
RS232làmộtchuẩngiaotiếpnốitiếpdùngđịnhdạngkhôngđồngbộ,kếtnốinhiều
nhấtlàvới2thiếtbị,chiềudàikếtnốilớnnhấtchophépđểđảmbảodữliệulà50–100feet
(12.7đến25.4m),tốcđộ20kBít/sđôikhilàtốcđộ115kBít/svớimộtsốthiếtbịđặcbiệt.
ĐểbiếtđượccácthamsốcủachuẩngiaotiếpRS232tronghệđiềuhànhcủabạnnhưthế
nảothìbạnkíchphảichuộtvàobiểutượngMyComputer,chọnProperties,chọnTab
HardWarechọnDeviceManagersẽcómộttreehiệnra.BạnchọnPort(Com&LPT),kích
chuộtphảivàoCommunicationPort(COM1).ChuyểnsangtabPortSettingsẽthấyđược
cácthamsốmàchúngtacầnthiếtlậpbaogồmtầnsốbus,DataBits,ParityBits,StopBits,
Handshaking,..

Ngườibáocáo:NgôHảiBắcTàiliệu:TUT01.03
Ngày:10/01/06Trang:2/78
Hình1.1:ChọnMyComputer‐>Properties
Hình1.2:ChọnDeviceManager

Ngườibáocáo:NgôHảiBắcTàiliệu:TUT01.03
Ngày:10/01/06Trang:3/78
Hình1.3:ChọnPropertiescủaCommunicationPort(COM1)
Hình1.4:ChọnthẻPortSettingđểbiếtthamsố
ĐóchínhlàlídotạisaotôilạichọncácthamsốđưavàotrongcácComboBoxnhưở
dướichươngtrìnhnày.

Ngườibáocáo:NgôHảiBắcTàiliệu:TUT01.03
Ngày:10/01/06Trang:4/78
1.2. CácthuộctínhcủaMSComm
MSCommlàmộtđiềukhiểnActiveXdùngtrongtruyềnthôngnốitiếp.Cáctínhchất
củađiềukhiểnnàyđượcdùngđểthiếtlậpgiaotiếpvớicácthiếtbịngoạiviquacổng
RS232.DođótôixingiớithiệuvớicácbạnđiềukhiểnnàytrongVisualBasicvìcáchgọi
thuộctínhđơngiảncủaVB.TừđósẽlấylàmcơsởđểlậptrìnhtrênVisualC++.
1.2.1. ĐiềukhiểnMSCommtrongVisualBasic
TấtcảcáctínhchấtnàybạncóthểtìmtạithưviệnMSDNJuly2001theođườngdẫn
nhưsauởtabcontents:
MSDNLibrary‐July2001/VisualToolsandLanguages/VisualStudio6.0
Documentation/VisualBasicDocumentation/Reference/ControlReference/ActiveX
Control/MSCommControl
CáctínhchấtcủaMSCommđượcsắpxếptheochứcnăng:
Thiếtlậpthamsốchocổng:
+CommID:trảlạihandlesđồngnhấttớithiếtbịtruyềnthông,cókiểuLong.Tínhchất
nàykhôngcólúcthiếtkếmàchỉcókhithihành,thuộctínhnàylàReadOnly.
+CommPort:dạngobject.CommPort=value.ValuelàchỉsốcủacổngComcógiátrịtừ
1‐>16vàmặcđịnhcógiátrị=1.Cácbạncầnphảithiếtlậpthôngsốnàytrướckhimởcổng.
Sẽcólỗierror68(Deviceunavailable)nếunhưkhôngmởđượccổngnày.
+InBuferSize:thiếtlậphoặctrảlạikíchthướccủabộđệmnhận,tính=byte.Mặcđịnh
là1024byte.CácbạnkhôngđượcnhầmlẫnvớiđặctínhInBufferCountlàsốbyteđang
chờtrongbộđệmnhận.
+InputLen:object.InputLen[=value]thiếtlậphoặctrảlạisốbytemỗilầnthuộctính
Inputđọctrongbộđệmnhận.MặcđịnhgiátrịValue=0tứclàthuộctínhInputsẽđọchết
nộidungcủabộđệmnhậnkhithuộctínhnàyđượcgọi.Nếusốkítựtrongbộđệmnhận
không=InputLenthìthuộctínhInputsẽtrảlạikítựrỗng“”.Víthếbạncầnphảichọn
cáchkiểmtraInBufferCountđểchắcchắnsốkítựyêucầuđãcóđủtrướckhidùnglệnh
.Input.Tínhchấtnàyrấtlàcóíchkhiđọcdữliệumộtmáymàdữliệurađượcđịnhdạng
bằngcáckhốicókíchthướccốđịnh.
+InputMode:object.InputMode[=value].
Value=0hay=comInputModeTextdữliệunhậnđượcdạngvănbảnkiểukítựtheo
chuẩnANSI.Dữliệunhậnđượcsẽlàmộtsâu.
Value=1hay=comInputModeBinarydùngnhậnmọikiểudữliệunhưkítựđiềukhiển
nhúng,kítựNULL,..GiátrịnhậnđượctừInputsẽlàmộtmảngkiểuByte.
+NullDiscard:object.NullDiscard[=value]tínhchấtnàyquyếtđịnhkítựtrốngcó
đượctruyềntừcổngđếnbộđệmnhậnhaykhông.Nếuvalue=Truekítựnàykhôngđược

Ngườibáocáo:NgôHảiBắcTàiliệu:TUT01.03
Ngày:10/01/06Trang:5/78
truyền.value=falsekítựtrốngsẽđượctruyền.Kítựtrốngđượcđịnhnghíatheochuẩn
ASCIIlàkítự0–chr$(0).
+OutBuferSize:giốngnhưInBuferSize,mặcđịnhlà512.
+ParityReplace:thiếtlậpvàtrảlạikítựthaythếkítựkhôngđúngtronglỗigiống
nhau.
+PortOpen:thiếtlậpvàtrảlạitínhtrạngcủacổng(đónghoặcmở).
object.PortOpen[=value].value=truecổngmở.value=falsecổngđóngvàxóatoàn
bộdữliệutrongbộđệmnhậnvàtruyền.CầnphảithiếtlậpthuộctínhCommPortđúngvới
têncủacổngtrướckhimởcổnggiaotiếp.Thêmvàođó,cổnggiaotiếpcủathiếtbịcủabạn
phảihỗtrợgiátrịtrongthuộctínhSettingthìthiếtbịcủabạnmớihoạtđộngđúng,còn
khôngthìnósẽhoạtđộngrấtdởhơinếukhôngnóilànóchạykhôngtốt.ĐườngDTRvà
RTSluôngiữlạitrạngtháicủacổng.
+RthresHold:object.Rthreshold[=value]valuekiểusốnguyên.Thiếtlậpsốkítự
nhậnđượctrướckhigâylênsựkiệncomEvReceive.Mặcđịnh=0tứclàkhôngcósựkiện
OnCommkhinhậnđượcdữliệu.Thiếtlập=1tứclàsựkiệnOnCommxảyrakhibấtkìkí
tựnàođượcchuyểnđếnbộđệmnhận.
+Settings:object.Settings[=value]thiếtlậphoặctrảlạicácthôngsốtầnsốbaud,bít
dữliệu,bítchẵnlẻ,bítstop.NếuValuekhôngcógiátrịkhimởsẽgâyralỗi380(Invalid
propertyvalue).
+SThreshold:thiếtlậpvàvàtrảlạisốkítựnhỏnhấtđượcchophéptrongbộđệmgửi
đểxảyrasựkiệnOnComm=comEvSend.Theomặcđịnhgiátrịnày=0tứclàkhitruyền
sẽkhônggâyrasựkiệnOnComm.Nếuthiếtlậpthôngsốnày=1thìsựkiệnOnCommxảy
rakhibộđệmtruyềnrỗng.SựkiệnOnComm=comEvSendchỉxảyrakhimàsốkítự
trongbộđệmtruyềnnhỏhơnhoặc=Sthreshold.Nếusốkítựtrongbộđệmnàyluônlớn
hơnSthresholdthìsựkiệnnàykhôngthểxảyra.
Truyềnnhậndữliệu:
+CommEvent:trảlạiphầnlớnsựkiệngiaotiếphoặccólỗi.CommEventxảyrakhicó
lỗihoặckhixảyrasựkiệnnàođó.Sauđâylàmộtsốhằngsốlỗi:
SựkiệnGiátrị Miêutảsựkiện
comEventBreak1001XảyrakhinhậnđượcmộttínhiệuBreak.
comEventFrame1004Lỗihệthống.Phầncứngpháthiệnramộtlỗihệthống
comEventOverrun1006Xảyrakhicổngtựtràn(Overrun).Mộtkítựkhôngđược
đọctừphầncứngtrướckhikítựtiếptheotớivàdođókítự
nàybịmất.

