[問題] VC++寫RS232通訊

看板C_and_CPP (C/C++)作者 (如沐春風進入語音)時間15年前 (2010/11/07 00:40), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串1/2 (看更多)
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 我用VC寫一個Dialog程式,希望藉由按下一個按鈕就可以由rs232接收訊號。 再測試過程中我以m_static_val.Format測試我的程式碼,假使沒有連上終 端機則會出現我設定的字串,如果有就不會出現,經過執行程式後,我的 對話盒沒有任何的反應,我現在不知道是沒有連上rs232還是有連上但讀取 的程式寫錯。煩請大大們指教 希望得到的正確結果: 能夠由終端機打字,我的對話盒接收字串 程式跑出來的錯誤結果: 沒有任何反應 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) VC++ 有問題的code: (請善用置底文標色功能) HANDLE hComm; hComm = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hComm == INVALID_HANDLE_VALUE) { int a=12; m_static_val.Format("%f",a); } //串口配置 DCB dcb; FillMemory(&dcb, sizeof(dcb), 0); if (!GetCommState(hComm, &dcb)) { int a=12; m_static_val.Format("%f",a); } else { dcb.BaudRate = CBR_9600 ; dcb.fOutX=TRUE; dcb.fInX=TRUE; } if (!SetCommState(hComm, &dcb)) { int a=12; m_static_val.Format("%f",a); } //讀取 DWORD dwRead; BOOL fWaitingOnRead = FALSE; OVERLAPPED osReader = {0}; LPVOID lpBuf[1024]; osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (osReader.hEvent == NULL) m_static_val.Format("%f",11); if (!fWaitingOnRead) { if (!ReadFile(hComm,lpBuf, 1024, &dwRead, &osReader)) { if (GetLastError() != ERROR_IO_PENDING) { int a=12; m_static_val.Format("%f",a); } else { fWaitingOnRead = TRUE; } } else { } } //列出訊習 #define READ_TIMEOUT 500 DWORD dwRes; if (fWaitingOnRead) { dwRes = WaitForSingleObject(osReader.hEvent, READ_TIMEOUT); switch(dwRes) { case WAIT_OBJECT_0: if (!GetOverlappedResult(hComm, &osReader, &dwRead, FALSE)) m_static_val.Format("%f",11); else fWaitingOnRead = FALSE; break; case WAIT_TIMEOUT: break; default: break; } } //串口狀態 DWORD dwCommEvent; char chRead; if (!SetCommMask(hComm, EV_RXCHAR)) { } for ( ; ; ) { if (WaitCommEvent(hComm, &dwCommEvent, NULL)) { do { if (ReadFile(hComm, &chRead, 1, &dwRead, NULL)) { m_static_val.Format("%f",11); } else m_static_val.Format("%f",11); break; } while (dwRead); } else m_static_val.Format("%f",11); break; } COMMTIMEOUTS timeouts; timeouts.ReadIntervalTimeout = 20; timeouts.ReadTotalTimeoutMultiplier = 10; timeouts.ReadTotalTimeoutConstant = 100; timeouts.WriteTotalTimeoutMultiplier = 10; timeouts.WriteTotalTimeoutConstant = 100; if (!SetCommTimeouts(hComm, &timeouts)) { m_static_val.Format("%f",11); } 補充說明: 此段程式碼我是寫在BUTTON的處理事件裡面,處理事件之狀態為 點一下滑鼠左鍵就執行資料傳輸。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.230.126.120

11/07 01:04, , 1F
人腦DEBUG有比VC內建的DEBUG厲害嗎????
11/07 01:04, 1F
文章代碼(AID): #1CrOKC1w (C_and_CPP)
文章代碼(AID): #1CrOKC1w (C_and_CPP)