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

資料傳輸:0-255 的數值利用char 再組合成AnsiString的方式會產生誤差 II

答題得分者是:sryang
tyw6455
一般會員


發表:7
回覆:9
積分:3
註冊:2005-06-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-27 17:49:43 IP:58.99.xxx.xxx 訂閱
想要從單晶片透過網路線傳輸到PC上
單晶片上的資料是
1.一個數值是兩個Byte的大小(1-65535)
2.一次傳送200個數值(即400個Byte)

網路傳輸PC端是用IndyTCPServer寫的

一開始的時候是用模擬的方式先做拆解接收到的是數值是否正確
(這部分遇到的問題已經提問過,也有一個看起來可行的方式解決,底下敘述)
1.先在 A Function 裡面 用 亂數產生器產生一個0-255的整數
2.把int 都給 char
3.再用 AnsiString = (AnsiString)char 的方式產生一組需要拆解的數據

在這個階段已經發現這時組成的字串已經有點奇怪了,不過大小還是400byte

再把產生出來的這組數據丟到一個全域變數的AnsiString (叫zsString好了)上

在拆解端
先取用zsString
然後用char A1 = zsString[1]; cahr A2 = zsString[2]; int iValue = (A1*256) A2;
這種方式來模擬得到的數值,不過這時候就發現有的char裡面的值會變成負數
後來用 unsigned char A1,A2的方式來改善這個問題

接下來的模擬的動作就是把從取全域變數的方式改成取網路傳輸過來的方式這時就產生了問題

在全域變數的時候組合起來的AnsiString 雖然內容會變的很奇怪,
不過大小還是不折不扣的是產生出來的400byte 用 unsigned char 就可以得到原來產生出來的值

不過在透過網路的方式的時候
使用IndyTCPServer 用Readln的方式讀資料(沒試過用Read)
發現傳過來的一組資料的大小,已經不是產生資料時的400byte 而會有所變動,大小不一。
請問這種情況如果在資料來源端不改變資料形式下(即2個Byte代表0-65535)還有解決的方向嗎
或是直接在資料來源端將65535的數值轉成16進位的方式來傳(及變成4個BYTE來代表0-65535 (0xFFFF))
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-27 21:05:50 IP:124.10.xxx.xxx 訂閱
ReadLn 遇到換行字元 0x0d 0x0a 等就會停下,因為已經讀到「一行」了
還是用 Read 吧
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
tyw6455
一般會員


發表:7
回覆:9
積分:3
註冊:2005-06-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-28 09:12:19 IP:58.99.xxx.xxx 訂閱
瞭解
謝謝囉
我之後用ServerSocket當接收端來測試,
收到的結果也是OK的。

===================引 用 sryang 文 章===================
ReadLn 遇到換行字元 0x0d 0x0a 等就會停下,因為已經讀到「一行」了
還是用 Read 吧
系統時間:2024-11-24 10:41:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!