線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4820
推到 Plurk!
推到 Facebook!

關於 連結 RS232 的問題 (可能很多大大會想罵人怎麼不爬文...但是這次真的不一樣= =)

尚未結案
ilike28
一般會員


發表:1
回覆:5
積分:1
註冊:2009-10-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-10-09 20:38:13 IP:118.167.xxx.xxx 訂閱
各位大大安安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 data[i]=0;
ReadFile(hCom, data,aa,&nBytesRead,NULL);
for(i=0;i printf("%d ",data[i]);
CloseHandle(hCom);
}


------
^O^
TWY
高階會員


發表:0
回覆:132
積分:151
註冊:2009-09-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-10-11 05:50:32 IP:220.132.xxx.xxx 訂閱
你要判斷讀出多少資料請改判斷第三個參數試試看。
以下為我使用很久的 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-10-11 08:53:59 IP:118.167.xxx.xxx 訂閱
第3個參數   在我之前沒設定等待時間的時候  我也有改1...
但是 不是時間到 回傳0 不然就是 沒設定等待時間的時候 卡在readfile那邊
但是用介面軟體的時候 一下就抓到了
可是 VC6.0 跟 超級終端機 卻都完全沒反應 = ="
------
^O^
TWY
高階會員


發表:0
回覆:132
積分:151
註冊:2009-09-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-10-11 18:31:24 IP:220.132.xxx.xxx 訂閱
改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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-10-11 21:37:06 IP:118.167.xxx.xxx 訂閱
感謝您的回覆阿XD

經過了10天的奮戰!!
我現在幾乎可以肯定是 那台 10萬多元...3個月前 實驗室購買的儀器有問題
可以用軟體介面讀到

但是 !!!!! 用超級終端機 竟然完全沒訊號!?

於是今天 讓自己的小荷包 噴了1600...去買了一台 大眾化使用的 藍芽傳輸 接收機
回家一測試 VC6.0讀的到 超級終端機 也讀的到

瞬間 好想把學校買的儀器打爛 ˋ_ˊ
------
^O^
ilike28
一般會員


發表:1
回覆:5
積分:1
註冊:2009-10-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-10-11 21:39:09 IP:118.167.xxx.xxx 訂閱
順帶一提 
我用的是 新版的 " DG14 " GPS接收機
不能用就是不能用ˋ_ˊ
如果這邊有賣DG14廠商的員工
我要大聲的說 !!

超級終端機 讀不到你們家賣的DG14啦 !
------
^O^
TWY
高階會員


發表:0
回覆:132
積分:151
註冊:2009-09-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-10-12 08:55:10 IP:211.21.xxx.xxx 訂閱
恭喜你找到並解決你的問題了,寫程式的快感就是這樣。

ilike28
一般會員


發表:1
回覆:5
積分:1
註冊:2009-10-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-10-12 22:37:07 IP:118.167.xxx.xxx 訂閱
真正的問題還沒解決阿...
我只是買了另一台接收機而已 = ="

DG14 軟體介面可以讀
但是 使用超級終端機 卻 " 一點訊號也沒有 " !!!

請問各位大大...有碰過類似的問題嗎= =??
有人建議我去查查腳位...看是否是因為跳線問題..
但是後來想想...會有廠商故意把腳線 做的跟別人不一樣
讓普通玩家 無法直接用超級終端機 讀取嗎 = =???
------
^O^
TWY
高階會員


發表:0
回覆:132
積分:151
註冊:2009-09-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-10-13 08:45:24 IP:211.21.xxx.xxx 訂閱
我寫過多種不同 RS232 週邊設備,曾經遇到過規格書明明寫 9600 N , 8 , 1 ,但我的程式怎麼試都不通,使用廠商提供的工具卻可以通。後來我嘗試其他設定 (如 9600,E,7,1) ,居然就通了,原因為規格書指明的設定值是錯誤的。
你可以試試多種不同設定組合看看會不會剛好是類似的問題。

編輯記錄
TWY 重新編輯於 2009-10-13 08:47:36, 註解 無‧
2007
中階會員


發表:54
回覆:90
積分:98
註冊:2008-08-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-10-13 11:20:54 IP:60.249.xxx.xxx 未訂閱
哈囉!!   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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-10-13 11:25:59 IP:118.167.xxx.xxx 訂閱
介面軟體...指的是
買儀器時...廠商隨機附贈的軟體@@

打開的時候...他會先要求輸入COM是第幾個
然後開始 用暴力解法...去算出 他的每秒傳輸速率...
然後 最後得到 9600 8bit 之類的東西
然後 就可以開始看到接收機 傳資料進來


結果 我改用超級終端機去讀...設定一樣 卻一點訊號都沒收到 orz
不過儀器拿回學校了
要等星期3 才能知道 修正的結果 能不能執行 XD
------
^O^
系統時間:2017-10-20 22:15:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!