關於 連結 RS232 的問題 (可能很多大大會想罵人怎麼不爬文...但是這次真的不一樣= =) |
尚未結案
|
ilike28
一般會員 發表:1 回覆:5 積分:1 註冊:2009-10-09 發送簡訊給我 |
各位大大安安QQ
小弟因為想玩依台GPS接收機 而接觸到了RS232接頭 因為 桌電沒有該接頭 所以 買了轉接頭用USB 然後去網路上搜尋各種版本的程式碼 經過細心比對@@ 發現 核心部份 VC跟 c builder 一模一樣QQ 但是 我的程式碼 在readfile那邊 都讀不到值 而其第4個參數 代表讀取多少值的變數 也一值都是0 原本想說是COM沒接好 但是用GPS接收機附的介面軟體 就讀的到 卡了一個星期 依然沒辦法解決 所以 想請各位大大 花點時間看看...小弟是不是有沒注意到的地方...謝謝 以下為 小弟的 完整 程式碼 . 沒有其他任何沒有附上的程式碼 #include void main() { DCB dcb; HANDLE hCom; BOOL fSuccess; char *pcCommPort = TEXT("COM3"); hCom = CreateFile( pcCommPort, GENERIC_READ , FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if(hCom==INVALID_HANDLE_VALUE) printf("RS232連線失敗,請檢查連線設定,此狀態下無法經由barcode自動載入產品資料\n"); else printf("RS232連線成功\n"); fSuccess = GetCommState(hCom, &dcb); if (!fSuccess) printf ("GetCommState failed with error %d.\n", GetLastError()); // ======================================================= SetupComm(hCom,1024,1024); PurgeComm(hCom, PURGE_TXCLEAR|PURGE_RXCLEAR); COMMTIMEOUTS Timeouts; Timeouts.ReadIntervalTimeout=50; Timeouts.ReadTotalTimeoutConstant=500; Timeouts.ReadTotalTimeoutMultiplier=0; SetCommTimeouts(hCom,&Timeouts); // ======================================================= dcb.BaudRate = CBR_9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; fSuccess = SetCommState(hCom, &dcb); if (!fSuccess) printf ("SetCommState failed with error %d \n", GetLastError()); else printf ("到目前為止沒問題\n" ); char data[4096]; DWORD nBytesRead = 0; int aa=8; for(int i=0;i ReadFile(hCom, data,aa,&nBytesRead,NULL); for(i=0;i CloseHandle(hCom); }
------
^O^ |
TWY
高階會員 發表:2 回覆:133 積分:152 註冊:2009-09-02 發送簡訊給我 |
你要判斷讀出多少資料請改判斷第三個參數試試看。
以下為我使用很久的 Delphi Code,提供參考,請自行轉換 C 語法 [code delphi] //-----宣告 var hComPort : THandle; cBuffer : Array [0..2047] of Char; myComStat : TComStat; nBytesRead : LongWord; sReadData : String; //-----使用 ReadFile(hComPort, cBuffer, myComStat.cbInQue, nBytesRead, Nil); sReadData := Copy(cBuffer, 1, myComStat.cbInQue); //從 cBuffer 中讀出長度為 myComStat.cbInQue 的資料 [/code] |
ilike28
一般會員 發表:1 回覆:5 積分:1 註冊:2009-10-09 發送簡訊給我 |
|
TWY
高階會員 發表:2 回覆:133 積分:152 註冊:2009-09-02 發送簡訊給我 |
改1 ?? 第三個參數 myComStat.cbInQue 不需要給值,那是 ReadFile API 呼叫完後我們去讀取用的。
兩個想法提供參考: 1. 將 TimeOut 時間設長一點看看最終能否讀到任何資料。較早期的GPS晶片(應該是三代前)通常要好幾分鐘才會定位出正確座標(我之前玩過的有的 PCMCIA 介面第一次要3~5分鐘,Blue Tooth 介面的則是兩秒內...)。不過我覺得應該不會卡在 ReadFile 才是。 2. 有沒有用過 TCOMPort 這款外部元件!?其實我在控制 GPS Receiver 都是用它的,ReadFile API 則是用在其他 RS232 周邊。 使用 TCOMPort 不太需要寫程式碼,屬性設好然後Connected 之後儘管讀取即可,以下 Code 為讀取 COM Port 資料提供參考 [code delphi] procedure TfrmGISReceiver.ComPortRxChar(Sender: TObject; Count: Integer); var Str: String; begin ComPort.ReadStr(Str, Count); Memo1.Text := Memo1.Text Str; //這裡會一直從 COM Port 讀入資料,你只要判斷是否已讀入正確 $GPRMC 字串並能解析出你要的資訊即可 end; [/code] ===================引 用 ilike28 文 章=================== 第3個參數 在我之前沒設定等待時間的時候 我也有改1... 但是 不是時間到 回傳0 不然就是 沒設定等待時間的時候 卡在readfile那邊 但是用介面軟體的時候 一下就抓到了 可是 VC6.0 跟 超級終端機 卻都完全沒反應 = =" |
ilike28
一般會員 發表:1 回覆:5 積分:1 註冊:2009-10-09 發送簡訊給我 |
|
ilike28
一般會員 發表:1 回覆:5 積分:1 註冊:2009-10-09 發送簡訊給我 |
|
TWY
高階會員 發表:2 回覆:133 積分:152 註冊:2009-09-02 發送簡訊給我 |
|
ilike28
一般會員 發表:1 回覆:5 積分:1 註冊:2009-10-09 發送簡訊給我 |
|
TWY
高階會員 發表:2 回覆:133 積分:152 註冊:2009-09-02 發送簡訊給我 |
|
2007
中階會員 發表:54 回覆:90 積分:98 註冊:2008-08-12 發送簡訊給我 |
哈囉!! FYI
文中說到的 "軟體介面" 是指什麼??? 是指 Terminal.exe ComTools.exe COMPORT 的小工具嗎?? 如果是話,可以嚐試的用 comport的監聽程式 抓看看。 http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=87126 ===================引 用 ilike28 文 章=================== 第3個參數 在我之前沒設定等待時間的時候 我也有改1... 但是 不是時間到 回傳0 不然就是 沒設定等待時間的時候 卡在readfile那邊 但是用介面軟體的時候 一下就抓到了 可是 VC6.0 跟 超級終端機 卻都完全沒反應 = =" |
ilike28
一般會員 發表:1 回覆:5 積分:1 註冊:2009-10-09 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |