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

請高手幫小弟看一下我寫的元件bug出在哪裡

答題得分者是:dllee
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-14 11:59:10 IP:59.125.xxx.xxx 訂閱
首先,先把問題點說出來,當小弟從com port 讀入的資料有個 00 時,輸出給變數的字串就會被截掉,經追蹤程式碼,問題出現在一行程式
FInputData:=Copy(szInputBuffer,1,ReadLen);
szInputBuffer 內容為( 01 03 04 00 00 04 47 b8 c1 00 00 00...........................),ReadLen為9,經Delphi 的Copy函式Copy到FInputData卻變成 01 03 04,後面的東西全沒了
請大大高手們幫小弟看一下問題點,感恩
程式碼如附件

PS:小弟元件來自某位作者(忘了名字了,拍謝)的"delphi 串列通訊"一書裡所附的元件改變而來
附加檔案:46ea070edb24a_TComm.rar
編輯記錄
wychen57 重新編輯於 2007-09-14 12:14:34, 註解 無‧
wychen57 重新編輯於 2007-09-14 13:04:06, 註解 無‧
dllee
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-14 13:53:23 IP:220.134.xxx.xxx 訂閱
你的  szInputBuffer:      array[0..INPUTBUFFERSIZE-1] of Char;
是 Char Array,那為什麼 FInputData: 要用 String; 呢?
String 本來就是記錄字串並以 00 視為字串結尾。
如果 FInputData 也是 Char Array,那就自已寫個 For Loop Copy 就可以了。
Copy http://www.delphibasics.co.uk/RTL.asp?Name=Copy
基本上也是 Copy 字串,遇到 00 就視為字串結束,後面的就不 Copy 了。

強力推薦 ShareMe 免費網路硬碟 VMASK VMIO-Server/SECS/GEM dllee's blog dllee's StatPlus
------
http://www.ViewMove.com
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-14 16:07:12 IP:59.125.xxx.xxx 訂閱
感謝大大的回答,小弟還有一個問題,如果要把元件的輸入由string改成byte陣列,要怎麼改呢,小弟怎麼改都會出錯耶
dllee
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-09-14 17:01:56 IP:59.105.xxx.xxx 訂閱
以您目前提供的程式,要使用在 Binary (有 00 ) 的應用,
送出資料使用 TComm.OutputByte
要收資料使用 TComm.ReadInputByte
這樣就不會有問題了。
這兩個函式在原書中應該有詳細的說明,或是,如果是您改的,那您就知道要如何使用。

大部分人犯的錯誤就是用字串的介面去處理有 00 的資料,造成資料 Lost 或無法通訊。
建議要使用 RS232/485/422 最好習慣使用 Binary(Binary Array, Char Array) 的介面,
才能通用於各式的系統。
強力推薦 ShareMe 免費網路硬碟 VMASK VMIO-Server/SECS/GEM dllee's blog dllee's StatPlus
------
http://www.ViewMove.com
系統時間:2024-11-22 0:36:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!