全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2936
推到 Plurk!
推到 Facebook!

RS232設備緩衝過溢

尚未結案
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-12-06 20:30:55 IP:59.105.xxx.xxx 未訂閱
請問大大 跟設備大量傳輸資料的時候 傳輸速率在4800的時候很穩定 但傳輸速率高於9600的時候卻會發生設備緩衝過溢的情況 我有使用XONXOFF軟體協定 有可能是什麼問題的 我使用的是SPCOMM元件 程式碼如下    以下是在接收的事件下    
void __fastcall TFormMain::Comm1ReceiveData(TObject *Sender,
      Pointer Buffer, WORD BufferLength)
{
String bhu7 = (char *) Buffer;
TStrings *sk=new TStringList;
sk->Add(bhu7);
String sd=sk->Text;
 
if(sd.Length()<=3)
  {
 
           if(sd.Pos(char(17))!=0) ////xon
                  {                         datatrans=true;////傳送程式之while迴圈為true
                     Tdata();////進入傳送程式之while迴圈副程式
                     return;
                  }                 if(sd.Pos(char(19))!=0) ////xoff
                  {                         datatrans=false;////傳送程式之while迴圈為false
                     Tdata();////進入傳送程式之while迴圈副程式
                     return;
                  }
   }
} 
 
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-12-07 21:56:33 IP:59.105.xxx.xxx 未訂閱
不知是否和反應時間有關 關於 SetCommState( com2_handle , &dcb ); ReadIntervalTimeout ReadTotalTimeoutMultiplier ReadTotalTimeoutConstant WriteTotalTimeoutMultiplier WriteTotalTimeoutConstant 當大量傳送資料時 不知該如何設定會比較穩定呢
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-12-08 18:25:04 IP:218.169.xxx.xxx 未訂閱
Hello! "設備緩衝過溢"=>指的是外部裝置吧? 請確認設備具有XON/XOFF功能.
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-12-08 18:49:05 IP:59.105.xxx.xxx 未訂閱
DavidLo大大您好 我確定設備(我要控制的設備)有回傳DC1(XON)及DC3(XOFF)來控制流量 我的方法是利用    類似如下 在接收的事件下    收到DC1(XON) 則使副程式中的while迴圈啟動 收到DC3(XOFF) 則使副程式中的while迴圈停止     
     bool datatrans=false;///全域變數決定XON或XOFF    //-----------------------------------
while(datatrans)
   {
   Application->ProcessMessages();
   傳送程式
   }
這種方法好嗎 還是要在迴圈中 每RUN一次就去偵測是否有資料近來 還是用多執行緒來寫會比較好呢 這跟COM的UART晶片Buffer有關嗎 發表人 - yachu721 於 2005/12/08 18:52:16
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-12-08 18:59:53 IP:218.169.xxx.xxx 未訂閱
請問 "Tdata()" 一次會傳送幾個Bytes?
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-12-08 19:25:53 IP:59.105.xxx.xxx 未訂閱
引言: 請問 "Tdata()" 一次會傳送幾個Bytes?
傳送1個Byte 發表人 - yachu721 於 2005/12/08 19:29:23
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-12-08 20:04:24 IP:218.169.xxx.xxx 未訂閱
那麼傳送1個Byte,Why need while loop?
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-12-08 20:24:25 IP:59.105.xxx.xxx 未訂閱
DavidLo大大您好 誤會您的意思了 迴圈RUN一圈是送出一個Byte 但是迴圈要送出約1MB的文字檔 直到RUN完為止 所以一定要有XONXOFF控制流量
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-12-08 20:45:25 IP:218.169.xxx.xxx 未訂閱
一般外部裝置內部緩衝區80%滿,會送出XOFF,通知PC不要在送Data. 低於20%在送出XON,重新啟動傳送. 建議利用Timer或Thread每隔?mS送一個Byte,由datatrans控制傳送與否. 於Comm1ReceiveData程序中,當收到XOFF時,設定datatrans false and vice versa.
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-12-08 21:57:04 IP:59.105.xxx.xxx 未訂閱
DavidLo大大您好 那我就先試試看囉
系統時間:2024-11-23 16:09:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!