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

Rs232同步接收的問題

尚未結案
JapStyle
一般會員


發表:6
回覆:8
積分:2
註冊:2005-04-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-21 20:44:51 IP:211.21.xxx.xxx 未訂閱
我的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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-22 09:41:17 IP:221.169.xxx.xxx 未訂閱
1.必須用 interrupt 去做接收。 2.傳完時。它有 ”換行”給你做判斷。 3.你去看那一行的資料。它有含一個 CRC 之類的東西。 你只要CHECK那個是對的。那這筆資料為可用資料。 如果錯的就放棄這筆。 反正GPS每秒都會送一次DATA進來。
JapStyle
一般會員


發表:6
回覆:8
積分:2
註冊:2005-04-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-22 11:58:18 IP:211.21.xxx.xxx 未訂閱
請問要怎樣得到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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-22 12:12:54 IP:221.169.xxx.xxx 未訂閱
你要寫 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" 來判斷。而不是用時間來判斷。。。。。。
系統時間:2024-04-27 4:59:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!