锘??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久在线观看,亚洲福利小视频,欧美大片在线看免费观看http://m.shnenglu.com/yishanhante/category/4697.htmlzh-cnSat, 24 May 2008 14:04:19 GMTSat, 24 May 2008 14:04:19 GMT60Win32涓插彛緙栫▼http://m.shnenglu.com/yishanhante/articles/28069.htmljayjaySun, 15 Jul 2007 07:23:00 GMThttp://m.shnenglu.com/yishanhante/articles/28069.htmlhttp://m.shnenglu.com/yishanhante/comments/28069.htmlhttp://m.shnenglu.com/yishanhante/articles/28069.html#Feedback0http://m.shnenglu.com/yishanhante/comments/commentRss/28069.htmlhttp://m.shnenglu.com/yishanhante/services/trackbacks/28069.html        涓鑸儏鍐典笅錛屽伐鎺ф満鍜屽悇鏅鴻兘浠〃閫氳繃RS485鎬葷嚎榪涜閫氫俊銆俁S485鐨勯氫俊鏂瑰紡鏄崐鍙屽伐鐨勶紝鍙兘鐢變綔涓轟富鑺傜偣鐨勫伐鎺C鏈轟緷嬈¤疆璇㈢綉緇滀笂鐨勫悇鏅鴻兘鎺у埗鍗曞厓瀛愯妭鐐廣傛瘡嬈¢氫俊閮芥槸鐢盤C鏈洪氳繃涓插彛鍚戞櫤鑳芥帶鍒跺崟鍏冨彂甯冨懡浠わ紝鏅鴻兘鎺у埗鍗曞厓鍦ㄦ帴鏀跺埌姝g‘鐨勫懡浠ゅ悗浣滃嚭搴旂瓟銆?br>銆銆鍦╓in32涓嬶紝鍙互浣跨敤涓ょ緙栫▼鏂瑰紡瀹炵幇涓插彛閫氫俊錛屽叾涓鏄嬌鐢ˋctiveX鎺т歡錛岃繖縐嶆柟娉曠▼搴忕畝鍗曪紝浣嗘瑺鐏墊椿銆傚叾浜屾槸璋冪敤Windows鐨凙PI鍑芥暟錛岃繖縐嶆柟娉曞彲浠ユ竻妤氬湴鎺屾彙涓插彛閫氫俊鐨勬満鍒訛紝騫朵笖鑷敱鐏墊椿銆傛湰鏂囨垜浠彧浠嬬粛API涓插彛閫氫俊閮ㄥ垎銆?br>銆銆涓插彛鐨勬搷浣滃彲浠ユ湁涓ょ鎿嶄綔鏂瑰紡錛氬悓姝ユ搷浣滄柟寮忓拰閲嶅彔鎿嶄綔鏂瑰紡錛堝張縐頒負寮傛鎿嶄綔鏂瑰紡錛夈傚悓姝ユ搷浣滄椂錛孉PI鍑芥暟浼氶樆濉炵洿鍒版搷浣滃畬鎴愪互鍚庢墠鑳借繑鍥烇紙鍦ㄥ綰跨▼鏂瑰紡涓紝铏界劧涓嶄細闃誨涓葷嚎紼嬶紝浣嗘槸浠嶇劧浼氶樆濉炵洃鍚嚎紼嬶級錛涜岄噸鍙犳搷浣滄柟寮忥紝API鍑芥暟浼氱珛鍗寵繑鍥烇紝鎿嶄綔鍦ㄥ悗鍙拌繘琛岋紝閬垮厤綰跨▼鐨勯樆濉炪?

鏃犺閭g鎿嶄綔鏂瑰紡錛屼竴鑸兘閫氳繃鍥涗釜姝ラ鏉ュ畬鎴愶細

錛?錛?鎵撳紑涓插彛

銆銆Win32緋葷粺鎶婃枃浠剁殑姒傚康榪涜浜嗘墿灞曘傛棤璁烘槸鏂囦歡銆侀氫俊璁懼銆佸懡鍚嶇閬撱侀偖浠舵Ы銆佺鐩樸佽繕鏄帶鍒跺彴錛岄兘鏄敤API鍑芥暟CreateFile鏉ユ墦寮鎴栧垱寤虹殑銆傝鍑芥暟鐨勫師鍨嬩負錛?

HANDLE CreateFile( LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
  • lpFileName錛氬皢瑕佹墦寮鐨勪覆鍙i昏緫鍚嶏紝濡?#8220;COM1”錛?
  • dwDesiredAccess錛氭寚瀹氫覆鍙h闂殑綾誨瀷錛屽彲浠ユ槸璇誨彇銆佸啓鍏ユ垨浜岃呭茍鍒楋紱
  • dwShareMode錛氭寚瀹氬叡浜睘鎬э紝鐢變簬涓插彛涓嶈兘鍏變韓錛岃鍙傛暟蹇呴』緗負0錛?
  • lpSecurityAttributes錛氬紩鐢ㄥ畨鍏ㄦу睘鎬х粨鏋勶紝緙虹渷鍊間負NULL錛?
  • dwCreationDistribution錛氬垱寤烘爣蹇楋紝瀵逛覆鍙f搷浣滆鍙傛暟蹇呴』緗負OPEN_EXISTING錛?
  • dwFlagsAndAttributes錛氬睘鎬ф弿榪幫紝鐢ㄤ簬鎸囧畾璇ヤ覆鍙f槸鍚﹁繘琛屽紓姝ユ搷浣滐紝璇ュ間負FILE_FLAG_OVERLAPPED錛岃〃紺轟嬌鐢ㄥ紓姝ョ殑I/O錛涜鍊間負0錛岃〃紺哄悓姝/O鎿嶄綔錛?
  • hTemplateFile錛氬涓插彛鑰岃█璇ュ弬鏁板繀欏葷疆涓篘ULL錛?

鍚屾I/O鏂瑰紡鎵撳紑涓插彛鐨勭ず渚嬩唬鐮侊細

	HANDLE hCom;  //鍏ㄥ眬鍙橀噺錛屼覆鍙e彞鏌?
hCom=CreateFile("COM1",//COM1鍙?
GENERIC_READ|GENERIC_WRITE, //鍏佽璇誨拰鍐?
0, //鐙崰鏂瑰紡
NULL,
OPEN_EXISTING, //鎵撳紑鑰屼笉鏄垱寤?
0, //鍚屾鏂瑰紡
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("鎵撳紑COM澶辮觸!");
return FALSE;
}
return TRUE;
閲嶅彔I/O鎵撳紑涓插彛鐨勭ず渚嬩唬鐮侊細
	HANDLE hCom;  //鍏ㄥ眬鍙橀噺錛屼覆鍙e彞鏌?
hCom =CreateFile("COM1",  //COM1鍙?
GENERIC_READ|GENERIC_WRITE, //鍏佽璇誨拰鍐?
0,  //鐙崰鏂瑰紡
NULL,
OPEN_EXISTING,  //鎵撳紑鑰屼笉鏄垱寤?
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //閲嶅彔鏂瑰紡
NULL);
if(hCom ==INVALID_HANDLE_VALUE)
{
AfxMessageBox("鎵撳紑COM澶辮觸!");
return FALSE;
}
return TRUE;
錛?錛夈?a name=閰嶇疆涓插彛>閰嶇疆涓插彛

銆銆鍦ㄦ墦寮閫氳璁懼鍙ユ焺鍚庯紝甯稿父闇瑕佸涓插彛榪涜涓浜涘垵濮嬪寲閰嶇疆宸ヤ綔銆傝繖闇瑕侀氳繃涓涓狣CB緇撴瀯鏉ヨ繘琛屻侱CB緇撴瀯鍖呭惈浜嗚濡傛嘗鐗圭巼銆佹暟鎹綅鏁般佸鍋舵牎楠屽拰鍋滄浣嶆暟絳変俊鎭傚湪鏌ヨ鎴栭厤緗覆鍙g殑灞炴ф椂錛岄兘瑕佺敤DCB緇撴瀯鏉ヤ綔涓虹紦鍐插尯銆?br>銆銆涓鑸敤CreateFile鎵撳紑涓插彛鍚庯紝鍙互璋冪敤GetCommState鍑芥暟鏉ヨ幏鍙栦覆鍙g殑鍒濆閰嶇疆銆傝淇敼涓插彛鐨勯厤緗紝搴旇鍏堜慨鏀笵CB緇撴瀯錛岀劧鍚庡啀璋冪敤SetCommState鍑芥暟璁劇疆涓插彛銆?br>銆銆DCB緇撴瀯鍖呭惈浜嗕覆鍙g殑鍚勯」鍙傛暟璁劇疆錛屼笅闈粎浠嬬粛鍑犱釜璇ョ粨鏋勫父鐢ㄧ殑鍙橀噺錛?

typedef struct _DCB{
………
//娉㈢壒鐜囷紝鎸囧畾閫氫俊璁懼鐨勪紶杈撻熺巼銆傝繖涓垚鍛樺彲浠ユ槸瀹為檯娉㈢壒鐜囧兼垨鑰呬笅闈㈢殑甯擱噺鍊間箣涓錛?
DWORD BaudRate;
CBR_110錛孋BR_300錛孋BR_600錛孋BR_1200錛孋BR_2400錛孋BR_4800錛孋BR_9600錛孋BR_19200錛?CBR_38400錛?
CBR_56000錛?CBR_57600錛?CBR_115200錛?CBR_128000錛?CBR_256000錛?CBR_14400
DWORD fParity; // 鎸囧畾濂囧伓鏍¢獙浣胯兘銆傝嫢姝ゆ垚鍛樹負1錛屽厑璁稿鍋舵牎楠屾鏌?
…
BYTE ByteSize; // 閫氫俊瀛楄妭浣嶆暟錛?鈥?
BYTE Parity; //鎸囧畾濂囧伓鏍¢獙鏂規(guī)硶銆傛鎴愬憳鍙互鏈変笅鍒楀鹼細
EVENPARITY 鍋舵牎楠?    NOPARITY 鏃犳牎楠?
MARKPARITY 鏍囪鏍¢獙   ODDPARITY 濂囨牎楠?
BYTE StopBits; //鎸囧畾鍋滄浣嶇殑浣嶆暟銆傛鎴愬憳鍙互鏈変笅鍒楀鹼細
ONESTOPBIT 1浣嶅仠姝綅   TWOSTOPBITS 2浣嶅仠姝綅
ONE5STOPBITS   1.5浣嶅仠姝綅
………
} DCB;
winbase.h鏂囦歡涓畾涔変簡浠ヤ笂鐢ㄥ埌鐨勫父閲忋傚涓嬶細
#define NOPARITY            0
#define ODDPARITY           1
#define EVENPARITY          2
#define ONESTOPBIT          0
#define ONE5STOPBITS        1
#define TWOSTOPBITS         2
#define CBR_110             110
#define CBR_300             300
#define CBR_600             600
#define CBR_1200            1200
#define CBR_2400            2400
#define CBR_4800            4800
#define CBR_9600            9600
#define CBR_14400           14400
#define CBR_19200           19200
#define CBR_38400           38400
#define CBR_56000           56000
#define CBR_57600           57600
#define CBR_115200          115200
#define CBR_128000          128000
#define CBR_256000          256000
GetCommState鍑芥暟鍙互鑾峰緱COM鍙g殑璁懼鎺у埗鍧楋紝浠庤岃幏寰楃浉鍏沖弬鏁幫細
BOOL GetCommState(
HANDLE hFile, //鏍囪瘑閫氳绔彛鐨勫彞鏌?
LPDCB lpDCB //鎸囧悜涓涓澶囨帶鍒跺潡錛圖CB緇撴瀯錛夌殑鎸囬拡
);
SetCommState鍑芥暟璁劇疆COM鍙g殑璁懼鎺у埗鍧楋細
BOOL SetCommState(
HANDLE hFile,
LPDCB lpDCB
);
銆銆闄や簡鍦˙CD涓殑璁劇疆澶栵紝紼嬪簭涓鑸繕闇瑕佽緗甀/O緙撳啿鍖虹殑澶у皬鍜岃秴鏃躲俉indows鐢↖/O緙撳啿鍖烘潵鏆傚瓨涓插彛杈撳叆鍜岃緭鍑虹殑鏁版嵁銆傚鏋滈氫俊鐨勯熺巼杈冮珮錛屽垯搴旇璁劇疆杈冨ぇ鐨勭紦鍐插尯銆傝皟鐢⊿etupComm鍑芥暟鍙互璁劇疆涓茶鍙g殑杈撳叆鍜岃緭鍑虹紦鍐插尯鐨勫ぇ灝忋?
BOOL SetupComm(
HANDLE hFile,	// 閫氫俊璁懼鐨勫彞鏌?
DWORD dwInQueue,	// 杈撳叆緙撳啿鍖虹殑澶у皬錛堝瓧鑺傛暟錛?
DWORD dwOutQueue	// 杈撳嚭緙撳啿鍖虹殑澶у皬錛堝瓧鑺傛暟錛?
);
銆銆鍦ㄧ敤ReadFile鍜學riteFile璇誨啓涓茶鍙f椂錛岄渶瑕佽冭檻瓚呮椂闂銆傝秴鏃剁殑浣滅敤鏄湪鎸囧畾鐨勬椂闂村唴娌℃湁璇誨叆鎴栧彂閫佹寚瀹氭暟閲忕殑瀛楃錛孯eadFile鎴朩riteFile鐨勬搷浣滀粛鐒朵細緇撴潫銆?br>銆銆瑕佹煡璇㈠綋鍓嶇殑瓚呮椂璁劇疆搴旇皟鐢℅etCommTimeouts鍑芥暟錛岃鍑芥暟浼氬~鍏呬竴涓狢OMMTIMEOUTS緇撴瀯銆傝皟鐢⊿etCommTimeouts鍙互鐢ㄦ煇涓涓狢OMMTIMEOUTS緇撴瀯鐨勫唴瀹規(guī)潵璁劇疆瓚呮椂銆?br>銆銆璇誨啓涓插彛鐨勮秴鏃舵湁涓ょ錛氶棿闅旇秴鏃跺拰鎬昏秴鏃躲傞棿闅旇秴鏃舵槸鎸囧湪鎺ユ敹鏃朵袱涓瓧絎︿箣闂寸殑鏈澶ф椂寤躲傛昏秴鏃舵槸鎸囪鍐欐搷浣滄誨叡鑺辮垂鐨勬渶澶ф椂闂淬傚啓鎿嶄綔鍙敮鎸佹昏秴鏃訛紝鑰岃鎿嶄綔涓ょ瓚呮椂鍧囨敮鎸併傜敤COMMTIMEOUTS緇撴瀯鍙互瑙勫畾璇誨啓鎿嶄綔鐨勮秴鏃躲?br>COMMTIMEOUTS緇撴瀯鐨勫畾涔変負錛?
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout; //璇婚棿闅旇秴鏃?
DWORD ReadTotalTimeoutMultiplier; //璇繪椂闂寸郴鏁?
DWORD ReadTotalTimeoutConstant; //璇繪椂闂村父閲?
DWORD WriteTotalTimeoutMultiplier; // 鍐欐椂闂寸郴鏁?
DWORD WriteTotalTimeoutConstant; //鍐欐椂闂村父閲?
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
COMMTIMEOUTS緇撴瀯鐨勬垚鍛橀兘浠ユ縐掍負鍗曚綅銆傛昏秴鏃剁殑璁$畻鍏紡鏄細
鎬昏秴鏃訛紳鏃墮棿緋繪暟×瑕佹眰璇?鍐欑殑瀛楃鏁幫紜鏃墮棿甯擱噺
渚嬪錛岃璇誨叆10涓瓧絎︼紝閭d箞璇繪搷浣滅殑鎬昏秴鏃剁殑璁$畻鍏紡涓猴細
璇繪昏秴鏃訛紳ReadTotalTimeoutMultiplier×10錛婻eadTotalTimeoutConstant
鍙互鐪嬪嚭錛氶棿闅旇秴鏃跺拰鎬昏秴鏃剁殑璁劇疆鏄笉鐩稿叧鐨勶紝榪欏彲浠ユ柟渚塊氫俊紼嬪簭鐏墊椿鍦拌緗悇縐嶈秴鏃躲?

濡傛灉鎵鏈夊啓瓚呮椂鍙傛暟鍧囦負0錛岄偅涔堝氨涓嶄嬌鐢ㄥ啓瓚呮椂銆傚鏋淩eadIntervalTimeout涓?錛岄偅涔堝氨涓嶄嬌鐢ㄨ闂撮殧瓚呮椂銆傚鏋淩eadTotalTimeoutMultiplier 鍜?ReadTotalTimeoutConstant 閮戒負0錛屽垯涓嶄嬌鐢ㄨ鎬昏秴鏃躲傚鏋滆闂撮殧瓚呮椂琚緗垚MAXDWORD騫朵笖璇繪椂闂寸郴鏁板拰璇繪椂闂村父閲忛兘涓?錛岄偅涔堝湪璇諱竴嬈¤緭鍏ョ紦鍐插尯鐨勫唴瀹瑰悗璇繪搷浣滃氨绔嬪嵆榪斿洖錛岃屼笉綆℃槸鍚﹁鍏ヤ簡瑕佹眰鐨勫瓧絎︺?br>銆銆鍦ㄧ敤閲嶅彔鏂瑰紡璇誨啓涓插彛鏃訛紝铏界劧ReadFile鍜學riteFile鍦ㄥ畬鎴愭搷浣滀互鍓嶅氨鍙兘榪斿洖錛屼絾瓚呮椂浠嶇劧鏄搗浣滅敤鐨勩傚湪榪欑鎯呭喌涓嬶紝瓚呮椂瑙勫畾鐨勬槸鎿嶄綔鐨勫畬鎴愭椂闂達紝鑰屼笉鏄疪eadFile鍜學riteFile鐨勮繑鍥炴椂闂淬?br>閰嶇疆涓插彛鐨勭ず渚嬩唬鐮侊細
	SetupComm(hCom,1024,1024); //杈撳叆緙撳啿鍖哄拰杈撳嚭緙撳啿鍖虹殑澶у皬閮芥槸1024
COMMTIMEOUTS TimeOuts;
//璁懼畾璇昏秴鏃?
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
//璁懼畾鍐欒秴鏃?
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=2000;
SetCommTimeouts(hCom,&TimeOuts); //璁劇疆瓚呮椂
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //娉㈢壒鐜囦負9600
dcb.ByteSize=8; //姣忎釜瀛楄妭鏈?浣?
dcb.Parity=NOPARITY; //鏃犲鍋舵牎楠屼綅
dcb.StopBits=TWOSTOPBITS; //涓や釜鍋滄浣?
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
鍦ㄨ鍐欎覆鍙d箣鍓嶏紝榪樿鐢≒urgeComm()鍑芥暟娓呯┖緙撳啿鍖猴紝璇ュ嚱鏁板師鍨嬶細
BOOL PurgeComm(
HANDLE hFile,	//涓插彛鍙ユ焺
DWORD dwFlags	// 闇瑕佸畬鎴愮殑鎿嶄綔
);
鍙傛暟dwFlags鎸囧畾瑕佸畬鎴愮殑鎿嶄綔錛屽彲浠ユ槸涓嬪垪鍊肩殑緇勫悎錛?
PURGE_TXABORT	  涓柇鎵鏈夊啓鎿嶄綔騫剁珛鍗寵繑鍥烇紝鍗充嬌鍐欐搷浣滆繕娌℃湁瀹屾垚銆?
PURGE_RXABORT	  涓柇鎵鏈夎鎿嶄綔騫剁珛鍗寵繑鍥烇紝鍗充嬌璇繪搷浣滆繕娌℃湁瀹屾垚銆?
PURGE_TXCLEAR	  娓呴櫎杈撳嚭緙撳啿鍖?
PURGE_RXCLEAR	  娓呴櫎杈撳叆緙撳啿鍖?
錛?錛夈?a name=璇誨啓涓插彛>璇誨啓涓插彛

鎴戜滑浣跨敤ReadFile鍜學riteFile璇誨啓涓插彛錛屼笅闈㈡槸涓や釜鍑芥暟鐨勫0鏄庯細

BOOL ReadFile(
HANDLE hFile,	//涓插彛鐨勫彞鏌?
// 璇誨叆鐨勬暟鎹瓨鍌ㄧ殑鍦板潃錛?
// 鍗寵鍏ョ殑鏁版嵁灝嗗瓨鍌ㄥ湪浠ヨ鎸囬拡鐨勫間負棣栧湴鍧鐨勪竴鐗囧唴瀛樺尯
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,	// 瑕佽鍏ョ殑鏁版嵁鐨勫瓧鑺傛暟
// 鎸囧悜涓涓狣WORD鏁板鹼紝璇ユ暟鍊艱繑鍥炶鎿嶄綔瀹為檯璇誨叆鐨勫瓧鑺傛暟
LPDWORD lpNumberOfBytesRead,
// 閲嶅彔鎿嶄綔鏃訛紝璇ュ弬鏁版寚鍚戜竴涓狾VERLAPPED緇撴瀯錛屽悓姝ユ搷浣滄椂錛岃鍙傛暟涓篘ULL銆?
LPOVERLAPPED lpOverlapped
);
BOOL WriteFile(
HANDLE hFile,	//涓插彛鐨勫彞鏌?
// 鍐欏叆鐨勬暟鎹瓨鍌ㄧ殑鍦板潃錛?
// 鍗充互璇ユ寚閽堢殑鍊間負棣栧湴鍧鐨刵NumberOfBytesToWrite
// 涓瓧鑺傜殑鏁版嵁灝嗚鍐欏叆涓插彛鐨勫彂閫佹暟鎹紦鍐插尯銆?
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,	//瑕佸啓鍏ョ殑鏁版嵁鐨勫瓧鑺傛暟
// 鎸囧悜鎸囧悜涓涓狣WORD鏁板鹼紝璇ユ暟鍊艱繑鍥炲疄闄呭啓鍏ョ殑瀛楄妭鏁?
LPDWORD lpNumberOfBytesWritten,
// 閲嶅彔鎿嶄綔鏃訛紝璇ュ弬鏁版寚鍚戜竴涓狾VERLAPPED緇撴瀯錛?
// 鍚屾鎿嶄綔鏃訛紝璇ュ弬鏁頒負NULL銆?
LPOVERLAPPED lpOverlapped
);
銆銆鍦ㄧ敤ReadFile鍜學riteFile璇誨啓涓插彛鏃訛紝鏃㈠彲浠ュ悓姝ユ墽琛岋紝涔熷彲浠ラ噸鍙犳墽琛屻傚湪鍚屾鎵ц鏃訛紝鍑芥暟鐩村埌鎿嶄綔瀹屾垚鍚庢墠榪斿洖銆傝繖鎰忓懗鐫鍚屾鎵ц鏃剁嚎紼嬩細琚樆濉烇紝浠庤屽鑷存晥鐜囦笅闄嶃傚湪閲嶅彔鎵ц鏃訛紝鍗充嬌鎿嶄綔榪樻湭瀹屾垚錛岃繖涓や釜鍑芥暟涔熶細绔嬪嵆榪斿洖錛岃垂鏃剁殑I/O鎿嶄綔鍦ㄥ悗鍙拌繘琛屻?br>銆銆ReadFile鍜學riteFile鍑芥暟鏄悓姝ヨ繕鏄紓姝ョ敱CreateFile鍑芥暟鍐沖畾錛屽鏋滃湪璋冪敤CreateFile鍒涘緩鍙ユ焺鏃舵寚瀹氫簡FILE_FLAG_OVERLAPPED鏍囧織錛岄偅涔堣皟鐢≧eadFile鍜學riteFile瀵硅鍙ユ焺榪涜鐨勬搷浣滃氨搴旇鏄噸鍙犵殑錛涘鏋滄湭鎸囧畾閲嶅彔鏍囧織錛屽垯璇誨啓鎿嶄綔搴旇鏄悓姝ョ殑銆俁eadFile鍜學riteFile鍑芥暟鐨勫悓姝ユ垨鑰呭紓姝ュ簲璇ュ拰CreateFile鍑芥暟鐩鎬竴鑷淬?br>銆銆ReadFile鍑芥暟鍙鍦ㄤ覆鍙h緭鍏ョ紦鍐插尯涓鍏ユ寚瀹氭暟閲忕殑瀛楃錛屽氨綆楀畬鎴愭搷浣溿傝學riteFile鍑芥暟涓嶄絾瑕佹妸鎸囧畾鏁伴噺鐨勫瓧絎︽嫹鍏ュ埌杈撳嚭緙撳啿鍖猴紝鑰屼笖瑕佺瓑榪欎簺瀛楃浠庝覆琛屽彛閫佸嚭鍘誨悗鎵嶇畻瀹屾垚鎿嶄綔銆?br>銆銆濡傛灉鎿嶄綔鎴愬姛錛岃繖涓や釜鍑芥暟閮借繑鍥濼RUE銆傞渶瑕佹敞鎰忕殑鏄紝褰揜eadFile鍜學riteFile榪斿洖FALSE鏃訛紝涓嶄竴瀹氬氨鏄搷浣滃け璐ワ紝綰跨▼搴旇璋冪敤GetLastError鍑芥暟鍒嗘瀽榪斿洖鐨勭粨鏋溿備緥濡傦紝鍦ㄩ噸鍙犳搷浣滄椂濡傛灉鎿嶄綔榪樻湭瀹屾垚鍑芥暟灝辮繑鍥烇紝閭d箞鍑芥暟灝辮繑鍥濬ALSE錛岃屼笖GetLastError鍑芥暟榪斿洖ERROR_IO_PENDING銆傝繖璇存槑閲嶅彔鎿嶄綔榪樻湭瀹屾垚銆?br>
鍚屾鏂瑰紡璇誨啓涓插彛姣旇緝綆鍗曪紝涓嬮潰鍏堜緥涓懼悓姝ユ柟寮忚鍐欎覆鍙g殑浠g爜錛?
//鍚屾璇諱覆鍙?
char str[100];
DWORD wCount;//璇誨彇鐨勫瓧鑺傛暟
BOOL bReadStat;
bReadStat=ReadFile(hCom,str,100,&wCount,NULL);
if(!bReadStat)
{
AfxMessageBox("璇諱覆鍙eけ璐?");
return FALSE;
}
return TRUE;
//鍚屾鍐欎覆鍙?
char lpOutBuffer[100];
DWORD dwBytesWrite=100;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);
if(!bWriteStat)
{
AfxMessageBox("鍐欎覆鍙eけ璐?");
}
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
鍦ㄩ噸鍙犳搷浣滄椂,鎿嶄綔榪樻湭瀹屾垚鍑芥暟灝辮繑鍥炪?

銆銆閲嶅彔I/O闈炲父鐏墊椿錛屽畠涔熷彲浠ュ疄鐜伴樆濉烇紙渚嬪鎴戜滑鍙互璁劇疆涓瀹氳璇誨彇鍒頒竴涓暟鎹墠鑳借繘琛屽埌涓嬩竴姝ユ搷浣滐級銆傛湁涓ょ鏂規(guī)硶鍙互絳夊緟鎿嶄綔瀹屾垚錛氫竴縐嶆柟娉曟槸鐢ㄨ薄WaitForSingleObject榪欐牱鐨勭瓑寰呭嚱鏁版潵絳夊緟OVERLAPPED緇撴瀯鐨刪Event鎴愬憳錛涘彟涓縐嶆柟娉曟槸璋冪敤GetOverlappedResult鍑芥暟絳夊緟錛屽悗闈㈠皢婕旂ず璇存槑銆?br>涓嬮潰鎴戜滑鍏堢畝鍗曡涓涓婳VERLAPPED緇撴瀯鍜孏etOverlappedResult鍑芥暟錛?br>OVERLAPPED緇撴瀯
OVERLAPPED緇撴瀯鍖呭惈浜嗛噸鍙營/O鐨勪竴浜涗俊鎭紝瀹氫箟濡備笅錛?
typedef struct _OVERLAPPED { // o
DWORD  Internal;
DWORD  InternalHigh;
DWORD  Offset;
DWORD  OffsetHigh;
HANDLE hEvent;
} OVERLAPPED;
銆銆鍦ㄤ嬌鐢≧eadFile鍜學riteFile閲嶅彔鎿嶄綔鏃訛紝綰跨▼闇瑕佸垱寤篛VERLAPPED緇撴瀯浠ヤ緵榪欎袱涓嚱鏁頒嬌鐢ㄣ傜嚎紼嬮氳繃OVERLAPPED緇撴瀯鑾峰緱褰撳墠鐨勬搷浣滅姸鎬侊紝璇ョ粨鏋勬渶閲嶈鐨勬垚鍛樻槸hEvent銆俬Event鏄鍐欎簨浠躲傚綋涓插彛浣跨敤寮傛閫氳鏃訛紝鍑芥暟榪斿洖鏃舵搷浣滃彲鑳借繕娌℃湁瀹屾垚錛岀▼搴忓彲浠ラ氳繃媯鏌ヨ浜嬩歡寰楃煡鏄惁璇誨啓瀹屾瘯銆?br>銆銆褰撹皟鐢≧eadFile, WriteFile 鍑芥暟鐨勬椂鍊欙紝璇ユ垚鍛樹細鑷姩琚疆涓烘棤淇″彿鐘舵侊紱褰撻噸鍙犳搷浣滃畬鎴愬悗錛岃鎴愬憳鍙橀噺浼氳嚜鍔ㄨ緗負鏈変俊鍙風姸鎬併?
GetOverlappedResult鍑芥暟
BOOL GetOverlappedResult(
HANDLE hFile,	// 涓插彛鐨勫彞鏌?
// 鎸囧悜閲嶅彔鎿嶄綔寮濮嬫椂鎸囧畾鐨凮VERLAPPED緇撴瀯
LPOVERLAPPED lpOverlapped,
// 鎸囧悜涓涓?2浣嶅彉閲忥紝璇ュ彉閲忕殑鍊艱繑鍥炲疄闄呰鍐欐搷浣滀紶杈撶殑瀛楄妭鏁般?
LPDWORD lpNumberOfBytesTransferred,
// 璇ュ弬鏁扮敤浜庢寚瀹氬嚱鏁版槸鍚︿竴鐩寸瓑鍒伴噸鍙犳搷浣滅粨鏉熴?
// 濡傛灉璇ュ弬鏁頒負TRUE錛屽嚱鏁扮洿鍒版搷浣滅粨鏉熸墠榪斿洖銆?
// 濡傛灉璇ュ弬鏁頒負FALSE錛屽嚱鏁扮洿鎺ヨ繑鍥烇紝榪欐椂濡傛灉鎿嶄綔娌℃湁瀹屾垚錛?
// 閫氳繃璋冪敤GetLastError()鍑芥暟浼氳繑鍥濫RROR_IO_INCOMPLETE銆?
BOOL bWait
);
璇ュ嚱鏁拌繑鍥為噸鍙犳搷浣滅殑緇撴灉錛岀敤鏉ュ垽鏂紓姝ユ搷浣滄槸鍚﹀畬鎴愶紝瀹冩槸閫氳繃鍒ゆ柇OVERLAPPED緇撴瀯涓殑hEvent鏄惁琚疆浣嶆潵瀹炵幇鐨勩?br>
寮傛璇諱覆鍙g殑紺轟緥浠g爜錛?
char lpInBuffer[1024];
DWORD dwBytesRead=1024;
COMSTAT ComStat;
DWORD dwErrorFlags;
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ClearCommError(hCom,&dwErrorFlags,&ComStat);
dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue);
if(!dwBytesRead)
return FALSE;
BOOL bReadStatus;
bReadStatus=ReadFile(hCom,lpInBuffer,
dwBytesRead,&dwBytesRead,&m_osRead);
if(!bReadStatus) //濡傛灉ReadFile鍑芥暟榪斿洖FALSE
{
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()鍑芥暟榪斿洖ERROR_IO_PENDING,琛ㄦ槑涓插彛姝e湪榪涜璇繪搷浣?
{
WaitForSingleObject(m_osRead.hEvent,2000);
//浣跨敤WaitForSingleObject鍑芥暟絳夊緟錛岀洿鍒拌鎿嶄綔瀹屾垚鎴栧歡鏃跺凡杈懼埌2縐掗挓
//褰撲覆鍙h鎿嶄綔榪涜瀹屾瘯鍚庯紝m_osRead鐨刪Event浜嬩歡浼氬彉涓烘湁淇″彿
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return dwBytesRead;
}
return 0;
}
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return dwBytesRead;
銆銆瀵逛互涓婁唬鐮佸啀浣滅畝瑕佽鏄庯細鍦ㄤ嬌鐢≧eadFile 鍑芥暟榪涜璇繪搷浣滃墠錛屽簲鍏堜嬌鐢–learCommError鍑芥暟娓呴櫎閿欒銆侰learCommError鍑芥暟鐨勫師鍨嬪涓嬶細
BOOL ClearCommError(
HANDLE hFile,	// 涓插彛鍙ユ焺
LPDWORD lpErrors,	// 鎸囧悜鎺ユ敹閿欒鐮佺殑鍙橀噺
LPCOMSTAT lpStat	// 鎸囧悜閫氳鐘舵佺紦鍐插尯
);
璇ュ嚱鏁拌幏寰楅氫俊閿欒騫舵姤鍛婁覆鍙g殑褰撳墠鐘舵侊紝鍚屾椂錛岃鍑芥暟娓呴櫎涓插彛鐨勯敊璇爣蹇椾互渚跨戶緇緭鍏ャ佽緭鍑烘搷浣溿?br>鍙傛暟l(fā)pStat鎸囧悜涓涓狢OMSTAT緇撴瀯錛岃緇撴瀯榪斿洖涓插彛鐘舵佷俊鎭?COMSTAT緇撴瀯 COMSTAT緇撴瀯鍖呭惈涓插彛鐨勪俊鎭紝緇撴瀯瀹氫箟濡備笅錛?
typedef struct _COMSTAT { // cst
DWORD fCtsHold : 1;   // Tx waiting for CTS signal
DWORD fDsrHold : 1;   // Tx waiting for DSR signal
DWORD fRlsdHold : 1;  // Tx waiting for RLSD signal
DWORD fXoffHold : 1;  // Tx waiting, XOFF char rec''d
DWORD fXoffSent : 1;  // Tx waiting, XOFF char sent
DWORD fEof : 1;       // EOF character sent
DWORD fTxim : 1;      // character waiting for Tx
DWORD fReserved : 25; // reserved
DWORD cbInQue;        // bytes in input buffer
DWORD cbOutQue;       // bytes in output buffer
} COMSTAT, *LPCOMSTAT;
鏈枃鍙敤鍒頒簡cbInQue鎴愬憳鍙橀噺錛岃鎴愬憳鍙橀噺鐨勫間唬琛ㄨ緭鍏ョ紦鍐插尯鐨勫瓧鑺傛暟銆?br>
銆銆鏈鍚庣敤PurgeComm鍑芥暟娓呯┖涓插彛鐨勮緭鍏ヨ緭鍑虹紦鍐插尯銆?

銆銆榪欐浠g爜鐢╓aitForSingleObject鍑芥暟鏉ョ瓑寰匫VERLAPPED緇撴瀯鐨刪Event鎴愬憳錛屼笅闈㈡垜浠啀婕旂ず涓孌佃皟鐢℅etOverlappedResult鍑芥暟絳夊緟鐨勫紓姝ヨ涓插彛紺轟緥浠g爜錛?

char lpInBuffer[1024];
DWORD dwBytesRead=1024;
BOOL bReadStatus;
DWORD dwErrorFlags;
COMSTAT ComStat;
OVERLAPPED m_osRead;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
if(!ComStat.cbInQue)
return 0;
dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue);
bReadStatus=ReadFile(hCom, lpInBuffer,dwBytesRead,
&dwBytesRead,&m_osRead);
if(!bReadStatus) //濡傛灉ReadFile鍑芥暟榪斿洖FALSE
{
if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(hCom,
&m_osRead,&dwBytesRead,TRUE);
// GetOverlappedResult鍑芥暟鐨勬渶鍚庝竴涓弬鏁拌涓篢RUE錛?
//鍑芥暟浼氫竴鐩寸瓑寰咃紝鐩村埌璇繪搷浣滃畬鎴愭垨鐢變簬閿欒鑰岃繑鍥炪?
return dwBytesRead;
}
return 0;
}
return dwBytesRead;
寮傛鍐欎覆鍙g殑紺轟緥浠g爜錛?
char buffer[1024];
DWORD dwBytesWritten=1024;
DWORD dwErrorFlags;
COMSTAT ComStat;
OVERLAPPED m_osWrite;
BOOL bWriteStat;
bWriteStat=WriteFile(hCom,buffer,dwBytesWritten,
&dwBytesWritten,&m_OsWrite);
if(!bWriteStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent,1000);
return dwBytesWritten;
}
return 0;
}
return dwBytesWritten;
錛?錛夈?a name=鍏抽棴涓插彛>鍏抽棴涓插彛

銆銆鍒╃敤API鍑芥暟鍏抽棴涓插彛闈炲父綆鍗曪紝鍙渶浣跨敤CreateFile鍑芥暟榪斿洖鐨勫彞鏌勪綔涓哄弬鏁拌皟鐢–loseHandle鍗沖彲錛?

BOOL CloseHandle(
HANDLE hObject; //handle to object to close
);
涓插彛緙栫▼鐨勪竴涓疄渚?

銆銆涓轟簡璁╂?zhèn)ㄦ洿濂藉湴鐞嗚В涓插彛缂柦E?涓嬮潰鎴戜滑鍒嗗埆緙栧啓涓や釜渚嬬▼錛堣闄勫甫鐨勬簮鐮侀儴鍒嗭級,榪欎袱涓緥紼嬮兘瀹炵幇浜嗗伐鎺ф満涓庣櫨鐗規(guī)樉紺轟華琛ㄩ氳繃RS485鎺ュ彛榪涜鐨勪覆鍙i氫俊銆傚叾涓涓涓緥紼嬮噰鐢ㄥ悓姝ヤ覆鍙f搷浣?絎簩涓緥紼嬮噰鐢ㄥ紓姝ヤ覆鍙f搷浣溿?br>銆銆鎴戜滑鍙粙緇嶈蔣浠墮儴鍒嗭紝RS485鎺ュ彛鎺ョ嚎鏂規(guī)硶涓嶄綔浠嬬粛錛屾劅鍏磋叮鐨勮鑰呭彲浠ユ煡闃呯浉鍏寵祫鏂欍?/p>

渚嬬▼1

銆銆鎵撳紑VC++6.0錛屾柊寤哄熀浜庡璇濇鐨勫伐紼婻S485Comm錛屽湪涓誨璇濇紿楀彛IDD_RS485COMM_DIALOG涓婃坊鍔犱袱涓寜閽紝ID鍒嗗埆涓篒DC_SEND鍜孖DC_RECEIVE錛屾爣棰樺垎鍒負“鍙戦?#8221;鍜?#8220;鎺ユ敹”錛涙坊鍔犱竴涓潤鎬佹枃鏈IDC_DISP錛岀敤浜庢樉紺轟覆鍙f帴鏀跺埌鐨勫唴瀹廣?br>
鍦≧S485CommDlg.cpp鏂囦歡涓坊鍔犲叏灞鍙橀噺錛?

HANDLE hCom;  //鍏ㄥ眬鍙橀噺錛屼覆鍙e彞鏌?
鍦≧S485CommDlg.cpp鏂囦歡涓殑OnInitDialog()鍑芥暟娣誨姞濡備笅浠g爜錛?
	// TODO: Add extra initialization here
hCom=CreateFile("COM1",//COM1鍙?
GENERIC_READ|GENERIC_WRITE, //鍏佽璇誨拰鍐?
0, //鐙崰鏂瑰紡
NULL,
OPEN_EXISTING, //鎵撳紑鑰屼笉鏄垱寤?
0, //鍚屾鏂瑰紡
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("鎵撳紑COM澶辮觸!");
return FALSE;
}
SetupComm(hCom,100,100); //杈撳叆緙撳啿鍖哄拰杈撳嚭緙撳啿鍖虹殑澶у皬閮芥槸1024
COMMTIMEOUTS TimeOuts;
//璁懼畾璇昏秴鏃?
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//鍦ㄨ涓嬈¤緭鍏ョ紦鍐插尯鐨勫唴瀹瑰悗璇繪搷浣滃氨绔嬪嵆榪斿洖錛?
//鑰屼笉綆℃槸鍚﹁鍏ヤ簡瑕佹眰鐨勫瓧絎︺?
//璁懼畾鍐欒秴鏃?
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //璁劇疆瓚呮椂
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //娉㈢壒鐜囦負9600
dcb.ByteSize=8; //姣忎釜瀛楄妭鏈?浣?
dcb.Parity=NOPARITY; //鏃犲鍋舵牎楠屼綅
dcb.StopBits=TWOSTOPBITS; //涓や釜鍋滄浣?
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
鍒嗗埆鍙屽嚮IDC_SEND鎸夐挳鍜孖DC_RECEIVE鎸夐挳錛屾坊鍔犱袱涓寜閽殑鍝嶅簲鍑芥暟錛?
void CRS485CommDlg::OnSend()
{
// TODO: Add your control notification handler code here
// 鍦ㄦ闇瑕佺畝鍗曚粙緇嶇櫨鐗瑰叕鍙竂MA5000鐨勯氳鍗忚錛?
//璇ヤ華琛≧S485閫氳閲囩敤涓繪満騫挎挱鏂瑰紡閫氳銆?
//涓茶鍗婂弻宸ワ紝甯?1浣嶏紝1涓搗濮嬩綅(0)錛?涓暟鎹綅錛?涓仠姝綅(1)
//濡傦細璇諱華琛ㄦ樉紺虹殑鐬椂鍊鹼紝涓繪満鍙戦侊細DC1 AAA BB ETX
//鍏朵腑錛欴C1鏄爣鍑咥SCII鐮佺殑涓涓帶鍒剁鍙鳳紝鐮佸間負11H(鍗佽繘鍒剁殑17)
//鍦╔MA5000鐨勯氳鍗忚涓紝DC1琛ㄧず璇葷灛鏃跺?
//AAA鏄粠鏈哄湴鍧鐮侊紝涔熷氨鏄疿MA5000鏄劇ず浠〃鐨勯氳鍦板潃
//BB涓洪氶亾鍙鳳紝璇葷灛鏃跺兼椂璇ュ間負01
//ETX涔熸槸鏍囧噯ASCII鐮佺殑涓涓帶鍒剁鍙鳳紝鐮佸間負03H
//鍦╔MA5000鐨勯氳鍗忚涓紝ETX琛ㄧず涓繪満緇撴潫絎?
char lpOutBuffer[7];
memset(lpOutBuffer,''\0'',7); //鍓?涓瓧鑺傚厛娓呴浂
lpOutBuffer[0]=''\x11'';  //鍙戦佺紦鍐插尯鐨勭1涓瓧鑺備負DC1
lpOutBuffer[1]=''0'';  //絎?涓瓧鑺備負瀛楃0(30H)
lpOutBuffer[2]=''0''; //絎?涓瓧鑺備負瀛楃0(30H)
lpOutBuffer[3]=''1''; // 絎?涓瓧鑺備負瀛楃1(31H)
lpOutBuffer[4]=''0''; //絎?涓瓧鑺備負瀛楃0(30H)
lpOutBuffer[5]=''1''; //絎?涓瓧鑺備負瀛楃1(31H)
lpOutBuffer[6]=''\x03''; //絎?涓瓧鑺備負瀛楃ETX
//浠庤孌典唬鐮佸彲浠ョ湅鍑猴紝浠〃鐨勯氳鍦板潃涓?01
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,dwBytesWrite,& dwBytesWrite,NULL);
if(!bWriteStat)
{
AfxMessageBox("鍐欎覆鍙eけ璐?");
}
}
void CRS485CommDlg::OnReceive()
{
// TODO: Add your control notification handler code here
char str[100];
memset(str,''\0'',100);
DWORD wCount=100;//璇誨彇鐨勫瓧鑺傛暟
BOOL bReadStat;
bReadStat=ReadFile(hCom,str,wCount,&wCount,NULL);
if(!bReadStat)
AfxMessageBox("璇諱覆鍙eけ璐?");
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
m_disp=str;
UpdateData(FALSE);
}
鎮(zhèn)ㄥ彲浠ヨ瀵熻繑鍥炵殑瀛楃涓詫紝鍏朵腑鏈夊拰浠〃鏄劇ず鍊肩浉鍚岀殑閮ㄥ垎錛屾?zhèn)ㄥ彲浠q涜鐩稿簲鐨勫瓧絎︿覆鎿嶄綔鍙栧嚭浠〃鐨勬樉紺哄箋?br>鎵撳紑ClassWizard,涓洪潤鎬佹枃鏈IDC_DISP娣誨姞CString綾誨瀷鍙橀噺m_disp錛屽悓鏃舵坊鍔燱M_CLOSE鐨勭浉搴斿嚱鏁幫細
void CRS485CommDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
CloseHandle(hCom);	//紼嬪簭閫鍑烘椂鍏抽棴涓插彛
CDialog::OnClose();
}
紼嬪簭鐨勭浉搴旈儴鍒嗗凡緇忓湪浠g爜鍐呴儴浣滀簡璇︾粏浠嬬粛銆傝繛鎺ュソ紜歡閮ㄥ垎錛岀紪璇戣繍琛岀▼搴忥紝緇嗗績浣撲細涓插彛鍚屾鎿嶄綔閮ㄥ垎銆?

渚嬬▼2

銆銆鎵撳紑VC++6.0錛屾柊寤哄熀浜庡璇濇鐨勫伐紼婻S485Comm錛屽湪涓誨璇濇紿楀彛IDD_RS485COMM_DIALOG涓婃坊鍔犱袱涓寜閽紝ID鍒嗗埆涓篒DC_SEND鍜孖DC_RECEIVE錛屾爣棰樺垎鍒負“鍙戦?#8221;鍜?#8220;鎺ユ敹”錛涙坊鍔犱竴涓潤鎬佹枃鏈IDC_DISP錛岀敤浜庢樉紺轟覆鍙f帴鏀跺埌鐨勫唴瀹廣傚湪RS485CommDlg.cpp鏂囦歡涓坊鍔犲叏灞鍙橀噺錛?

HANDLE hCom; //鍏ㄥ眬鍙橀噺錛?/pre>

涓插彛鍙ユ焺鍦≧S485CommDlg.cpp鏂囦歡涓殑OnInitDialog()鍑芥暟娣誨姞濡備笅浠g爜錛?

	hCom=CreateFile("COM1",//COM1鍙?
GENERIC_READ|GENERIC_WRITE, //鍏佽璇誨拰鍐?
0, //鐙崰鏂瑰紡
NULL,
OPEN_EXISTING, //鎵撳紑鑰屼笉鏄垱寤?
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //閲嶅彔鏂瑰紡
NULL);
if(hCom==(HANDLE)-1)
{
AfxMessageBox("鎵撳紑COM澶辮觸!");
return FALSE;
}
SetupComm(hCom,100,100); //杈撳叆緙撳啿鍖哄拰杈撳嚭緙撳啿鍖虹殑澶у皬閮芥槸100
COMMTIMEOUTS TimeOuts;
//璁懼畾璇昏秴鏃?
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//鍦ㄨ涓嬈¤緭鍏ョ紦鍐插尯鐨勫唴瀹瑰悗璇繪搷浣滃氨绔嬪嵆榪斿洖錛?
//鑰屼笉綆℃槸鍚﹁鍏ヤ簡瑕佹眰鐨勫瓧絎︺?
//璁懼畾鍐欒秴鏃?
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //璁劇疆瓚呮椂
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=9600; //娉㈢壒鐜囦負9600
dcb.ByteSize=8; //姣忎釜瀛楄妭鏈?浣?
dcb.Parity=NOPARITY; //鏃犲鍋舵牎楠屼綅
dcb.StopBits=TWOSTOPBITS; //涓や釜鍋滄浣?
SetCommState(hCom,&dcb);
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
鍒嗗埆鍙屽嚮IDC_SEND鎸夐挳鍜孖DC_RECEIVE鎸夐挳錛屾坊鍔犱袱涓寜閽殑鍝嶅簲鍑芥暟錛?
void CRS485CommDlg::OnSend()
{
// TODO: Add your control notification handler code here
OVERLAPPED m_osWrite;
memset(&m_osWrite,0,sizeof(OVERLAPPED));
m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
char lpOutBuffer[7];
memset(lpOutBuffer,''\0'',7);
lpOutBuffer[0]=''\x11'';
lpOutBuffer[1]=''0'';
lpOutBuffer[2]=''0'';
lpOutBuffer[3]=''1'';
lpOutBuffer[4]=''0'';
lpOutBuffer[5]=''1'';
lpOutBuffer[6]=''\x03'';
DWORD dwBytesWrite=7;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,lpOutBuffer,
dwBytesWrite,& dwBytesWrite,&m_osWrite);
if(!bWriteStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent,1000);
}
}
}
void CRS485CommDlg::OnReceive()
{
// TODO: Add your control notification handler code here
OVERLAPPED m_osRead;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
COMSTAT ComStat;
DWORD dwErrorFlags;
char str[100];
memset(str,''\0'',100);
DWORD dwBytesRead=100;//璇誨彇鐨勫瓧鑺傛暟
BOOL bReadStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
dwBytesRead=min(dwBytesRead, (DWORD)ComStat.cbInQue);
bReadStat=ReadFile(hCom,str,
dwBytesRead,&dwBytesRead,&m_osRead);
if(!bReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
//GetLastError()鍑芥暟榪斿洖ERROR_IO_PENDING,琛ㄦ槑涓插彛姝e湪榪涜璇繪搷浣?
{
WaitForSingleObject(m_osRead.hEvent,2000);
//浣跨敤WaitForSingleObject鍑芥暟絳夊緟錛岀洿鍒拌鎿嶄綔瀹屾垚鎴栧歡鏃跺凡杈懼埌2縐掗挓
//褰撲覆鍙h鎿嶄綔榪涜瀹屾瘯鍚庯紝m_osRead鐨刪Event浜嬩歡浼氬彉涓烘湁淇″彿
}
}
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
m_disp=str;
UpdateData(FALSE);
}
鎵撳紑ClassWizard,涓洪潤鎬佹枃鏈IDC_DISP娣誨姞CString綾誨瀷鍙橀噺m_disp錛屽悓鏃舵坊鍔燱M_CLOSE鐨勭浉搴斿嚱鏁幫細
void CRS485CommDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
CloseHandle(hCom);	//紼嬪簭閫鍑烘椂鍏抽棴涓插彛
CDialog::OnClose();
}


jay 2007-07-15 15:23 鍙戣〃璇勮
]]>娣卞叆嫻呭嚭VC++涓插彛緙栫▼涔嬪熀浜嶹in32 APIhttp://m.shnenglu.com/yishanhante/articles/27881.htmljayjayWed, 11 Jul 2007 14:27:00 GMThttp://m.shnenglu.com/yishanhante/articles/27881.htmlhttp://m.shnenglu.com/yishanhante/comments/27881.htmlhttp://m.shnenglu.com/yishanhante/articles/27881.html#Feedback0http://m.shnenglu.com/yishanhante/comments/commentRss/27881.htmlhttp://m.shnenglu.com/yishanhante/services/trackbacks/27881.html
銆銆鍦╓IN32 API涓紝涓插彛浣跨敤鏂囦歡鏂瑰紡榪涜璁塊棶錛屽叾鎿嶄綔鐨凙PI鍩烘湰涓婁笌鏂囦歡鎿嶄綔鐨凙PI涓鑷淬?br>
銆銆鎵撳紑涓插彛

銆銆Win32 涓敤浜庢墦寮涓插彛鐨凙PI 鍑芥暟涓篊reateFile錛屽叾鍘熷瀷涓猴細

HANDLE CreateFile (
銆LPCTSTR lpFileName, //灝嗚鎵撳紑鐨勪覆鍙i昏緫鍚嶏紝濡侰OM1 鎴朇OM2
銆DWORD dwAccess, //鎸囧畾涓插彛璁塊棶鐨勭被鍨嬶紝鍙互鏄鍙栥佸啓鍏ユ垨涓よ呭茍鍒?br>銆DWORD dwShareMode, //鎸囧畾鍏變韓灞炴э紝鐢變簬涓插彛涓嶈兘鍏變韓,璇ュ弬鏁板繀欏葷疆涓?
銆LPSECURITY_ATTRIBUTES lpsa, //寮曠敤瀹夊叏鎬у睘鎬х粨鏋勶紝緙虹渷鍊間負NULL
銆DWORD dwCreate, //鍒涘緩鏍囧織錛屽涓插彛鎿嶄綔璇ュ弬鏁板繀欏葷疆涓篛PEN EXISTING
銆DWORD dwAttrsAndFlags, //灞炴ф弿榪幫紝鐢ㄤ簬鎸囧畾璇ヤ覆鍙f槸鍚﹀彲榪涜寮傛鎿嶄綔錛?br>銆//FILE_FLAG_OVERLAPPED錛氬彲浣跨敤寮傛鐨処/O
銆HANDLE hTemplateFile //鎸囧悜妯℃澘鏂囦歡鐨勫彞鏌勶紝瀵逛覆鍙h岃█璇ュ弬鏁板繀欏葷疆涓篘ULL
);

銆銆渚嬪錛屼互涓嬬▼搴忕敤浜庝互鍚屾璇誨啓鏂瑰紡鎵撳紑涓插彛COM1錛?br>
HANDLE hCom;
DWORD dwError;
hCon = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hCom == (HANDLE)0xFFFFFFFF)
{
銆dwError = GetLastError();
銆MessageBox(dwError);
}

銆銆瀵逛簬dwAttrsAndFlags鍙傛暟鍙奆ILE_FLAG_OVERLAPPED鏍囧織鐨勭敱鏉ワ紝鍙В閲婂涓嬶細Windows鏂囦歡鎿嶄綔鍒嗕負鍚屾I/O鍜岄噸鍙營/O(Overlapped I/ O)涓ょ鏂瑰紡錛屽湪鍚屾I/O鏂瑰紡涓紝API浼氶樆濉炵洿鍒版搷浣滃畬鎴愪互鍚庢墠鑳借繑鍥烇紙鍦ㄥ綰跨▼鏂瑰紡涓紝铏界劧涓嶄細闃誨涓葷嚎紼嬶紝浣嗘槸浠嶇劧浼氶樆濉炵洃鍚嚎紼嬶級錛涜屽湪閲嶅彔I/O鏂瑰紡涓紝API浼氱珛鍗寵繑鍥烇紝鎿嶄綔鍦ㄥ悗鍙拌繘琛岋紝閬垮厤綰跨▼鐨勯樆濉炪傞噸鍙營/O闈炲父鐏墊椿錛屽畠涔熷彲浠ュ疄鐜伴樆濉烇紙渚嬪鎴戜滑鍙互璁劇疆涓瀹氳璇誨彇鍒頒竴涓暟鎹墠鑳借繘琛屽埌涓嬩竴姝ユ搷浣?銆傚鏋滆繘琛孖/O鎿嶄綔鐨凙PI 鍦ㄦ病鏈夊畬鎴愭搷浣滅殑鎯呭喌涓嬭繑鍥烇紝鎴戜滑鍙互閫氳繃璋冪敤GetOverLappedResult()鍑芥暟闃誨鍒癐/O鎿嶄綔瀹屾垚鍚庤繑鍥炪?br>
銆銆閰嶇疆涓插彛

銆銆閰嶇疆涓插彛鏄氳繃鏀瑰彉璁懼鎺у埗鍧桪CB(Device Control Block) 鐨勬垚鍛樺彉閲忓兼潵瀹炵幇鐨勶紝鎺ユ敹緙撳啿鍖哄拰鍙戦佺紦鍐插尯鐨勫ぇ灝忓彲閫氳繃SetupComm鍑芥暟鏉ヨ緗?br>
銆銆DCB緇撴瀯浣撳畾涔変負錛?br>
typedef struct _DCB { // dcb
銆DWORD DCBlength; // sizeof(DCB)
銆DWORD BaudRate; // current baud rate
銆DWORD fBinary: 1; // binary mode, no EOF check
銆DWORD fParity: 1; // enable parity checking
銆DWORD fOutxCtsFlow:1; // CTS output flow control
銆DWORD fOutxDsrFlow:1; // DSR output flow control
銆DWORD fDtrControl:2; // DTR flow control type
銆DWORD fDsrSensitivity:1; // DSR sensitivity
銆DWORD fTXContinueOnXoff:1; // XOFF continues Tx
銆DWORD fOutX: 1; // XON/XOFF out flow control
銆DWORD fInX: 1; // XON/XOFF in flow control
銆DWORD fErrorChar: 1; // enable error replacement
銆DWORD fNull: 1; // enable null stripping
銆DWORD fRtsControl:2; // RTS flow control
銆DWORD fAbortOnError:1; // abort reads/writes on error
銆DWORD fDummy2:17; // reserved
銆WORD wReserved; // not currently used
銆WORD XonLim; // transmit XON threshold
銆WORD XoffLim; // transmit XOFF threshold
銆BYTE ByteSize; // number of bits/byte, 4-8
銆BYTE Parity; // 0-4=no,odd,even,mark,space
銆BYTE StopBits; // 0,1,2 = 1, 1.5, 2
銆char XonChar; // Tx and Rx XON character
銆char XoffChar; // Tx and Rx XOFF character
銆char ErrorChar; // error replacement character
銆char EofChar; // end of input character
銆char EvtChar; // received event character
銆WORD wReserved1; // reserved; do not use
} DCB;
鑰孲etupComm鍑芥暟鐨勫師鍨嬪垯涓猴細
BOOL SetupComm(
銆HANDLE hFile, // handle to communications device
銆DWORD dwInQueue, // size of input buffer
銆DWORD dwOutQueue // size of output buffer
);

銆銆浠ヤ笅紼嬪簭灝嗕覆鍙h緗負錛氭嘗鐗圭巼涓?600錛屾暟鎹綅鏁頒負7浣嶏紝鍋滄浣嶄負2 浣嶏紝鍋舵牎楠岋紝鎺ユ敹緙撳啿鍖哄拰鍙戦佺紦鍐插尯澶у皬鍧囦負1024涓瓧鑺傦紝鏈鍚庣敤PurgeComm鍑芥暟緇堟鎵鏈夌殑鍚庡彴璇誨啓鎿嶄綔騫舵竻絀烘帴鏀剁紦鍐插尯鍜屽彂閫佺紦鍐插尯錛?/p>
DCB dcb;
dcb.BaudRate = 9600; //娉㈢壒鐜囦負9600
dcb.ByteSize = 7; //鏁版嵁浣嶆暟涓?浣?br>dcb.Parity = EVENPARITY; //鍋舵牎楠?br>dcb.StopBits = 2; //涓や釜鍋滄浣?br>dcb.fBinary = TRUE;
dcb.fParity = TRUE;
if (!SetCommState(hCom, &dcb))
{
銆MessageBox("涓插彛璁劇疆鍑洪敊!");
}
SetupComm(hCom, 1024, 1024);
PurgeComm(hCom, PURCE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);

銆銆瓚呮椂璁劇疆

銆銆瓚呮椂璁劇疆鏄氳繃鏀瑰彉COMMTIMEOUTS緇撴瀯浣撶殑鎴愬憳鍙橀噺鍊兼潵瀹炵幇鐨勶紝COMMTIMEOUTS鐨勫師鍨嬩負錛?br>
typedef struct _COMMTIMEOUTS
{
銆DWORD ReadIntervalTimeout; //瀹氫箟涓や釜瀛楃鍒拌揪鐨勬渶澶ф椂闂撮棿闅旓紝鍗曚綅錛氭縐?br>銆//褰撹鍙栧畬涓涓瓧絎﹀悗錛岃秴榪囦簡ReadIntervalTimeout錛屼粛鏈鍙栧埌涓嬩竴涓瓧絎︼紝灝變細
銆//鍙戠敓瓚呮椂
銆DWORD ReadTotalTimeoutMultiplier;
銆DWORD ReadTotalTimeoutConstant;
銆//鍏朵腑鍚勬椂闂存墍婊¤凍鐨勫叧緋誨涓嬶細
銆//ReadTotalTimeout = ReadTotalTimeOutMultiplier* BytesToRead + ReadTotalTimeoutConstant
銆DWORD WriteTotalTimeoutMultiplier;
銆DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS, *LPCOMMTIMEOUTS;

銆銆璁劇疆瓚呮椂鐨勫嚱鏁頒負SetCommTimeouts錛屽叾鍘熷瀷涓帴鏀禖OMMTIMEOUTS鐨勬寚閽堜負鍙傛暟錛?br>
BOOL SetCommTimeouts(
銆HANDLE hFile, // handle to communications device
銆LPCOMMTIMEOUTS lpCommTimeouts // pointer to comm time-out structure
);

銆銆浠ヤ笅紼嬪簭灝嗕覆鍙h鎿嶄綔鐨勮秴鏃惰瀹氫負10 姣錛?br>
COMMTIMEOUTS to;
memset(&to, 0, sizeof(to));
to.ReadIntervalTimeout = 10;
SetCommTimeouts(hCom, &to);

銆銆涓嶴etCommTimeouts瀵瑰簲鐨凣etCommTimeouts()鍑芥暟鐨勫師鍨嬩負錛?br>
BOOL GetCommTimeouts(
銆HANDLE hFile, // handle of communications device
銆LPCOMMTIMEOUTS lpCommTimeouts // pointer to comm time-out structure
);

銆銆浜嬩歡璁劇疆

銆銆鍦ㄨ鍐欎覆鍙d箣鍓嶏紝闇瑕佺敤SetCommMask ()鍑芥暟璁劇疆浜嬩歡鎺╂ā鏉ョ洃瑙嗘寚瀹氶氫俊绔彛涓婄殑浜嬩歡錛屽叾鍘熷瀷涓猴細

BOOL SetCommMask(
銆HANDLE hFile, //鏍囪瘑閫氫俊绔彛鐨勫彞鏌?br>銆DWORD dwEvtMask //鑳藉浣胯兘鐨勯氫俊浜嬩歡
);

銆銆鏈変簡Set褰撶劧榪樹細鏈塆et錛屼笌SetCommMask瀵瑰簲鐨凣etCommMask()鍑芥暟鐨勫師鍨嬩負錛?br>
BOOL GetCommMask(
銆HANDLE hFile, //鏍囪瘑閫氫俊绔彛鐨勫彞鏌?br>銆LPDWORD lpEvtMask // address of variable to get event mask
);

銆銆涓插彛涓婂彲浠ュ彂鐢熺殑浜嬩歡鍙互鏄涓嬩簨浠跺垪琛ㄤ腑鐨勪竴涓垨浠繪剰緇勫悎錛欵V_BREAK銆丒V_CTS銆丒V_DSR銆丒V_ERR銆丒V_RING銆丒V_RLSD銆丒V_RXCHAR銆丒V_RXFLAG銆丒V_TXEMPTY銆?br>
銆銆鎴戜滑鍙互鐢╓aitCommEvent()鍑芥暟鏉ョ瓑寰呬覆鍙d笂鎴戜滑鍒╃敤SetCommMask ()鍑芥暟璁劇疆鐨勪簨浠訛細

BOOL WaitCommEvent(
銆HANDLE hFile, //鏍囪瘑閫氫俊绔彛鐨勫彞鏌?br>銆LPDWORD lpEvtMask, // address of variable for event that occurred
銆LPOVERLAPPED lpOverlapped, // address of overlapped structure
);

銆銆WaitCommEvent()鍑芥暟涓鐩撮樆濉烇紝鐩村埌涓插彛涓婂彂鐢熸垜浠敤鎵SetCommMask ()鍑芥暟璁劇疆鐨勯氫俊浜嬩歡涓烘銆備竴鑸岃█錛屽綋WaitCommEvent()榪斿洖鏃訛紝紼嬪簭鍛樺彲浠ョ敱鍒嗘瀽*lpEvtMask鑰岃幏寰楀彂鐢熶簨浠剁殑綾誨埆錛屽啀榪涜鐩稿簲鐨勫鐞嗐?br>
銆銆璇諱覆鍙?br>
銆銆瀵逛覆鍙h繘琛岃鍙栨墍鐢ㄧ殑鍑芥暟鍜屽鏂囦歡榪涜璇誨彇鎵鐢ㄧ殑鍑芥暟鐩稿悓錛岃鍑芥暟鍘熷瀷濡備笅錛?br>
BOOL ReadFile(
銆HANDLE hFile, // handle of file to read
銆LPVOID lpBuffer, // pointer to buffer that receives data
銆DWORD nNumberOfBytesToRead, // number of bytes to read
銆LPDWORD lpNumberOfBytesRead, // pointer to number of bytes read
銆LPOVERLAPPED lpOverlapped // pointer to structure for overlapped I/O
);

銆銆鍐欎覆鍙?br>
銆銆瀵逛覆鍙h繘琛屽啓鍏ユ墍鐢ㄧ殑鍑芥暟鍜屽鏂囦歡榪涜鍐欏叆鎵鐢ㄧ殑鍑芥暟鐩稿悓錛屽啓鍑芥暟鍘熷瀷濡備笅錛?br>
BOOL WriteFile(
銆HANDLE hFile, // handle to file to write to
銆LPCVOID lpBuffer, // pointer to data to write to file
銆DWORD nNumberOfBytesToWrite, // number of bytes to write
銆LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written
銆LPOVERLAPPED lpOverlapped // pointer to structure for overlapped I/O
);

銆銆鍏抽棴涓插彛

銆銆鍒╃敤API 鍑芥暟瀹炵幇涓插彛閫氫俊鏃跺叧闂覆鍙i潪甯哥畝鍗曪紝鍙渶浣跨敤CreateFile 鍑芥暟榪斿洖鐨勫彞鏌勪綔涓哄弬鏁拌皟鐢–loseHandle 鍗沖彲錛?br>
BOOL CloseHandle(
銆HANDLE hObject // handle to object to close
);

 

 

   2.渚嬬▼

銆銆鍦ㄧ瑪鑰呯殑銆婃繁鍏ユ祬鍑篧in32澶氱嚎紼嬬▼搴忚璁′箣緇煎悎瀹炰緥銆嬩腑鎴戜滑宸茬粡緇欏嚭涓涓埄鐢╓IN API榪涜涓插彛閫氫俊鐨勪緥瀛愶紝榪欓噷鍐嶇粰鍑轟竴涓被浼肩殑渚嬪瓙錛屼互榪涗竴姝ュ姞娣辯悊瑙c?br>
娣卞叆嫻呭嚭VC++涓插彛緙栫▼涔嬪熀浜嶹in32API(2)
 
鍒╃敤WIN API榪涜涓插彛閫氫俊

銆銆瀵硅瘽妗嗕笂鎺т歡瀵瑰簲鐨勮祫婧愭枃浠?.RC)涓殑鍐呭濡備笅錛?br>
BEGIN
銆EDITTEXT IDC_RECV_EDIT,28,119,256,46,ES_AUTOHSCROLL
銆GROUPBOX "鍙戦佹暟鎹?,IDC_STATIC,19,15,282,70
銆GROUPBOX "鎺ユ敹鏁版嵁",IDC_STATIC,19,100,282,80
銆EDITTEXT IDC_SEND_EDIT,29,33,214,39,ES_AUTOHSCROLL
銆PUSHBUTTON "娓呴櫎",IDC_CLEAR_BUTTON,248,33,50,14
銆PUSHBUTTON "鍙戦?,IDC_SEND_BUTTON,248,55,50,14
END

銆銆鑰屾暣涓璇濇鐨勬秷鎭槧灝勶紙鎻忚堪浜嗘秷鎭強鍏跺搴旂殑琛屼負錛夊涓嬶細

BEGIN_MESSAGE_MAP(CSerialPortAPIDlg, CDialog)
//{{AFX_MSG_MAP(CSerialPortAPIDlg)
銆ON_WM_SYSCOMMAND()
銆ON_WM_PAINT()
銆ON_WM_QUERYDRAGICON()
銆ON_BN_CLICKED(IDC_CLEAR_BUTTON, OnClearButton)
銆ON_BN_CLICKED(IDC_SEND_BUTTON, OnSendButton)
銆ON_MESSAGE(COM_RECVDATA, OnRecvData)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

銆銆鎴戜滑涓篒DC_SEND_EDIT鍜孖DC_RECV_EDIT緙栬緫妗嗘帶浠跺垎鍒坊鍔犱簡涓涓狢String鍙橀噺m_recv鍜宮_send錛屼笅闈㈢殑浠g爜鎻忚堪浜嗚繖涓琛屼負錛?br>
class CSerialPortAPIDlg : public CDialog
{
銆// Construction
銆public:
銆銆CSerialPortAPIDlg(CWnd* pParent = NULL); // standard constructor

銆銆// Dialog Data
銆銆//{{AFX_DATA(CSerialPortAPIDlg)
銆銆銆enum { IDD = IDD_SERIALPORTAPI_DIALOG };
銆銆銆CString m_recv; //IDC_RECV_EDIT鎺т歡瀵瑰簲鐨勫彉閲?br>銆銆銆CString m_send; //IDC_SEND_EDIT鎺т歡瀵瑰簲鐨勫彉閲?br>銆銆//}}AFX_DATA

銆銆// ClassWizard generated virtual function overrides
銆銆//{{AFX_VIRTUAL(CSerialPortAPIDlg)
銆protected:
銆銆virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
銆//}}AFX_VIRTUAL

銆// Implementation
銆protected:
銆銆BOOL OpenSerialPort1();
銆銆HICON m_hIcon;

銆銆// Generated message map functions
銆銆//{{AFX_MSG(CSerialPortAPIDlg)
銆銆銆virtual BOOL OnInitDialog();
銆銆銆afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
銆銆銆afx_msg void OnPaint();
銆銆銆afx_msg HCURSOR OnQueryDragIcon();
銆銆銆afx_msg void OnClearButton();
銆銆銆afx_msg void OnSendButton();
銆銆銆afx_msg void OnRecvData(WPARAM wParam, LPARAM lParam);
銆銆//}}AFX_MSG
銆銆DECLARE_MESSAGE_MAP()
};

CSerialPortAPIDlg::CSerialPortAPIDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSerialPortAPIDlg::IDD, pParent)
{
銆//{{AFX_DATA_INIT(CSerialPortAPIDlg)
銆銆//鍦ㄦ瀯閫犲嚱鏁頒腑鍒濆鍖栧彉閲?br>銆銆m_recv = _T(""); //鍦ㄦ瀯閫犲嚱鏁頒腑鍒濆鍖栧彉閲?br>銆銆m_send = _T("");
銆//}}AFX_DATA_INIT
銆// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
銆m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

//寤虹珛緙栬緫妗嗘帶浠跺拰鍙橀噺涔嬮棿鐨勬槧灝?br>void CSerialPortAPIDlg::DoDataExchange(CDataExchange* pDX)
{
銆CDialog::DoDataExchange(pDX);
銆//{{AFX_DATA_MAP(CSerialPortAPIDlg)
銆銆DDX_Text(pDX, IDC_RECV_EDIT, m_recv);
銆銆DDX_Text(pDX, IDC_SEND_EDIT, m_send);
銆//}}AFX_DATA_MAP
}

銆銆鍦ㄥ璇濇鐨凮nInitDialog()鍑芥暟涓紝鎴戜滑鍚姩紿楀彛鐩戝惉綰跨▼騫跺皢涓葷獥鍙e彞鏌勪紶閫掔粰綰跨▼鎺у埗鍑芥暟錛?/p>
BOOL CSerialPortAPIDlg::OnInitDialog()
{
銆CDialog::OnInitDialog();

銆// Add "About..." menu item to system menu.

銆// IDM_ABOUTBOX must be in the system command range.
銆ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
銆ASSERT(IDM_ABOUTBOX < 0xF000);

銆CMenu* pSysMenu = GetSystemMenu(FALSE);
銆if (pSysMenu != NULL)
銆{
銆銆CString strAboutMenu;
銆銆strAboutMenu.LoadString(IDS_ABOUTBOX);
銆銆if (!strAboutMenu.IsEmpty())
銆銆{
銆銆銆pSysMenu->AppendMenu(MF_SEPARATOR);
銆銆銆pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
銆銆}
銆}

銆// Set the icon for this dialog. The framework does this automatically
銆// when the application's main window is not a dialog
銆SetIcon(m_hIcon, TRUE); // Set big icon
銆SetIcon(m_hIcon, FALSE); // Set small icon

銆// TODO: Add extra initialization here
銆//鍚姩涓插彛鐩戣綰跨▼
銆DWORD threadID;
銆hCommThread = ::CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0,
銆銆銆銆銆(LPTHREAD_START_ROUTINE)SerialPort1ThreadProcess,
銆AfxGetMainWnd()->m_hWnd, 0, &threadID);
銆if (hCommThread == NULL)
銆{
銆銆::AfxMessageBox("鍒涘緩涓插彛1澶勭悊綰跨▼澶辮觸");
銆銆::PostQuitMessage(0);
銆}
銆return TRUE; // return TRUE unless you set the focus to a control
}

//"娓呴櫎"鎸夐挳鍑芥暟
void CSerialPortAPIDlg::OnClearButton()
{
銆// TODO: Add your control notification handler code here
銆m_send = "";
銆UpdateData(false);
}

//鍙戦佹暟鎹嚱鏁幫紙"鍙戦?鎸夐挳鍑芥暟錛?br>void CSerialPortAPIDlg::OnSendButton()
{
銆// TODO: Add your control notification handler code here
銆UpdateData(true);
銆DWORD wCount = 0;
銆WriteFile(hCom, m_send, m_send.GetLength(), &wCount, NULL);//鍙戦佹暟鎹?br>}

//鎺ユ敹鏁版嵁鍚庯紙閫氳繃鐩戝惉綰跨▼鍙戞潵鐨勭敤鎴瘋嚜瀹氫箟娑堟伅錛夋樉紺?br>void CSerialPortAPIDlg::OnRecvData(WPARAM wParam, LPARAM lParam)
{
銆CString recvStr((char *)wParam);
銆m_recv += recvStr;
銆UpdateData(false);
}


銆銆鍦ㄥ伐紼嬩腑娣誨姞SerialPortControl.h鍜孲erialPortControl.cpp涓や釜鏂囦歡錛屽墠鑰呭0鏄庝覆鍙f帶鍒剁殑鎺ュ彛鍑芥暟鍙婂閮ㄥ叏灞鍙橀噺錛屽悗鑰呭疄鐜頒覆鍙f帴鍙e嚱鏁板強涓插彛鐩戝惉綰跨▼鎺у埗鍑芥暟銆?br>
銆銆SerialPortControl.h鏂囦歡

#ifndef _SERIAL_PORT_CONTROL_H
#define _SERIAL_PORT_CONTROL_H

#define COM_RECVDATA WM_USER+1000//鑷畾涔夋秷鎭?br>
extern HANDLE hCom; //鍏ㄥ眬鍙橀噺錛屼覆鍙e彞鏌?br>extern HANDLE hCommThread; //鍏ㄥ眬鍙橀噺錛屼覆鍙g嚎紼?br>//涓插彛鐩戣綰跨▼鎺у埗鍑芥暟
extern DWORD WINAPI SerialPort1ThreadProcess(HWND hWnd);
//鎵撳紑騫惰緗甈C涓插彛1(COM1)
extern BOOL OpenSerialPort1();

#endif
SerialPortControl.cpp鏂囦歡
#include "StdAfx.h"
#include "SerialPortControl.h"

HANDLE hCom; //鍏ㄥ眬鍙橀噺錛屼覆鍙e彞鏌?br>HANDLE hCommThread; //鍏ㄥ眬鍙橀噺錛屼覆鍙g嚎紼?br>
BOOL OpenSerialPort1()
{
銆//鎵撳紑騫惰緗瓹OM1
銆hCom=CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0,NULL , OPEN_EXISTING, 0, NULL);
銆if (hCom==(HANDLE)-1)
銆{
銆銆AfxMessageBox("鎵撳紑COM1澶辮觸");
銆銆return false;
銆}
銆else
銆{
銆銆DCB wdcb;
銆銆GetCommState (hCom, &wdcb);
銆銆wdcb.BaudRate=9600;//娉㈢壒鐜囷細9600錛屽叾浠栵細涓嶅彉
銆銆SetCommState (hCom, &wdcb);
銆銆PurgeComm(hCom, PURGE_TXCLEAR);
銆}
銆return true;
}

//浠ヤ竴涓嚎紼嬩笉鍚岀洃鎺т覆鍙h鎺ユ敹鐨勬暟鎹?br>DWORD WINAPI SerialPort1ThreadProcess( HWND hWnd//涓葷獥鍙e彞鏌?
{
銆char str[101];
銆DWORD wCount; //璇誨彇鐨勫瓧鑺傛暟
銆while(1)
銆{
銆銆ReadFile(hCom,str, 100, &wCount, NULL);
銆銆if(wCount > 0) //鏀跺埌鏁版嵁
銆銆{
銆銆銆str[wCount] = '\0';
銆銆銆::PostMessage(hWnd, COM_RECVDATA, (unsigned int) str, wCount);
銆銆銆//鍙戦佹秷鎭粰瀵硅瘽妗嗕富紿楀彛錛屼互榪涜鎺ユ敹鍐呭鐨勬樉紺?br>銆銆}
銆}
銆return TRUE;
}


銆銆涓轟簡楠岃瘉紼嬪簭鐨勬紜э紝鎴戜滑浣跨敤涓插彛璋冭瘯鍔╂墜涓庢湰紼嬪簭鍗忓悓宸ヤ綔錛屼簰鐩歌繘琛屾敹鍙戙備笅闈㈢殑鎶撳浘鏄劇ず鏈▼搴忓伐浣滄紜紝鍙戦佸拰鎺ユ敹瀛楃鍑嗙‘鏃犺銆?br>

 

娣卞叆嫻呭嚭VC++涓插彛緙栫▼涔嬪熀浜嶹in32API(2)

鏄劇ず鏈▼搴忓伐浣滄紜紝鍙戦佸拰鎺ユ敹瀛楃鍑嗙‘鏃犺



jay 2007-07-11 22:27 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              久久久久久久999| 欧美高清hd18日本| 男男成人高潮片免费网站| 亚洲欧美日韩国产一区二区三区| 亚洲精品影院| 一本色道精品久久一区二区三区 | 国产精品爽爽ⅴa在线观看| 欧美精品亚洲二区| 欧美激情第一页xxx| 欧美日韩成人综合天天影院| 国产精品99一区| 国产婷婷色一区二区三区四区| 国产目拍亚洲精品99久久精品| 国产日韩精品一区二区浪潮av| 国产亚洲欧美一区二区三区| 狠狠色综合日日| 亚洲国产欧美一区二区三区同亚洲| 亚洲精选中文字幕| 亚洲一区综合| 免费国产自线拍一欧美视频| 亚洲国产成人精品女人久久久 | 99国产精品99久久久久久粉嫩| 一区二区三区 在线观看视| 亚洲自拍啪啪| 麻豆freexxxx性91精品| 一本一本大道香蕉久在线精品| 欧美一级久久久久久久大片| 欧美国产一区二区三区激情无套| 国产精品国产三级国产aⅴ入口| 国产曰批免费观看久久久| 亚洲精品免费在线| 久久成人18免费观看| 亚洲日本中文字幕| 性色av一区二区三区红粉影视| 免费成人网www| 国产日韩综合| 亚洲午夜av| 女同一区二区| 亚洲午夜三级在线| 欧美精品在线视频| 好吊色欧美一区二区三区视频| 亚洲午夜激情| 国产免费一区二区三区香蕉精| 久久综合给合久久狠狠色| 欧美亚洲第一页| 一区二区三区日韩精品视频| 欧美a级一区二区| 亚洲欧美日韩国产另类专区| 欧美精品精品一区| 亚洲黄页一区| 欧美成人精精品一区二区频| 午夜一区在线| 国产精品久久久久aaaa九色| 亚洲精品在线观看免费| 欧美成人中文字幕| 久久久久国产精品麻豆ai换脸| 欧美视频免费在线| 亚洲精品一区中文| 久久一区二区三区国产精品 | 久久久欧美精品sm网站| 国产人妖伪娘一区91| 欧美一区二区三区婷婷月色 | 一本色道**综合亚洲精品蜜桃冫| 欧美gay视频| 免费久久99精品国产| 亚洲国内精品在线| 欧美电影资源| 欧美激情一区二区三区不卡| 亚洲另类黄色| 亚洲日本欧美日韩高观看| 欧美伦理在线观看| 在线看日韩欧美| 榴莲视频成人在线观看| 久久婷婷国产综合国色天香| 在线观看欧美精品| 免费观看成人www动漫视频| 久久久久国产一区二区| 136国产福利精品导航网址应用| 韩国在线一区| 蜜臀va亚洲va欧美va天堂| 美女网站在线免费欧美精品| 亚洲国产合集| 一本一本久久a久久精品综合麻豆| 欧美日韩国产区| 亚洲欧美国产77777| 亚洲综合三区| 在线不卡中文字幕| 亚洲高清资源| 欧美性色综合| 欧美制服第一页| 久久嫩草精品久久久精品| 亚洲破处大片| 夜夜狂射影院欧美极品| 国产欧美精品一区二区色综合 | 久久精品人人爽| 欧美精品三级日韩久久| 亚洲欧美日韩在线一区| 亚洲制服少妇| 在线播放日韩专区| 亚洲国产高清高潮精品美女| 国产精品进线69影院| 久久精品一区中文字幕| 欧美福利一区二区三区| 久久精品视频在线看| 欧美成人tv| 欧美一级久久久久久久大片| 免费观看国产成人| 欧美在线一二三区| 欧美看片网站| 久久尤物电影视频在线观看| 国产精品h在线观看| 欧美高清视频一区| 国产亚洲一区二区精品| 日韩图片一区| 91久久精品久久国产性色也91| 亚洲一区二区三区在线| 夜夜嗨网站十八久久| 久久女同互慰一区二区三区| 亚洲欧美国产另类| 欧美日产在线观看| 欧美福利一区二区三区| 国产亚洲欧美一区二区三区| 日韩视频在线播放| 亚洲精品国产精品国自产观看浪潮 | 亚洲欧美日韩在线一区| 一本综合精品| 欧美高清不卡在线| 亚洲福利小视频| 影音先锋日韩精品| 欧美一区二区精品在线| 亚洲欧美色婷婷| 国产精品卡一卡二卡三| 日韩小视频在线观看| 亚洲精品国偷自产在线99热| 六月丁香综合| 亚洲大胆女人| 亚洲成色www8888| 久久青青草综合| 久久野战av| 精品99一区二区| 麻豆国产精品一区二区三区| 久久婷婷亚洲| 激情婷婷久久| 久久精品免费播放| 久久噜噜亚洲综合| 亚洲国产成人不卡| 欧美精品导航| 日韩一级欧洲| 亚洲午夜精品网| 国产精品亚洲精品| 久久成人人人人精品欧| 久久一区激情| 91久久中文字幕| 欧美日韩色综合| 亚洲欧美综合精品久久成人| 久久精品视频亚洲| 国产专区综合网| 久久人人97超碰人人澡爱香蕉| 欧美国产专区| 妖精成人www高清在线观看| 性欧美激情精品| 亚洲淫性视频| 亚洲夜间福利| 久久精品国产清高在天天线| 国产在线拍揄自揄视频不卡99| 久久久久久9999| 亚洲精品一级| 欧美一区二视频| 伊人精品成人久久综合软件| 欧美暴力喷水在线| 亚洲天天影视| 欧美不卡在线视频| 亚洲欧美在线网| 亚洲第一福利视频| 国产精品高潮粉嫩av| 性欧美精品高清| 亚洲精品综合| 久久乐国产精品| 99热在线精品观看| 国产日韩专区在线| 欧美日韩国产在线观看| 久久精品国产免费| 亚洲在线观看免费| 亚洲韩国精品一区| 欧美在线视频免费播放| 夜夜嗨av一区二区三区四季av | 欧美日韩一区二区在线播放| 欧美亚洲视频| 中文亚洲字幕| 蜜桃av噜噜一区| 羞羞答答国产精品www一本| 亚洲美女av电影| 黄色av成人| 国产精品视频999| 欧美精品激情在线观看| 久久免费视频网站| 久久成人18免费网站| 亚洲欧美在线免费观看| 99视频精品全部免费在线| 亚洲国内自拍|