看板 C_and_CPP 關於我們 聯絡資訊
我用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
gg1122:GetCommState(hComm,&dcb); 改Set 弄到最後一行 12/15 19:40
抱歉,這個做法沒用,而且我發現不需要 GetCommState(hComm,&dcb); 也能跑 ※ 編輯: deo2000 來自: 140.122.165.222 (12/15 22:07)
leicheong:不... 他是說把SetCommState(hComm,&dcb);加到最後吧... 12/15 22:57
leicheong:光改掉DCB的值不放回去的話是沒有意義的. 12/15 22:59
leicheong:Btw, DCB的狀態請另外備份一組, 在quit是set回去... 12/15 22:59
leicheong:還有就是... 失敗是因為沒設定handshake吧... 12/15 23:01
我在Get 到 Set 間加上 dcb.fDtrControl=DTR_CONTROL_HANDSHAKE; dcb.fRtsControl=RTS_CONTROL_HANDSHAKE; 還是沒用耶? ※ 編輯: deo2000 來自: 140.122.165.222 (12/15 23:12)
gg1122:COM_PortNum = "COM" + int2str(COM_Num) ; 12/16 00:36
照這樣做就可以了! 感謝 但是怎麼會有這麼多範例都用 "\\\\.\\COM" ? ※ 編輯: deo2000 來自: 140.122.165.222 (12/16 15:29)
EdisonX:樓上那個應該指的是控制別台電腦的 port ?? 12/16 20:45
EdisonX:(樓上指的是原po後面的補充 : "\\\\.\\COM" ) 12/16 20:46
clarkman:那個是要開大於com10 12/16 21:53
kikiqqp:很難說啦,很多都天下範例一大抄,也不知道來源是那 XD 12/17 12:28