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

SPCOMM 接收方面問題

尚未結案
yachu721
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-09 23:05:02 IP:203.67.xxx.xxx 未訂閱
使用SPCOMM來接收設備資料 但接收卻出現了一點問題 我發現和接收反應時間有關 我接收反應設很短 問題如下 原本資料是 1111111111111111 2222222222222222 3333333333333333 4444444444444444 當反應時間內只接收了 1111111111111111 22222222222222 和下一次接收造成了落差 卻接收為 1111111111111111 22222222222222 22 3333333333333333 4444444444444444 是否有辦法解決呢 程式碼如下 void __fastcall TFormMain::Comm1ReceiveData(TObject *Sender, Pointer Buffer, WORD BufferLength) { String bhu7 = (char *) Buffer; TStrings *sk=new TStringList; sk->Add(bhu7); Memo1->Lines->AddStrings(sk); delete sk; }
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-09 23:50:12 IP:218.168.xxx.xxx 未訂閱
您好:    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 > 程式的問題< class="code"> void __fastcall TFormMain::Comm1ReceiveData(TObject *Sender, Pointer Buffer, WORD BufferLength) { String bhu7 = (char *) Buffer; TStrings *sk=new TStringList; //這行移到FormMain的建構函式中 sk->Add(bhu7); Memo1->Lines->AddStrings(sk); delete sk; //這行移到FormMain的解構函式中 }
yachu721
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-10 08:03:35 IP:203.67.xxx.xxx 未訂閱
taishyang大大您好 不好意思~po程式碼以後會多多注意的~~ccc TStrings *sk=new TStringList; 您的意思是說將這行設為全域變數嗎 我試過了~~還是不行 不知是哪出了錯
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-10 10:19:05 IP:210.202.xxx.xxx 未訂閱
To yachu721:      這種情況應算是很平常; 因為UART在傳送接收上會不同步. 不僅你接收反應時間, 傳送端也是會有影響. 你認為應該將接 收反應時間調較短些, 但若調太短的話, 你的顯示資料將可能 變成:    
   111111111
   11111112
   2222...
   
這樣類似的情況; 建議你是自行於Comm1ReceiveData內調整顯 示; 依你的例子, 你可以先將送過來的資料存到另一個Buffer 去, 存完後判斷其長度是否大於16, 是的話則將Buffer內0~15 的資料顯示到Memo1, 再調整Buffer.
yachu721
初階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-10 10:37:06 IP:220.130.xxx.xxx 未訂閱
derrenbol1大大您好 謝謝您的解說 但是我的資料並不一定是16個字元 因為方便於解說我的狀況 才這樣比喻 我的每一行資料都是不一樣長 這才讓我頭疼 我有試著將反應時間調整 但銜接的地方還是會出問題 就是會跳到下一行 不知是否有方法可以解決
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-10 10:51:01 IP:210.202.xxx.xxx 未訂閱
To yachu721: 你傳送端一筆與一筆的間隔不要太快.
yachu721
初階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-10 11:06:39 IP:220.130.xxx.xxx 未訂閱
但是資料是由設備端發出 沒有辦法調整 一次資料就是很多
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-10 11:19:17 IP:210.202.xxx.xxx 未訂閱
To yachu721: 每筆資料也沒有明顯的可判斷結束點?
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-11-10 11:27:16 IP:210.68.xxx.xxx 未訂閱
您好:  在Comm1ReceiveData事件當中,因該可以知道[這次接收的資料長度]有多少 所以程式改成
void __fastcall TFormMain::Comm1ReceiveData(TObject *Sender,
Pointer Buffer, WORD BufferLength)
{
    for (i=0; i<資料長度(我不確定是不是BufferLength); i  )
    {
        String bhu7 = (char *) Buffer;   
        sk->Add(bhu7);
        Memo1->Lines->AddStrings(sk);
        Buffer指標的位址 1,取得下一筆資料
    }    
}
順心
yachu721
初階會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-11-10 12:03:23 IP:220.130.xxx.xxx 未訂閱
derrenbol1大大您好 資料的確是沒有一個明確的終止點    taishyang大大您好 程式碼還是不行 您的意思是取得這次的長度 然後一個字元一個字元丟入嗎 我將修改為    
     vector rchar; /////全域變數
////////////////////    void __fastcall TFormMain::Comm1ReceiveData(TObject *Sender,
      Pointer Buffer, WORD BufferLength)
{    TStrings *sk=new TStringList;
String bhu7 = (char *) Buffer;
sk->Add(bhu7);
String sd=sk->Text;    for(int i=1;i<=sd.Length();i  ) 
         {
           rchar.push_back(sd[i]);
         }
  delete sk;    //////在丟入 Memo1    }    
還是不行呀
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-11-10 13:10:23 IP:210.202.xxx.xxx 未訂閱
To yachu721: 不會吧, 也沒有代表資料長度的位元組; 沒有協定的傳輸, 這確 實接收端也只能傻傻地收. 連空白、控制字元、非顯示字元都沒有 嗎? 傳送端那台機器是那個"天才"做的?
yachu721
初階會員


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-11-10 13:38:12 IP:220.130.xxx.xxx 未訂閱
derrenbol1大大您好 我測試的設備是三菱控制器 資料傳回長度是不一定的 不知是否有沒注意到的地方 但是我Debug資料確實是如此 發表人 - yachu721 於 2005/11/10 14:24:19
yachu721
初階會員


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-11-10 14:46:15 IP:220.130.xxx.xxx 未訂閱
謝謝大大們的指教 已經有找到出錯的原因 原因是資料的結尾SPCOMM還會加上\r\n 不知SPCOMM是否可以設除 所以程式碼修改如下     
 
vector rchar; /////全域變數
////////////////////    void __fastcall TFormMain::Comm1ReceiveData(TObject *Sender,
      Pointer Buffer, WORD BufferLength)
{         TStrings *sk=new TStringList;
     String bhu7 = (char *) Buffer;
     sk->Add(bhu7);
     String sd=sk->Text;           for(int i=1;i<=sd.Length()-2;i  )/////長度要扣2 資料才正常
         {
         rchar.push_back(sd[i]);
         }
         delete sk;    //////丟入 Memo1    }    
發表人 - yachu721 於 2005/11/10 14:48:25
系統時間:2024-11-23 17:37:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!