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

RS232與8051傳輸之問題??

尚未結案
hsuanjen
一般會員


發表:6
回覆:2
積分:1
註冊:2004-09-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-07 17:45:31 IP:163.25.xxx.xxx 未訂閱
請教各位大大: 我也是參考那本BCB與RS232的書,我想將從8051接收到的資料依序顯示在Edit元件上(30筆資料不斷的傳入),程式可以執行,但是執行後總會出現Buffer Out of Range的錯誤,可是如果我用Memo元件顯示的話卻可以達到我的需求,感覺上應該是我的程式語法有問題,這讓我很納悶。另外就是我不知道如何利用迴圈讓讀入的值依序丟入不同的Edit中,所以我用最笨的方法一個一個丟(參考下面的程式碼),希望有高手可以教教我...感激不盡!!以下是我的部分程式碼: void __fastcall TForm1::Comm1ReceiveData(TObject *Sender) {   DynamicArray ByteSend,ByteReceive; long i; ByteReceive=Comm1->ReadInputByte(); for (i=0;iText=Memo1->Text IntToStr(ByteReceive[i]) '\x0d' '\x0a' ; //以下是不能執行的(我有分開測試,並不是一起執行) /* Memo1->Text = IntToStr(ByteReceive[0]); Memo2->Text = IntToStr(ByteReceive[1]); Memo3->Text = IntToStr(ByteReceive[2]); Memo4->Text = IntToStr(ByteReceive[3]); Memo5->Text = IntToStr(ByteReceive[4]); Memo6->Text = IntToStr(ByteReceive[5]); Memo7->Text = IntToStr(ByteReceive[9]); Memo8->Text = IntToStr(ByteReceive[7]); Memo9->Text = IntToStr(ByteReceive[8]); Memo10->Text = IntToStr(ByteReceive[9]); Memo11->Text = IntToStr(ByteReceive[10]); Memo12->Text = IntToStr(ByteReceive[11]); Memo13->Text = IntToStr(ByteReceive[12]); Memo14->Text = IntToStr(ByteReceive[13]); Memo15->Text = IntToStr(ByteReceive[14]); Memo16->Text = IntToStr(ByteReceive[15]); Memo17->Text = IntToStr(ByteReceive[16]); Memo18->Text = IntToStr(ByteReceive[17]); Memo19->Text = IntToStr(ByteReceive[18]); Memo20->Text = IntToStr(ByteReceive[19]); Memo21->Text = IntToStr(ByteReceive[20]); Memo22->Text = IntToStr(ByteReceive[21]); Memo23->Text = IntToStr(ByteReceive[22]); Memo24->Text = IntToStr(ByteReceive[23]); Memo25->Text = IntToStr(ByteReceive[24]); Memo26->Text = IntToStr(ByteReceive[25]); Memo27->Text = IntToStr(ByteReceive[26]); Memo28->Text = IntToStr(ByteReceive[27]); Memo29->Text = IntToStr(ByteReceive[28]); Memo30->Text = IntToStr(ByteReceive[29]); */ }
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-11 06:29:04 IP:211.76.xxx.xxx 未訂閱
引言: 請教各位大大: 我也是參考那本BCB與RS232的書,我想將從8051接收到的資料依序顯示在Edit元件上(30筆資料不斷的傳入),程式可以執行,但是執行後總會出現Buffer Out of Range的錯誤,可是如果我用Memo元件顯示的話卻可以達到我的需求,感覺上應該是我的程式語法有問題,這讓我很納悶。另外就是我不知道如何利用迴圈讓讀入的值依序丟入不同的Edit中,所以我用最笨的方法一個一個丟(參考下面的程式碼),希望有高手可以教教我...感激不盡!!以下是我的部分程式碼:
void __fastcall TForm1::Comm1ReceiveData(TObject *Sender)
{
  DynamicArray ByteSend,ByteReceive;
  long i;      ByteReceive=Comm1->ReadInputByte();
  for (i=0;iText=Memo1->Text  IntToStr(ByteReceive[i]) '\x0d' '\x0a' ;    //以下是不能執行的(我有分開測試,並不是一起執行)
/* Memo1->Text = IntToStr(ByteReceive[0]);
 Memo2->Text = IntToStr(ByteReceive[1]);
 Memo3->Text = IntToStr(ByteReceive[2]);
 Memo4->Text = IntToStr(ByteReceive[3]);
 Memo5->Text = IntToStr(ByteReceive[4]);
 Memo6->Text = IntToStr(ByteReceive[5]);
 Memo7->Text = IntToStr(ByteReceive[9]);
 Memo8->Text = IntToStr(ByteReceive[7]);
 Memo9->Text = IntToStr(ByteReceive[8]);
 Memo10->Text = IntToStr(ByteReceive[9]);
 Memo11->Text = IntToStr(ByteReceive[10]);
 Memo12->Text = IntToStr(ByteReceive[11]);
 Memo13->Text = IntToStr(ByteReceive[12]);
 Memo14->Text = IntToStr(ByteReceive[13]);
 Memo15->Text = IntToStr(ByteReceive[14]);
 Memo16->Text = IntToStr(ByteReceive[15]);
 Memo17->Text = IntToStr(ByteReceive[16]);
 Memo18->Text = IntToStr(ByteReceive[17]);
 Memo19->Text = IntToStr(ByteReceive[18]);
 Memo20->Text = IntToStr(ByteReceive[19]);
 Memo21->Text = IntToStr(ByteReceive[20]);
 Memo22->Text = IntToStr(ByteReceive[21]);
 Memo23->Text = IntToStr(ByteReceive[22]);
 Memo24->Text = IntToStr(ByteReceive[23]);
 Memo25->Text = IntToStr(ByteReceive[24]);
 Memo26->Text = IntToStr(ByteReceive[25]);
 Memo27->Text = IntToStr(ByteReceive[26]);
 Memo28->Text = IntToStr(ByteReceive[27]);
 Memo29->Text = IntToStr(ByteReceive[28]);
 Memo30->Text = IntToStr(ByteReceive[29]);  */
 }
問題應該只您用的是 DynamicArray 而每次執行
  ByteReceive=Comm1->ReadInputByte();
所收到的長度並不相同,您在使用 for 迴圈時,會判斷 ByteReceive.Length 所以,在操作 ByteReceive[i] 時並不會超過範圍。 但是您第二種方法是固定用到 [29] 也就是如果 ByteReceive.Length 小於 30 時,就會發生 Buffer Out of Range 的錯誤,這是一定的。 您需要注意的是,雖然 8051 是每次送出 30 筆資料,但 PC 端並不會知道每次是 30 筆,而是由接受元件認為已收到夠多字元或是已收到字元但夠長時間內沒有收到新字元時, ReceiveData 事件就有可能觸發,所以觸發的時機不會是您想要的正好 30 筆。 如果您一定要 30 筆, 30 筆的處理,可以先建一個較大的 Buffer,把收到的資料放入,當 Buffer 大於等於 30 時,再一次處理,這樣就 OK 了。 吃軟也吃硬 dllee.ktop.com.tw 視動科技 VMASK - ViewMove Automation Software Kernel
------
http://www.ViewMove.com
系統時間:2024-04-30 7:49:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!