微波EDA网,见证研发工程师的成长! 2025婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻娑樷槈濮楀牊鏁鹃梺鍛婄懃缁绘﹢寮婚悢铏圭<闁靛繒濮甸悘宥夋⒑缁嬪潡顎楁い锔诲灦閳ワ箓宕稿Δ浣告疂闂傚倸鐗婄粙鎴︼綖瀹€鈧槐鎾存媴閸濆嫮褰欓梺鎼炲劀閸滀礁鏅i梻浣筋嚙鐎涒晝绮欓幒鏇熸噷闂佽绻愬ù姘跺储婵傚憡绠掓繝鐢靛Т閿曘倝骞婃惔銏㈩洸闁诡垼鐏旀惔銊ョ倞鐟滄繈鐓鈧埞鎴﹀灳瀹曞洤鐓熼悗瑙勬礈閸犳牠銆佸鈧幃娆忣啅椤旈敮鍋撻幘顔解拻闁稿本鐟чˇ锕傛煙鐠囇呯瘈闁诡喚鍏樻俊鐤槼鐎规洖寮堕幈銊ヮ渻鐠囪弓澹曢柣搴㈩問閸犳牠鈥﹂悜钘夋瀬闁归偊鍘肩欢鐐测攽閻樻彃顏撮柛姘嚇濮婄粯鎷呴悷閭﹀殝缂備浇顕ч崐姝岀亱濡炪倖鎸鹃崐锝呪槈閵忕姷顦板銈嗘尵婵兘鏁嶅⿰鍫熲拺缂備焦锚婵箓鏌涢幘瀵告噰鐎规洘绻堟俊鍫曞幢濞嗘埈鍟庣紓浣鸿檸閸欏啴藟閹捐泛濮柍褜鍓熼幃妤€鈻撻崹顔界亪濡炪値鍘鹃崗姗€鐛崘顔碱潊闁靛牆鎳庣粣娑欑節閻㈤潧孝閻庢凹鍠涢崐鎾⒒閸屾艾鈧绮堟笟鈧獮澶愭晸閻樿尙顔囬梺绯曞墲缁嬫垵顔忓┑鍥ヤ簻闁哄啫鍊婚幗鍌炴煕閻旈攱鍣界紒杈ㄦ崌瀹曟帒顫濋钘変壕闁归棿绀佺壕褰掓煟閹达絽袚闁搞倕瀚伴弻銈夊箹娴h閿梺鎼炲妽濮婂綊濡甸崟顖氱闁告鍋熸禒濂告⒑閹肩偛濡奸柛濠傛健瀵鈽夐姀鈺傛櫇闂佹寧绻傚Λ娑⑺囬妷鈺傗拺闁芥ê顦弳鐔兼煕閻樺磭澧电€殿喖顭峰鎾偄閾忚鍟庨梻浣虹帛閸旓箓宕滃鑸靛仧闁哄洢鍨洪埛鎴犵磼鐎n偒鍎ラ柛搴$箲娣囧﹪顢曢敐鍥╃杽閻庢鍠涢褔鍩ユ径濠庢僵妞ゆ劧绲芥刊浼存⒒娴e憡鍟為柟绋挎閸┾偓妞ゆ巻鍋撻崡閬嶆煕椤愶絿绠ユ繛鎾愁煼閺屾洟宕煎┑鍥ф畻闂佺粯绋掔划鎾诲蓟閻旂厧绀勯柕鍫濇椤忥拷04闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劌銈搁弻鐔兼儌閸濄儳袦闂佸搫鐭夌紞渚€銆佸鈧幃娆撳箹椤撶噥妫ч梻鍌欑窔濞佳兾涘▎鎴炴殰闁圭儤顨愮紞鏍ㄧ節闂堟侗鍎愰柡鍛叀閺屾稑鈽夐崡鐐差潻濡炪們鍎查懝楣冨煘閹寸偛绠犻梺绋匡攻椤ㄥ棝骞堥妸鈺傚€婚柦妯侯槺閿涙盯姊虹紒妯哄闁稿簺鍊濆畷鎴犫偓锝庡枟閻撶喐淇婇婵嗗惞婵犫偓娴犲鐓冪憸婊堝礂濞戞碍顐芥慨姗嗗墻閸ゆ洟鏌熺紒銏犳灈妞ゎ偄鎳橀弻宥夊煛娴e憡娈查梺缁樼箖濞茬喎顫忕紒妯诲闁芥ê锛嶉幘缁樼叆婵﹩鍘规禍婊堟煥閺冨浂鍤欓柡瀣ㄥ€楃槐鎺撴綇閵婏富妫冮悗娈垮枟閹歌櫕鎱ㄩ埀顒勬煃闁款垰浜鹃梺褰掝棑缁垳鎹㈠☉娆愮秶闁告挆鍛呮艾鈹戦悙鍙夊珔缂佹彃娼″顐︻敊鐏忔牗顫嶉梺闈涢獜缁辨洟宕㈤柆宥嗏拺闁告繂瀚弳濠囨煕鐎n偅灏扮紒缁樼洴閹崇娀顢楅埀顒勫几濞戙垺鐓熸繛鎴濆船濞呭秶鈧鍠曠划娆撱€佸Ο娆炬Ъ闂佸搫鎳忕换鍫濐潖濞差亝顥堟繛鎴炶壘椤e搫鈹戦悙棰濆殝缂佽尪娉曢崚鎺楊敇閻旈绐炴繝鐢靛Т鐎涒晝鈧潧鐭傚娲濞戞艾顣哄┑鈽嗗亝缁嬫帡寮查崼鏇熺劶鐎广儱妫涢崢閬嶆煟鎼搭垳绉甸柛鎾寸懄缁傛帡鏌嗗鍡欏幍濡炪倖娲栧Λ娑氬姬閳ь剚绻濈喊澶岀?闁稿繑锕㈠畷娲晸閻樿尙锛滃┑鐘诧工閸燁偆绮诲ú顏呪拻闁稿本鐟чˇ锕傛煙绾板崬浜滈悡銈夋煏婵炵偓娅呯痪鍓х帛缁绘盯骞嬪▎蹇曚患闂佺粯甯掗悘姘跺Φ閸曨垰绠抽柛鈩冦仦婢规洘绻濋悽闈浶涢柛瀣崌濮婃椽顢楅埀顒傜矓閹绢喗鍊块柛顭戝亖娴滄粓鏌熼崫鍕ラ柛蹇撶焸閺屾盯鎮㈤崫銉ュ绩闂佸搫鐬奸崰鏍х暦濞嗘挸围闁糕剝顨忔导锟�23闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劌銈搁弻鐔兼儌閸濄儳袦闂佸搫鐭夌紞渚€銆佸鈧幃娆撳箹椤撶噥妫ч梻鍌欑窔濞佳兾涘▎鎴炴殰闁圭儤顨愮紞鏍ㄧ節闂堟侗鍎愰柡鍛叀閺屾稑鈽夐崡鐐差潻濡炪們鍎查懝楣冨煘閹寸偛绠犻梺绋匡攻椤ㄥ棝骞堥妸鈺傚€婚柦妯侯槺閿涙盯姊虹紒妯哄闁稿簺鍊濆畷鎴犫偓锝庡枟閻撶喐淇婇婵嗗惞婵犫偓娴犲鐓冪憸婊堝礂濞戞碍顐芥慨姗嗗墻閸ゆ洟鏌熺紒銏犳灈妞ゎ偄鎳橀弻宥夊煛娴e憡娈查梺缁樼箖閻楃姴顫忕紒妯肩懝闁逞屽墴閸┾偓妞ゆ帒鍊告禒婊堟煠濞茶鐏¢柡鍛埣楠炲秹顢欓崜褝绱叉俊鐐€栧ú鏍涘☉銏犵濞寸厧鐡ㄩ幊姘舵煛瀹ュ海浜圭憸鐗堝笚閺呮煡鏌涢銈呮珡濞寸姭鏅涢—鍐Χ閸℃ǚ鎷瑰┑鐐跺皺閸犲酣锝炶箛鎾佹椽顢旈崨顓濈敾闂備浇顫夐鏍窗濡ゅ懎绠熷┑鍌氭啞閳锋垿鏌ゆ慨鎰偓鏇㈠几閸岀偞鐓曢幖杈剧稻閺嗩剚顨ラ悙鎻掓殭妞ゎ偅绮撻崺鈧い鎺戝閺勩儵鏌ㄩ悢鍝勑㈢紒鈧崘鈹夸簻闊洦鎸婚敍鏃傜磼鏉堛劎鍙€婵﹦绮幏鍛存惞閻熸壆顐奸梻浣藉吹閸犲棝宕归挊澶屾殾闁硅揪绠戠粻鑽ょ磽娴h疮缂氶柛姗€浜跺娲濞淬劌缍婂畷鏇㈠箮閽樺妲梺鎸庣箓濞茬娀宕戦幘鏂ユ灁闁割煈鍠楅悘鍫濐渻閵堝骸寮柡鈧潏銊р攳濠电姴娲ょ粻鐟懊归敐鍛喐闁告ɑ鎮傚铏圭矙閹稿孩鎷遍梺娲诲弾閸犳岸鎳炴潏銊ь浄閻庯綆鍋€閹风粯绻涙潏鍓у埌闁硅櫕鐟ㄩ妵鎰板箳閹存繄褰夋俊鐐€栫敮鎺楀磹婵犳碍鍎楁繛鍡樻尰閻撴瑩寮堕崼鐔峰姢闁伙附绮撻弻鈩冩媴缁嬪簱鍋撻崸妤€钃熼柕濞炬櫆閸嬪棝鏌涚仦鍓р槈妞ゅ骏鎷� 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劌銈搁弻鐔兼儌閸濄儳袦闂佸搫鐭夌紞渚€銆佸鈧幃娆撳箹椤撶噥妫ч梻鍌欑窔濞佳兾涘▎鎴炴殰闁圭儤顨愮紞鏍ㄧ節闂堟侗鍎愰柡鍛叀閺屾稑鈽夐崡鐐差潻濡炪們鍎查懝楣冨煘閹寸偛绠犻梺绋匡攻椤ㄥ棝骞堥妸鈺傚€婚柦妯侯槺閿涙盯姊虹紒妯哄闁稿簺鍊濆畷鎴犫偓锝庡枟閻撶喐淇婇婵嗗惞婵犫偓娴犲鐓冪憸婊堝礂濞戞碍顐芥慨姗嗗墻閸ゆ洟鏌熺紒銏犳灈妞ゎ偄鎳橀弻锝呂熼懡銈呯仼闂佹悶鍎崝搴ㄥ储闁秵鐓熼煫鍥ㄦ礀娴犳粌顭胯缁瑩骞冮敓鐙€鏁嶆慨妯垮亹閸炵敻鏌i悢鍝ユ噧閻庢凹鍘剧划鍫ュ焵椤掑嫭鈷戦悗鍦濞兼劙鏌涢妸銉﹀仴闁靛棔绀侀埢搴ㄥ箣閻樼绱查梻浣筋潐閸庤櫕鏅舵惔锝囩幓婵°倕鎳忛埛鎺懨归敐鍛暈闁哥喓鍋為妵鍕敇閻愭惌妫﹂悗瑙勬礃閿曘垽寮幇鏉垮耿婵炲棗鑻禍鐐箾瀹割喕绨奸柛濠傜仛椤ㄣ儵鎮欓懠顑胯檸闂佸憡姊圭喊宥囨崲濞戙垺鍤戞い鎺嗗亾闁宠鐗忛埀顒冾潐濞叉﹢宕归崸妤冨祦婵せ鍋撻柟铏矒濡啫鈽夊▎鎴斿亾椤撱垺鈷掑ù锝呮啞閸熺偞绻涚拠褏鐣电€规洘绮岄埥澶愬閳╁啯鐝繝鐢靛仦閸垶宕瑰ú顏勭厱闁硅揪闄勯悡鏇熺箾閹寸們姘舵儑鐎n偆绠鹃柛顐ゅ枑缁€鈧梺瀹狀潐閸ㄥ潡骞冨▎鎴炲珰鐟滄垿宕ラ锔解拺閻犲洠鈧櫕鐏嗛梺鍛婎殕婵炲﹪濡存担鍓叉僵閻犻缚娅i崝锕€顪冮妶鍡楀潑闁稿鎹囬弻锝夋晲閸パ冨箣閻庤娲栭妶绋款嚕閹绢喖惟闁挎棁濮ら悵婊勭節閻㈤潧袨闁搞劎鍘ч埢鏂库槈閵忊晜鏅為梺绯曞墲閵囨盯寮稿澶嬪€堕柣鎰礋閹烘缁╁ù鐘差儐閻撶喐淇婇婵囶仩濞寸姵鐩弻锟犲幢韫囨梹鐝旈梺瀹狀潐閸ㄥ潡銆佸▎鎾村殟闁靛鍎遍弨顓熶繆閵堝洤啸闁稿鐩弫鍐Ψ閵夘喖娈梺鍛婃处閸ㄦ壆绮诲☉娆嶄簻闁圭儤鍨垫禍鎵磼闁秳鎲炬慨濠勭帛閹峰懐绮电€n偆绉烽柣搴ゎ潐濞叉﹢鏁冮姀銈冣偓浣割潩閹颁焦鈻岄梻浣告惈鐞氼偊宕濋幋鐐扮箚闁割偅娲栭獮銏ゆ煛閸モ晛啸闁伙綁绠栧缁樼瑹閳ь剙岣胯閹囧幢濞嗗苯浜炬慨妯煎帶閻忥妇鈧娲橀〃鍛存偩濠靛绀嬫い鎺戝€搁獮鍫熺節閻㈤潧浠滄俊顐n殘閹广垽骞嬩綅婢舵劕顫呴柍鈺佸暙瀵寧绻濋悽闈浶㈤柟鍐茬箻椤㈡棃鎮╅悽鐢碉紲闁哄鐗勯崝宀€绮幒妤佹嚉闁挎繂顦伴悡鐘测攽椤旇棄濮囬柍褜鍏欓崐鏇炲祫濡炪倖甯掔€氼參鍩涢幒鎳ㄥ綊鏁愰崨顔兼畼閻熸粎澧楃敮妤呭疾濠靛鐓忛柛顐g箖鐎氬懘鏌ら弶鎸庡仴婵﹥妞介、妤呭焵椤掑倻鐭撻柟缁㈠枟閸婂潡鏌涢…鎴濅簴濞存粍绮撻弻鐔煎传閸曨厜銉╂煕韫囨挾鐒搁柡灞剧洴閹垽宕妷銉ョ哗闂備礁鎼惉濂稿窗閺嵮呮殾婵炲棙鎸稿洿闂佺硶鍓濋〃蹇斿閿燂拷濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻橀弻锝夊箣閿濆棭妫勯梺鍝勵儎缁舵岸寮诲☉妯锋婵鐗婇弫楣冩⒑閸涘﹦鎳冪紒缁橈耿瀵鏁愭径濠勵吅闂佹寧绻傚Λ顓炍涢崟顖涒拺闁告繂瀚烽崕搴g磼閼搁潧鍝虹€殿喖顭烽幃銏ゅ礂鐏忔牗瀚介梺璇查叄濞佳勭珶婵犲伣锝夘敊閸撗咃紲闂佺粯鍔﹂崜娆撳礉閵堝棎浜滄い鎾跺Т閸樺鈧鍠栭…鐑藉极閹邦厼绶炲┑鐘插閺夊憡淇婇悙顏勨偓鏍暜婵犲洦鍊块柨鏇炲€哥壕鍧楁煙閸撗呭笡闁抽攱鍨块弻鐔兼嚃閳轰椒绮舵繝纰樷偓鐐藉仮闁哄本绋掔换婵嬪磼濞戞ü娣柣搴㈩問閸犳盯顢氳閸┿儲寰勯幇顒夋綂闂佸啿鎼崐鐟扳枍閸ヮ剚鈷掑ù锝囨嚀椤曟粎绱掔拠鎻掆偓姝岀亱濠电偞鍨熼幊鐐哄炊椤掆偓鍞悷婊冪箳婢规洟鎸婃竟婵嗙秺閺佹劙宕ㄩ钘夊壍闂傚倸顦鍛粹€旈崘顔嘉ч幖绮光偓鑼泿婵$偑鍊х粻鎴︽倶濮橆厾鈹嶅┑鐘叉处閸嬨劎绱掔€n厽纭舵い锔芥緲椤啴濡堕崱娆忣潷濠殿喗菧閸旀垿骞冮崸妤€鐒垫い鎺戝閳锋帒霉閿濆懏鍟為柛鐔哄仱閺岀喖宕妷銉ュ箣闂佺娅曢〃濠傜暦婵傜ǹ鍗抽柣鎰棎缁躲垽姊绘担铏瑰笡瀹€锝呮健瀵偊宕妷銉闂佽姤锚椤ャ垼銇愰幒鎾存珳闂佸憡渚楅崰妤呭磿閹炬剚娓婚柕鍫濇嚇椤庢鏌i鐐测偓鍨嚕鐠囨祴妲堥柕蹇曞閳哄懏鐓忓璇″灠閸熶即宕㈡禒瀣厽閹兼番鍩勯崯蹇涙煕閻樺磭澧甸柍銉畵閺屻劎鈧絺鏅濈粻姘舵⒑瑜版帗锛熺紒鈧笟鈧幃鈥斥槈閵忥紕鍘遍柣蹇曞仜婢т粙鎮¢婊呯<闁靛ǹ鍊楅惌娆愭叏婵犲嫮甯涢柟宄版嚇瀹曘劑妫冨☉姘毙ㄩ悗娈垮枤閺佸銆佸Δ鍛<婵犲﹤鎳愰崢顖炴⒒娴d警鏀伴柟娲讳簽閳ь剟娼ч惌鍌氼嚕椤愶箑纾奸柣鎰嚟閸欏棝姊虹紒妯荤闁稿﹤婀遍埀顒佺啲閹凤拷
首页 > 硬件设计 > 嵌入式设计 > 基于Windows CE.NET实现蓝牙通讯模块的几种方法

基于Windows CE.NET实现蓝牙通讯模块的几种方法

时间:01-25 来源:电子技术应用 点击:

引 言

自1998年,世界九大电子产业巨头共同发起蓝牙特殊利益集团SIG后,在短短不到十年之内,蓝牙技术已经被应用到如信息家电、电子商务、汽车、航空、医 疗、交通等多个领域。在移动计算方面,蓝牙技术采用了一种极为经济的形式解决了无线通讯"最后10m"的问题,从而替代了各种移动信息电子设备之间的电 缆。因此,蓝牙技术在移动计算领域的应用将十分广阔,它的应用开发也就有很大的实际意义。

微软公司从1996年起开发了嵌入式操作系统Windows CE 1.0开始,凭借着其在PC市场上的成功经验和友好熟悉的界面逐渐扩大着自己在嵌入式操作系统市场的份额。Windowsmobile平台是微软公司针对嵌入式环境下开发的一套嵌入式操作系统,其主要 是指Windows CE??NET,Windows CE.NET的最新版本为Windows CE 5.0,其中包括3个版本:以数据为中心的掌上电脑 Pocket PC;以语音为中心的智能手机Smart Phone;以娱乐为中心的便携式媒体中心Portable Media Centers。而在 这3个版本中都可能涉及到蓝牙应用的开发。

在Windows CE.NET的开发上,目前采用微软公司2005年年底推出的Visual Studio 2005是最理想的选择。用 Visual Studio 2005可以进行利用C#,或VB.NET等语言开发基于.NET Compact Framework 2.0或1.0的 托管码WinCE程序,也可以利用C++语言来开发基于MFC,ATL或Win32API的本机码WinCE程序。

因为在微软最新的.NET Compact Framework 2.0的类库中还未包含针对蓝牙通讯模块的类库,而且目前关于在Windows CE中开发蓝牙通讯模块应用程序的介绍还很少,同时开发蓝牙通讯技术的应用需要十分广泛,所以本文将就此进行一些讨论。

1 基于托管码开发蓝牙通讯模块

基于托管码的开发就是使用一套运行时环境(run-time environment)的应用程序接口来开发。
一般情况下,托管码应用程序的开发会比较简单和快速,并且可跨软件平台和处理器来运行,所以开发出的托管码也能重新使用并有较高的可移植性。

另外,内存管理、资源管理、资源收集、安全性管理等琐碎工作都由运行时环境来处理。应用程序开发工程师不必费心处理。托管应用程序在目标机器上运行,是通过目标机器端的实时编译器来实时把托管码编译成目标机器码后在目标机器上执行。

由于在.NET平台下,采用CLR(公共语言运行时)可以用不同的语言来调用.NET Compact Framework来开发相同功能的应用程序,所以本文托管码部分仅采用C#语言为例来介绍蓝牙通讯模块开发。

1.1 利用P/Invoke方法编写蓝牙通讯模块

蓝牙通讯模块是一个涉及到驱动硬件的应用程序开发,而.NET Compact Framework并不是一个对Win32API进行了完整封装的类库。 所以在基于托管码开发蓝牙通讯模块中必须利用到托管代码如何与非托管代码交互技术。P/Invoke全称为Platform Invoke,是.NET开 发平台下允许托管代码调用DLL库的本地代码函数的服务,类似于JA-VA中的GNI的概念。图1说明了P/Invoke方法的工作原理。首先用相应语言 的编译器将托管的源代码编译成Assembly的形式,其中包括元数据和中间语言代码。而此时P/Invoke的声明会以元数据的形式存在于 Assembly中,当Assembly被CLR调用的时候,CLR会根据元数据的声明在对应的DLL函数中查找DLL的实现。如果找到,就将其加载到内 存中,并定位此DLL函数的人口点。将托管的参数人栈,并将函数的人口点指向对应的native dll,从而完成了托管代码调用非托管代码的DLL。

利用P/Invoke方法编写蓝牙通讯模块,DllI-port属性非常有用。下面的代码将用例子说明此通用方案,例中托管程序将调用MessageBox(位于User32.lib中):

using
using namespace System:: Runtime::InteropSer-vices;
namespace SysWin32

[DllImport ( "user32. dll", EntryPoint = "MessageBox", CharSet = Unicode)]
int MessageBox(void * hWnd, wchar_t * lpText,wchar_t * lpCaption, unsigned int uType);

int main()
SysWin32 :: MessageBox(0, L" Hello world ! ", L"Greetings", 0)


注意包含DllImport的代码行。此代码行根据参数值通知编译器,使之声明位于User32.dll中的函数,并将签名中出现的所有字符串(如参数或 返回值)视为Unicode字符串。如果缺少EntryPoint参数,则默认值为函数名。另外,由于CharSet参数指定Unicode,因此公共语 言运行库将首先查找称为MessageBoxW的函数。如果运行库未找到此函数,它将根据调用约定查找MessageBox以及相应的修饰名。

当调用用户定义的DLL中所包含的函数时,有必要将extern"C"添加在DLL函数声明之前,如下所示:

extern"C"SAMPLEDLL_API int fnSam-pleDLL(void);

在调用非本机码时,需要注意的是要将非结构化参数由托管封送处理为本机码形式。可以利用CharSet参数值的作用,将参数中字符串(string*类 型)都自动转换为wchar_t*。同样,所有Int32参数类型转换为非托管int,UInt32参数类型转换为非托管unsignedint,而 Intl6参数类型转换为了short int。char*用于[in]参数的为String*(CharSet=Ansi),用于[out]参数或返回 值的为Text::StringBuilder*。wchar-t*用于[in]参数为String*(CharSet=Unicode),用于 [out]参数或返回值的为Text::StringBuilder*。需要注意的是函数指针必须具有_stdcall调用约定,这是因为这是 DllImport支持的唯一类型。对于数组来说数组(如wchar_t*[ ]),CharSet参数仅应用于函数参数的根类型。因此,无论 CharSet的值是什么,String*_ _gc[ ]将被封送处理为wchar_t*[]。除简单类型外,运行库还提供了一种机制,可以将简单结构 由托管上下文封送处理为非托管上下文。简单结构不包含任何内部数据成员指针、结构化类型的成员或其他元素。

在做一个关于蓝牙通讯程序前,还需要一些关于蓝牙的基础知识。一个蓝牙模块程序需要包含开启蓝牙,配对,连接,建立串行通道,然后开启通讯过程,还需要在 应用程序中设置串行端口。因为蓝牙技术有安全方面的设置,所以需要对蓝牙设备进行配对。蓝牙的工作状态总共有3种,分别为开启、关闭、可发现。并且所有的 通讯设备都必须有一个对应的DeviceID,蓝牙也不例外,蓝牙的DeviceID是一串以":"分隔的16进制的数字。有了上述知识,就可以在托管码中利用P/Invoke方法开始编写蓝牙通讯模块了。

对应的每一步需要调用的基本函数如下:

•获取本地设备的ID
[DllImport ( "Btdrt. dll", SetLastError = true) ]
public static extern int BthReadLocalAddr (byte[]PBa)
•获取远程设备的ID
[DllImport( "ws2. dll", EntryPoint = "WSALook-upServiceBegin", SetLastError= true)]
public static extern int CeLookupServiceBegin(byte[ ] pQuerySet, LookupFlags dwFlags, ref intlphLookup)
•监听服务
[DllImport (" ws2. dll", EntryPoint = "WSASetSer-vice", SetLastError= true)]
public static extern int CeSetService
(byte[ ] pQuerySet, RNRSERVICE_REGISTER,LookupFlags dwFlags)
•连接
[DllImport ( "mscoree", EntryPoint = "@ 339" )]
public static extern int connect (int s, byte []name, int namelen)
•蓝牙的安全设置
获取配对码请求
[DllImport("Btdrt. dll", SetLastError= true)]
public static extern int BthGetPINRequest(byte[]pba)
设置配对码
[DllImport( "btdrt. dll", SetLastError= true)
public static extern int BthSetPIN(byte[] pba, intcPinLength, byte [] ppin)
创建ACL连接:
[DllImport("Btdrt. dll", SetLastError= true)
public static extern int BthCreateACLConnection (byte[] pbt, ref ushort phandle);
然后是配对码验证:
[DllImport("Btdrt. dll", SetLastError= true)]
public static extern int BthAuthenticate (byte []pbt);
然后一定要关闭连接:
[DllImport("Btdrt. dll", SetLastError= true)]
public static extern int BthCloseConnection(ushorthandle);
•设置蓝牙无线电状态

[DllImport("BthUtil. dll", SetLastError= true)]public static extern int BthSetMode (RadioModedwMode)
在建立好蓝牙设备的连接后,就可以进行两个蓝牙设备之间的通讯了。由于可以将蓝牙通信当作一个虚拟的串行通信来处理,所以在建立通讯的过程中可以采用类似于串口之间的通讯方式。而关于串口通讯这方面资料很多,本文就不具体详述了。

1.2 利用微软蓝牙嵌入式工具包编写蓝牙通讯模块

微软蓝牙嵌入式工具包是微软公司新推出来基于.NET Compact Framework 2.0的一款专门用来快速开发蓝牙应用程序的工具包,直接 在.NET平台下直接调用其中类库,可以快速,简单的开发一般的蓝牙应用程序。不过该工具包只能在Windows CE 5.0下使用。利用工具包可以完 成:启动一个蓝牙服务,寻找周边蓝牙设备,连接已存在的蓝牙设备或者服务。工具包可以在微软网站下载。

利用此工具做两个蓝牙设备间进行简单文本传输的程序部分代码如下:

Server 端:
Guid serviceGuid = new Guid (" { 81553B2B-FFOB-4415-86C9-22B799058B81 } ");
ServerHandle sh = btseore. CreateService (ser-viceGuid);
NetworkStream ns= sh. AceeptConnection()Sting dataToSend= " Hello";
Byte [] dataBuffer = System. Text. ASCIIEncoding. ASCII. GetBytes(dataToSend);
ns. Write(dataBuffer, 0, dataBuffer. Length);
ns. Flush();
ns. Close();
Client 端:
PairedDevices= btsCore. GetPairedDevices();
Foreach (BluetoothDevice device in pairedDevices)
{pairedDevicesListBox. Item. Add (device. deviceName) ;}
Guid serviceGuid = new Guid (" { 01550D2D-FF0D-4415-86C9-22B799058B81 } ");
If (pairedDevicesListBox. SelectedIndex﹥=0);
{ BluetoothDevice deviceToConnect= ( BluetoothDevice ) pairedDevices [ pairedDevicesListBox. Selected];
NetworkStream ns = btsCore. Connect (deviceTo-Connect, serviceGuid);
byte[ ] buffer=new byte[2000]
ns. Read(buffer, 0,50);
char[ ] bufferAsChars= System. Text. ASCII. GetChars(buffer)
System. String s= System. Text. Encoding. ASCIIGetString(buffer, 0, buffer, length);
Message. Show(s)
ns. Close(); }

1.3 利用OpenNETCF编写蓝牙通讯模块

OpenNETCF是一个可以有效提高Windows Mobile开发效率的第三方开源类库。是一帮Windows Mobile爱好者共同编写的,里 面提供了很多在.NET Compact Framework 2.0中未能包含的类库。有两种方式可以来使用它:一种是可以将其当作一个组件安装在 Visual Studio2005中;另一种是可以将其原代码编辑拿来使用。在OpenNETCF开源类库中就包括有蓝牙方面的,所以也可以利用 OpenNETCF来编写蓝牙通讯模块。对应类库可在WWW.opennetcf.com网站下载。在类库中,可以利用命名空间 OpenNETCF.IO.Ports下的Blue-toothSerialPort来建立蓝牙连接,利用命名空间 OpenNETCF.IO.Serial中内容进行蓝牙程序的通讯。

鐏忓嫰顣舵稉鎾茬瑹閸╃顔勯弫娆戔柤閹恒劏宕�

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top