Rs232同步接收的問題 |
尚未結案
|
JapStyle
一般會員 ![]() ![]() 發表:6 回覆:8 積分:2 註冊:2005-04-16 發送簡訊給我 |
我的Rs232約每一秒會上傳一次新的Data(若不去接收會累加在Buffer裡)
假設每次傳完一串完整的Data需要0.1秒
----| |------------------| |---------------- | |--~~~0.1sec~~~~~1sec~~~~~0.1sec~~~~~1sec~~~ 但是我的程式這邊無法精準地完全與它同步(詳細誤差時間我不確定) 也就是說無法在每次ㄧ筆完整傳完後我就去收它 如此不同步現在久了後 時間誤差就會累積 造成我會收到不完整的Data 當然我可以另外開一個buffer去累積我收到的不完整Data 直到Buffer內有足夠的Data我才去做後續處理 可是這樣我會浪費很多時間==>大概兩筆不完整去湊成ㄧ筆資料 示意圖如下: 完整Data: $GPGGA,105512,3536.5981,N,13944.8914,E,1,05,01.7,00100.7,M,039.2,M,*4 $GPGSV,2,1,08,28,52,298,49,31,34,097,42,04,00,242,27,20,55,152,47*7E $GPGSV,2,2,08,14,,,00,11,63,033,49,07,,,00,08,15,239,37*7B 兩筆不完整Data: 097,42,04,00,242,27,20,55,152,47*7E $GPGSV,2,2,08,14,,,00,11,63,033,49,07,,,00,08,15,239,37*7B $GPGGA,105512,3536.5981,N,13944.8914,E,1,05,01.7,00100.7,M,039.2,M,*4 $GPGSV,2,1,08,28,52,298,49,31,34,097,42,04,00,242,27,20,55,152,47*7E $GPGSV,2,2,08,14,,,00,11,63,033,49,07,,,00,08,15,239,37*7B $GPGGA,105512,3536.5981,N,13944.8914,E,1,05,01.7,00100.7,M,039.2,M,*4 $GPGSV,2,1,08,28,52,298,49,31,34, 請問有沒有什麼特別的方法可以知道Data是否正在傳送時 或者已經傳完了還是有誰有更好的同步方法 因為我看HyperTerminal 都可以做到完整不漏任何Data??? |
暗黑破壞神
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
JapStyle
一般會員 ![]() ![]() 發表:6 回覆:8 積分:2 註冊:2005-04-16 發送簡訊給我 |
請問要怎樣得到interrupt??是怎樣的interrupt呢? 我現在用polling的方式去詢問在緩衝區裡未被接收的資料量狀態
判別資料是否已經傳完 但是我覺得這樣的方法很不正統
請問是否有更好的發法呢?? 我的程式如下:
void __fastcall TRead232Thread::ReadData() { char inbuff[1024]; int strlength; unsigned int LenInQue=0; DWORD nBytesRead, dwEvent, dwError; COMSTAT cs; ClearCommError(hComm,&dwError,&cs);<=用來詢問"cs.cbInQue"勝於在buffer裡的data量 if (cs.cbInQue > sizeof(inbuff)) { PurgeComm(hComm, PURGE_RXCLEAR); return; } if(cs.cbInQue!=0) { while(cs.cbInQue!=LenInQue) { LenInQue=cs.cbInQue; Delay(10); ClearCommError(hComm,&dwError,&cs); } Delay(10););<=當"cs.cbInQue"不再變化時表示資料已經傳完,所以再下ㄧ秒傳資料前趕快收完所有Data ReadFile(hComm, inbuff,cs.cbInQue,&nBytesRead,NULL); inbuff[cs.cbInQue]= '\0'; } else { return; } Form1->Edit2->Text=StrLen(inbuff); Form1->Receive->Text =inbuff; /* if(Renew) { StrCopy(GlobalBuffer,inbuff); Renew=false; } else { StrLCat(GlobalBuffer,inbuff,1024); } Form1->Edit2->Text=StrLen(inbuff); strlength=StrToInt(StrLen(GlobalBuffer)); if(strlength>=1024) { Renew=true; set_flg(FLG_DRAW,FLG_PROCESS_DATA); } */ } |
暗黑破壞神
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
你要寫 windows 的程式?
那你要去看看 windows 下怎麼寫 rs232 的接收。
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=58630
自己把它改成用 thread 的方式去接收。
因為你寫了 delay 去做這個動作。自然會造成 lose
要用 interrupt 是當你使用 51 之類的單晶時的前提。 看了你的程式。覺得你要去看看 multi thread 怎麼做了。
你的問題在東西進來時。你這個 process 還在 delay 而 delay 的時間超過
你232接收的 buffer 所以造成資料流失。
就這樣。寫 multi thread 的東東。在站上查一下。不少人問過了。^_^ 就跟你說資料是否傳完。是你判斷收到那個字元是不是斷行 "\n" 或 "\r"
來判斷。而不是用時間來判斷。。。。。。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |