Lập trình giao tiếp
máy tính qua cổng RS232
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
1/78
Tutorialn
o
01.02
Gửiđến:
ĐoànHiệp,DoãnMinhĐăng,HuỳnhChâuThuận
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ắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
2/78
Hình1.1:ChọnMyComputer‐>Properties
Hình1.2:ChọnDeviceManager
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
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ắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
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ắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
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ện OnComm xả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ện Giátrị Miêutảsựkiện
comEventBreak
1001 XảyrakhinhậnđượcmộttínhiệuBreak.
comEventFrame
1004 Lỗihệthống.Phầncứngpháthiệnramộtlỗihệthống
comEventOverrun
1006 Xả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.
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
6/78
comEventRxOver
1008 Xảyrakhibộđệmnhậnbịtràn.Khôngcóđủchỗchodữ
liệutrongbộđệmnhận.
comEventRxParity
1009 LỗiParity.PhầncứngpháthiệnramộtlỗiParity.
comEventTxFull
1010 xảyrakhibộđệmtruyềnbịđầy.Bộđệmtruyềnbịđầy
trongkhighidữliệulớnvàobộđệm
comEventDCB
1011 Mộtlỗikhôngmongmuốnkhiđangkhôiphụclạikhỗi
điềukhiểnthiếtbị(DCB–DeviceControlBlock)chocổng
Mộtsốsựkiện:
Sựkiện Giátrị Miêutảsựkiện
comEvSend
1 Xảyrakhisốkítựtrongbộđệmtruyềnnhỏhơngiátrị
SthresHold.
comEvReceive
2 Xảyrakhibộđệmnhậnđượcsốkítựbằnggiátrị
RthresHold.Sựkiệnnàyđượctạoraliêntụcchotớikhibạn
dùngthuộctínhInputđểlấyhếtdữliệutừtrongbộđệm
nhận.
RcomEvCTS
3
XảyrakhicóthayđổitrongđườngCTS(ClearToSend)
comEvDSR
4 XảyrakhithayđổitrongđườngDSR(DataSetReady).Sự
kiệnnàychỉxảyrakhiđườngDSRthayđổitừ1‐>0.
comEvCD
5 XảyrakhicóthayđổitrongđườngCD(CarrierDetect)
comEvRing
6 Pháthiệnchuông(Ring).MộtsốUARTkhônghỗtrợsự
kiệnnày.
comEvEOF
7 Xảyrakhinhậnđượckítựkếtthúcfile(kítự26trong
bảngmãASCII)
+EOFEnable:object.EOFEnable[=value]quyếtđịnhcáchànhđộngnếuMSComm
tìmthấykítựkếtthúcfile.Nếuvalue=truekhitìmthấykítựkếtthúcfilethìsẽgâylênsự
kiệncomEvEOFtrongOnCommEvent.Nếuvalue=falsethìsẽkhônggâylênsựkiệnnày.
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
7/78
+InBufferCout:trảlạisốkítựđangcótrongbộđệmnhậnBạncóthểxoábộđệmnhận
bằngcáchđặtthuộctínhnày=0.KhôngnhầmvớithuộctínhInBufferSizelàtổngkích
thướccủabộđệmnhận.
+Input:nhậnvàxoádữliệutrongbộđệmnhận.
NếuInputModelàcomInputModeTextthìgiátrịtrảvềsẽlàmộtxâutứccókiểu
String,dữliệudạngtexttrongmộtbiếnkiểuVariant.NếuInputMode=
comInputModeBinarythìthuộctínhnàysẽtrảlạidữliệudạngnhịphândướidạngmột
mảngkiểubytetrongmộtbiếnVariant.
+OutBufferCount:trảlạisốkítựtrongbộđệmtruyền.
+Output:ghidữliệuvàobộđệmtruyền.cóthểtruyềnkiểutexthoặckiểunhịphân.
NếutruyềnbằngkiểutextthìchomộtbiếnVariant=kiểuString,nếutruyềnkiểunhịphân
thìchochoOutput=variant=mộtmảngkiểuByte.
Bắttay(handshaking):
+Break:thiếtlậphoặcxoátínhiệu.object.Break[=value]value=truehoặcfalse.Khi
setvalue=truethìthôngsốBreaknàysẽgửimộttínhiệubreak.Tínhiệubreaktrìhoàn
việctruyềndữliệuvàđưađườngtruyềnvàotrạngtháibreaktớikhimàvalue=false.
+CDHolding:quếtđịnhxemsựtruyềnnàyđếnđâubằngcáchtruyvấnđườngCD(
CarrierDetect).CarrierDetectlàtínhiệugửitừmodemtớimáytínhkếtnốivớinóthống
báorằngnóđangonline.Nếugiátrị=truethìnóđườngCDđangởmứccao,nếu=false
thìđườngdâynàyđangởmứcthấp.Tínhchấtnàykhôngcótronglúcthiếtkếchỉcótrong
khichạychươngtrình.CarrierDetectđượcbiếtnhưlàReceiveLineSignalDetect(RLSD).
+CTSHolding:quếtđịnhkhinàobạngửidữliệubằngcáchtruyvấntrạngtháiđường
ClearToSend(CTS).ThôngthườngtínhiệuCTSđượcgửitừmodemtớimáytínhkếtnối
vớinóđểbáorằngđangquátrìnhtruyềndữliệu.ThuộctínhReadonlychỉxuấthiệnkhi
chạychươngtrình.ĐườngClearToSenddùngtrongRTS/CTS(RequestToSend/ClearTo
Send)bắttayphầncứng.CTSHoldingchobạnmộtcáchđểtựtaydòđườngClearToSend
nếubạncầnbiếttrạngtháicủanó.
+DSRHolding:biếttrạngtháicủađườngDataSetReady(DSR).TínhiệuDataSet
Readytruyềntừmodemtớimáytínhnốivớinóđểthôngbáorằngmodemđãsẵnsàng
hoạtđộng.TínhchấtnàydùngkhiviếtDataSetReady/DataTerminalReadyhandshaking
routinechomáyDataTerminalEquipment(DTE)‐máytrangbịđầucuốidữliệu.
+DTREnable:tínhchấtnàyquyếtđịnhkhinàochophépđườngDataTerminalReady
(DTR)trongtruyềnthông.TínhiệuDTRgửitừmáytínhtớimodemđẻbáorằngmáytính
sẵnsànglànơinhậndữliệu.KhiDTREnable=truethìđườngDataTerminalReadysetlên
caokhicổngmở,vàthấpkhicổngđóng.NếuDTREnable=falsethìđườngđóluônmức
thấp.TrongphầnlớntrườnghợpsetđườngDataTerminalReadythànhthấpđểhangup
telephone.
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
8/78
+Handshaking:thiếtlậpvàtrảlạigiaothứcbắttayphầncứng.object.Handshaking[=
value].
Cácgiátrịcủavalue:
comNone
0 (Mặcđịnh)Khôngbắttay
comXOnXOff
1 BắttayXON/XOFF
comRTS
2 BắttayRTS/CTS(RequestToSend/ClearToSend)
comRTSXOnXOff
3 DùngcảbắttayRequestToSendandXON/XOFF
Handshakingchỉlàgiaothứctruyềnthôngnộitạiquyếtđịnhbởidữliệunàođược
truyềntừcổngphầncứngtớibộđệmnhận.Khikítựcủadữliệutớicổngnối tiếp,thiếtbị
truyềnthôngsẽchuyểnnóvàotrongbộđệmnhậnvàchươngtrìnhcủabạncóthểđọc
chúng.Nếukhôngcóbộđệmdữliệuhoặcchươngtrìnhcủabạncầnđọckítựtrựctiếptừ
phầncứng,bạncóthểmấtdữliệubởivìkítựtừphầncứngđếnrấtnhanh.Giaothức
Handshakingđảmbảodữliệukhôngbịmất,khidữliệuđếncổngquánhanhthìthiếtbị
truyềnthôngsẽchuyểndữliệuvàotrongbộđệmnhận.
+RTSEnable:quếtđịnhkhinàochophépđườngRequestToSend(RTS),TínhiệuRTS
từmáytínhtớimodemđểyêucầuđượctryềndữliệu.KhiRTSEnable=truethìđường
RTSmứccaokhicổngmở,tíchmứcthấpkhicổngđóng.VàhiểnnhiênkhiRTSEnablethì
đườngRTSluônmứcthấp.RTSdùngtrongRTS/CTShardwarehandshaking.RTSEnable
chophépbạndòđườngRTSkhicầnbiếttìnhtrạngcủađườngnày.
Cáctínhchấttrênkhôngcólúcthiếtkếgiaodiệnmàchỉcólúcchạychươngtrình(
dùngtrongviếtcode).
1.1.2. ĐiềukhiểnMSCommtrongVisualC++
TrênđâylàcácthamsốcủađiềukhiểnMSCommtrongVB.
TrongVisualC++,mỗimộtđiềukhiểnđượcđịnhnghĩatrongmộtlớpriêng.Và
MSCommcũngkhôngphảilàngoạilệ.
Vớicácthamsốởtrêncácbạnhoàntoàncóthểápdụngrấtlàtốtcholậptrìnhvới
VC++bởilẽcácthamsốnàybạncóthểlấygiátrịhoặcthiếtlậpthamsốchochúngtương
ứngbằngcáchàmthànhviêncửalớpnhưGet_thuộctínhhoặcSet_thuộctính.
Vídụ,bạnmuốnthiếtlậpdùngcổngCOM1chẳnghạnthìdùngthuộctínhCommPort
ởtrênvàchỉthêmtiềntốSet_nếumuốnthiếtlậpvàGet_nếumuốnlấygiátrịnày.
SauđâylàlớpMSCommlàmộtlớpkếthừatừlớpcởsởCWnd,cácbạncóthểtham
khảo.Cácbạnchúývềcáckiềudữliệucửacácthamsốvàgiátrịtrảvềcủacáchàm.Việc
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
9/78
chuyểnđổigiữacáckiểudữliệunàycácbạncóthểthamkhảotạithưviệnMSDN
MicrosoftJuly2001bằngcáchSearch
KeyWord:chínhlàcáctừkhoáchỉnhlàcáckiểudữliệuđó.(nhưCString,…)
classCMSComm:publicCWnd
{
protected:
DECLARE_DYNCREATE(CMSComm)
public:
CLSIDconst&GetClsid()
{
staticCLSIDconstclsid
={0x648a5600,0x2c6e,0x101b,{0x82,0xb6,0x0,0x0,0x0,0x0,0x0,0x14}};
returnclsid;
}
virtualBOOLCreate(LPCTSTRlpszClassName,
LPCTSTRlpszWindowName,DWORDdwStyle,
constRECT&rect,
CWnd*pParentWnd,UINTnID,
CCreateContext*pContext=NULL)
{returnCreateControl(GetClsid(),lpszWindowName,dwStyle,rect,pParentWnd,nID);
}
BOOLCreate(LPCTSTRlpszWindowName,DWORDdwStyle,
constRECT&rect,CWnd*pParentWnd,UINTnID,
CFile*pPersist=NULL,BOOLbStorage=FALSE,
BSTRbstrLicKey=NULL)
{returnCreateControl(GetClsid(),lpszWindowName,dwStyle,rect,pParentWnd,nID,
pPersist,bStorage,bstrLicKey);}
//Attributes
public:
//Cácphéptoán
public:
voidSetCDHolding(BOOLbNewValue);
BOOLGetCDHolding();
voidSetCommID(longnNewValue);
longGetCommID();
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
10/78
voidSetCommPort(shortnNewValue);
shortGetCommPort();
voidSetCTSHolding(BOOLbNewValue);
BOOLGetCTSHolding();
voidSetDSRHolding(BOOLbNewValue);
BOOLGetDSRHolding();
voidSetDTREnable(BOOLbNewValue);
BOOLGetDTREnable();
voidSetHandshaking(longnNewValue);
longGetHandshaking();
voidSetInBufferSize(shortnNewValue);
shortGetInBufferSize();
voidSetInBufferCount(shortnNewValue);
shortGetInBufferCount();
voidSetBreak(BOOLbNewValue);
BOOLGetBreak();
voidSetInputLen(shortnNewValue);
shortGetInputLen();
voidSetNullDiscard(BOOLbNewValue);
BOOLGetNullDiscard();
voidSetOutBufferSize(shortnNewValue);
shortGetOutBufferSize();
voidSetOutBufferCount(shortnNewValue);
shortGetOutBufferCount();
voidSetParityReplace(LPCTSTRlpszNewValue);
CStringGetParityReplace();
voidSetPortOpen(BOOLbNewValue);
BOOLGetPortOpen();
voidSetRThreshold(shortnNewValue);
shortGetRThreshold();
voidSetRTSEnable(BOOLbNewValue);
BOOLGetRTSEnable();
voidSetSettings(LPCTSTRlpszNewValue);
CStringGetSettings();
voidSetSThreshold(shortnNewValue);
shortGetSThreshold();
voidSetOutput(constVARIANT&newValue);
VARIANTGetOutput();
voidSetInput(constVARIANT&newValue);
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
11/78
VARIANTGetInput();
voidSetCommEvent(shortnNewValue);
shortGetCommEvent();
voidSetEOFEnable(BOOLbNewValue);
BOOLGetEOFEnable();
voidSetInputMode(longnNewValue);
longGetInputMode();
};
Cácbạnxemkĩcáchàm,cácphéptoántrêncóthểthấylàkiểudữliệudùnglàmtham
sốchohàmhaygiátrịtrảvềcủacáchàmhầuhếtlàcáckiểudữliệucơbảnnhưBOOL,
short, ChỉđặcbiếtlàcókiểudữliệuVARIANT.
VARIANTlàmộtcấutrúcmàdữliệunóchứalàmộtkiểuunionđượcđịnhnghĩanhư
sau:
typedef struct FARSTRUCT tagVARIANT VARIANT;
typedef struct FARSTRUCT tagVARIANT VARIANTARG;
typedef struct tagVARIANT {
VARTYPE vt;
unsigned short wReserved1;
unsigned short wReserved2;
unsigned short wReserved3;
union {
Byte bVal;
Short iVal;
long lVal;
float fltVal;
double dblVal;
VARIANT_BOOL boolVal;
SCODE scode;
CY cyVal;
DATE date;
BSTR bstrVal;
DECIMAL FAR* pdecVal
IUnknown FAR* punkVal;
IDispatch FAR* pdispVal;
SAFEARRAY FAR* parray;
Byte FAR* pbVal;
short FAR* piVal;
long FAR* plVal;
float FAR* pfltVal;
double FAR* pdblVal;
VARIANT_BOOL FAR* pboolVal;
SCODE FAR* pscode;
CY FAR* pcyVal;
DATE FAR* pdate;
BSTR FAR* pbstrVal;
IUnknown FAR* FAR* ppunkVal;
IDispatch FAR* FAR* ppdispVal;
SAFEARRAY FAR* FAR* pparray;
VARIANT FAR* pvarVal;
void FAR* byref;
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
12/78
char cVal;
unsigned short uiVal;
unsigned long ulVal;
int intVal;
unsigned int uintVal;
char FAR * pcVal;
unsigned short FAR * puiVal;
unsigned long FAR * pulVal; // VT_BYREF|VT_UI4.
int FAR * pintVal;
unsigned int FAR * puintVal;
};
};
CácbạnđểýthấyrằngkiểuVARIANTdùnglàmthamsốchohàmSetInputvàlàkiểu
trảvềcủahàmGetOutput.MàvớikiểutruyềnkiểudạngTextchúngtatruyềndữliệura
cổnglàdạngxâukítựthìchúngtachuyểnđốigiữkiểuVARIANTsangkiểukítựCString
nhưthếnào?
‐ChuyểntừkiểuCString‐>VARIANT:tôidùnglớpColeVariant(cácbạncóthểtra
trongMSDNdùngtabIndex)làdạngđónggóicủakiểucấutrúcVARIANT,lớpnàycó
hàmkhởitạoCOleVariant(CString&strSrc);vàdođónócóthểlàmthamsốchohàm
SetInputcủaMSComm.VìvậychúngtachỉcầnkhaibáomộtbiếnColeVariantlàxong.
CStringdata_tosend=“Example”;
CodeVarianttemp(data_tosend);
m_mscomm1.SetInput(temp);
‐ChuyểntừkiểuVARIANTsangkiểuCString.Cácbạnxemlạiđịnhnghĩacấutrúc
VARIANTởtrênxemcóbiếnnàocókiểutrảvềkiểutươngthíchvớikiểuCString(tứccó
thểépkiểuđểtrởthànhkiểuCString).
Tôithấycóthànhphần
BSTRbstrVal;
Dođótachỉviệcépkiểulàxong.
VARIANTdata;
CStringm_strData=(CString)data.bstrVal;
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
13/78
1.3. Cáchthiếtlậptốiưuchoứngdụng
Đểchoứngdụngcóthểđọcngaydữliệukhibắtđầucótrongbộđệmnhậnthìcácbạn
nênđặtthuộctínhRthresHold=1.
Ngoàiracácbạncầnquantâmđếncácthamsố:CommPort,Settings,Rthreshold,
SthresHold,PortOpen,InputLen,InputBuffer,OutputBuffer,InBufferSize,InputMode,
OutBufferSize.
2. Lậptrình
2.1. Mụcđíchyêucầu
Chươngtrìnhnàyrấtlàđơngiản.Chúngtasẽtạoramộtchươngtrìnhcógiaodiệnnhư
sau:
Hình2.1:Giaodiệnchươngtrình
Chươngtrìnhcóchứcnăngsau:
‐NhậpkítựhoặcxâukítựvàoEditBoxTransfer,điềuchỉnhthamsốgiaotiếptrên
cácComboBox.NhấnnútSendđểgửidữliệuracổngCOM.
‐ĐồngthờivớinónếucódữliệutruyềnvêcổngComthìdữliệusẽđượchiểnthị
lênEditBoxReceive.KhibạnnhấnvàoClearthìsẽxoádữliệuhiểnthịtrênEditBoxnày.
Chúý:
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
14/78
Đểcóthểtestluônchươngtrìnhcácbạnnốitắtchân2vàchân3củaRS232lạivớinhau
chínhlànốichânRxDvàTxDđểchúngtatruyềndữliệuraRS232sauđónhậndữliệu
luôn.Đâylàvídụtestđơngiảnkhôngcóbắttayphầncứng.
Hình2.2:SơđồđấuchâncủaRS232
2.2. Thiếtkếgiaodiệnchochươngtrình
2.2.1. Tạodựán“RS232TUT”
KhởiđộngVisualC++,chọnNewtừmenuFile
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
15/78
Hình2.3:ChọnNewtừmenufile
Hình2.4:ChọnMFCApplication(exe),têndựán,nơichứadựán
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
16/78
Hình2.5:ChọnDialogbased
Hình2.6:NhấnNexttiếptục
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
17/78
Hình2.7:chọnnhưmặcđịnh,nhấnNextluôn
Hình2.8:Kíchfinishđểkếtthúcviệctạodựán
Giaodiệncủaứngdụngbanđầunhưsau:
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
18/78
Hình2.9:Giaodiệnbanđầu
2.2.2. ThêmđiềukhiểnActiveXMicrosoftCommunication6.0
ĐầutiênbạndùngnútDeletexoá2nútOK,CancelvàdòngvănbảntĩnhTODO
TừmenuProjectchọnAddtoProject.MenuconhiệnrabạnchọnComponents
andControls:
Hình2.10:ChọnComponentsControls
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
19/78
HộpthoạiComponentsandControlGalleryxuấthiệnbạnchọnRegestered
ActiveXControls(đâylàthưmụcchứacácđiềukhiểnActiveX):
Hình2.11:Chọnthưmụcđầutiên
TrongthưmụcRegisteredActiveXControlsbạnchọnđiềukhiểnmàmìnhcần
MicrosoftCommunicationsControl,version6.0.KíchOK
Hình2.12:ChọnMicrosoftCommunicationControl,version6.0
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
20/78
Hộpthoạiyêucầubạnxácnhậncóthêmđiềukhiểnnàyvàokhông,chọnOK
Hình2.13:ChọnOKđểthêmđiềukhiển
KhiđóchúngtasẽcóđượcmộtlớpmớiCMSCommlàlớpdẫnxuấtcủalớpcơ
sởCWnd.LớpnàyđượckhaibáotrongfileMSComm.hvàđịnhnghĩatrongfile
MSComm.cpp
Hình2.14:Chọntênlớp,tênheaderfile,filethựcthinhưmặcđịnh
NhấnCloseđểđónghộpthoại
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
21/78
Hình2.15:ĐóngcửasổComponentsandControlsGallery
BạnthêmđiềukhiểnMSCommvàohộpgiaodiệnbằngcáchgắpthảnhưvớicác
điềukhiểnthôngthườngkhác
Hình2.16:ThêmđiềukhiểnMSComm
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
22/78
ThếlàcácbạnđãchođượcứngdụngMSCommvàotrongDialog
2.2.3. Thêmcácđiềukhiểnkhác
2.2.3.1. ThêmcácGroupBox
Hình2.17:ThêmGroupBox1
Hình2.18:ThêmGroupBox2
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
23/78
Hình2.19:ThêmGroupBox3
Hình2.20:ThêmGroupBox4
Ngườibáocáo:
NgôHảiBắc
Tàiliệu:
TUT01.03
Ngày:
10/01/06
Trang:
24/78
Hình2.21:ThêmGroupBox5
Hình2.22:ThêmGroupBox6