[問題] VC++ RS232控制

看板C_and_CPP (C/C++)作者 (憶秋風痕)時間15年前 (2010/09/09 11:51), 編輯推噓1(104)
留言5則, 3人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 使用的環境是VC++ 2005,包率是9600 利用CreateFile, WriteFile與ReadFile對Com Port做控制(USB 轉 RS232) CreateFile方式 HANDLE OpenPort(char *szport, int baudrate) { HANDLE hport; hport = CreateFile (szport, // _T("COM3:") GENERIC_READ | GENERIC_WRITE, // Open for Read-Write 0, // COM port cannot be shared NULL, // Always NULL for Windows CE OPEN_EXISTING, // For communication resource 0, // Non-overlapped operation only NULL); // Always NULL for Windows CE if(hport == INVALID_HANDLE_VALUE) { OutputDebugString("Error Opening COM Port."); return 0; } DCB dcb; dcb.DCBlength = sizeof(DCB); if(!GetCommState(hport, &dcb)) { CloseHandle(hport); hport = INVALID_HANDLE_VALUE; return 0; } dcb.BaudRate = baudrate; //CBR_9600; dcb.fOutxCtsFlow = FALSE; dcb.fRtsControl = RTS_CONTROL_DISABLE; dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fOutxDsrFlow = FALSE; dcb.fOutX = FALSE; dcb.fInX = FALSE; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; if(!SetCommState(hport, &dcb)) { CloseHandle(hport); hport = INVALID_HANDLE_VALUE; return 0; } return hport; } WriteFile是用按鈕控制,每按一次傳一次 int r = WriteFile(h_ComPort, msg, msglen, &outlen, NULL); 而ReadFile是開一個Thread,在Com Port開成功後就一直收 while(h_ComPort != INVALID_HANDLE_VALUE) { dwBytesRead = 0; Sleep(100); status = ReadFile(h_ComPort, szSentence, 256, &dwBytesRead, NULL); if (!status && dwBytesRead <=0) { Sleep(5); continue; } } 目前遇到的問題: 1. ReadFile在啟動Thread後,Thread在執行ReadFile後就停住了(在ReadFile 設斷點停住後,按F10單步執行無法跳到下面的if判斷式) 2. WriteFile第一次按下可動作,但是第二次之後也會停住,個人猜想是因為 ReadFile卡住的關係 請問這兩個問題該怎麼解決,因為在ReadFile就停住,是否要設Timer? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.161.149.80

09/09 13:05, , 1F
你有用SetCommTimeouts去設定time-out時間嗎?
09/09 13:05, 1F

09/09 13:12, , 2F
這個方式是從前人成功的方式拿過來做的,他沒有加
09/09 13:12, 2F

09/09 13:13, , 3F
系統也能正常運作,所以我就覺得奇怪,到底是我用錯還是
09/09 13:13, 3F

09/09 13:13, , 4F
有其他問題,您的方式我會去試試看,謝謝
09/09 13:13, 4F

09/10 12:44, , 5F
記得要確定目標的RS232是會動的
09/10 12:44, 5F
文章代碼(AID): #1CY5d7JC (C_and_CPP)
文章代碼(AID): #1CY5d7JC (C_and_CPP)