[問題] C++ rs232通訊一定要先用VB開一遍才能用

看板C_and_CPP (C/C++)作者 (800IM)時間13年前 (2012/12/15 17:54), 編輯推噓2(208)
留言10則, 5人參與, 最新討論串1/1
我用C++寫rs232通訊程式控制 8051 + USB to TTL(以下簡稱外部電路) 但是很奇怪 例如 COM2 若外部電路通電後第一次啟動 C++程式,機器毫無反應,且 RxTx 上看不到任何字串出現, 但只要經過一個神奇步驟 → 用 VB6 開啟 COM2 再關閉 C++程式就可以順利地做rs232通訊 若外部電路有關閉過電源,神奇步驟又要再重複一次 做過很多次輸出字串的監控,都沒發現異狀,我猜可能是C++這邊的通訊初始化有問題 附上code請大家幫我看一下,謝謝 /****Com Port Set****/ int COM_Num; std::cout << "請輸入馬達控制COM Port號碼:"; std::cin >> COM_Num; if(COM_Num==0) return -1; std::string COM_PortNum; COM_PortNum = "\\\\.\\COM" + int2str(COM_Num) ; HANDLE hComm; DCB dcb; hComm = CreateFile( COM_PortNum.c_str(), //指向檔案名稱的指標 GENERIC_READ | GENERIC_WRITE, //存取模式 0, //分享模式:分享該COM Port與否 NULL,//回傳的HANDLE是否可以被子程序繼承 OPEN_EXISTING, //指定如何開啟檔案 1, //檔案屬性及相關旗標,0為同步傳輸 0); //根據規定設為0 (書上說的,不知道原因) GetCommState(hComm,&dcb); dcb.BaudRate = CBR_9600; dcb.ByteSize = 8; dcb.Parity =0; dcb.StopBits = ONESTOPBIT; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.122.165.222

12/15 19:40, , 1F
GetCommState(hComm,&dcb); 改Set 弄到最後一行
12/15 19:40, 1F
抱歉,這個做法沒用,而且我發現不需要 GetCommState(hComm,&dcb); 也能跑 ※ 編輯: deo2000 來自: 140.122.165.222 (12/15 22:07)

12/15 22:57, , 2F
不... 他是說把SetCommState(hComm,&dcb);加到最後吧...
12/15 22:57, 2F

12/15 22:59, , 3F
光改掉DCB的值不放回去的話是沒有意義的.
12/15 22:59, 3F

12/15 22:59, , 4F
Btw, DCB的狀態請另外備份一組, 在quit是set回去...
12/15 22:59, 4F

12/15 23:01, , 5F
還有就是... 失敗是因為沒設定handshake吧...
12/15 23:01, 5F
我在Get 到 Set 間加上 dcb.fDtrControl=DTR_CONTROL_HANDSHAKE; dcb.fRtsControl=RTS_CONTROL_HANDSHAKE; 還是沒用耶? ※ 編輯: deo2000 來自: 140.122.165.222 (12/15 23:12)

12/16 00:36, , 6F
COM_PortNum = "COM" + int2str(COM_Num) ;
12/16 00:36, 6F
照這樣做就可以了! 感謝 但是怎麼會有這麼多範例都用 "\\\\.\\COM" ? ※ 編輯: deo2000 來自: 140.122.165.222 (12/16 15:29)

12/16 20:45, , 7F
樓上那個應該指的是控制別台電腦的 port ??
12/16 20:45, 7F

12/16 20:46, , 8F
(樓上指的是原po後面的補充 : "\\\\.\\COM" )
12/16 20:46, 8F

12/16 21:53, , 9F
那個是要開大於com10
12/16 21:53, 9F

12/17 12:28, , 10F
很難說啦,很多都天下範例一大抄,也不知道來源是那 XD
12/17 12:28, 10F
文章代碼(AID): #1Gp4Zlcd (C_and_CPP)
文章代碼(AID): #1Gp4Zlcd (C_and_CPP)