BCB & RS232 ..連續傳送檔案與依序接收 |
尚未結案
|
A120238501
一般會員 發表:3 回覆:0 積分:0 註冊:2004-04-28 發送簡訊給我 |
各位大大:
小弟我剛學習BCB,我在利用C Builder 與 RS-232 書中所贈送的Pcomm來做實習,裡用他的lab來做檔案傳送,目前的BaudRate=115200...我在傳送文字沒問題..我線再想要再我的傳送時能選擇5到10個.txt檔....然後按下傳送...在B電腦接收資料..然而當他接收完第一筆資料就給1.txt..同理接收完第二筆資料就給2.txt..以此類推
小弟有疑問.....怎麼判斷他已送完第一筆資料...並給一個檔名作儲存.....希望各位大大給意見..或有現成的範例供小弟使用..感恩啊^^
|
stanley
一般會員 發表:9 回覆:36 積分:14 註冊:2003-11-20 發送簡訊給我 |
|
stanley
一般會員 發表:9 回覆:36 積分:14 註冊:2003-11-20 發送簡訊給我 |
|
brook
資深會員 發表:57 回覆:323 積分:371 註冊:2002-07-12 發送簡訊給我 |
這是個蠻大的問題,非三言兩語可以解決的,首先你要解決幾個問題:
一.rs232傳輸可能會掉字元,所以你必須要有checksum,checksum不對,收到的資料就是垃圾.
二.接收方收到的資料何時開始?何時結束?如何知道?
三.因接收方並不一定會接收到,假如要確保對方一定會收到正確的資料,一定要雙向溝通,也就是要有自己的通信協定. 解決方法僅供參考:
一.checksum,小問題自己解決. 二.1.你可用兩個0xff當資料的開頭和結尾,也就是0xff0xff "你的資料" 0xff0xff.
2.當然你會說,我的資料裡也有可能有0xff,當資料裡也兩個0xff是不是也會把它當成資料的結尾呢?
當然這也是有可能的,所以資料必須要先編碼,先把所有的0xff字元,用0xfe0xff兩個字元代替,
經過這樣的編碼後,就不會再有兩個0xff連在一起的狀況發生.
接收端收到資料後再把0xfe0xff轉成0xff即可. 三.1.先定義你的通訊命令格式如:
typedef struct
{
short cmd;//1.登錄 2.登錄成功 3.要檔名 4.傳檔名 5.要檔案大小 6.傳檔案大小
//7.要檔案內容的第幾個BLOCK 8.傳第幾個BLOCK ...依自己的需求定義.
//檔案太大,一定要分成幾個BLOCK傳送,一個BLOCK可用512bytes
short block;//第幾個BLOCK,傳block時會用到.
short size; //傳送資料大小.
short checksum;
} HEAD; 2.通訊協定僅供參考:
傳出的電腦<-->接收的電腦
<-- 登錄 //假如無回應,過幾秒再重送
登錄成功 -->
<-- 要檔名 //假如無回應,過幾秒再重送
傳檔名 -->
<-- 要檔案大小 //假如無回應,過幾秒再重送
傳檔案大小 -->
<-- 要BLOCK 1 //假如無回應,過幾秒再重送
傳BLOCK 1 -->
<-- 要BLOCK 2 //假如無回應,過幾秒再重送
... 直到檔案大小的資料都要到才回到 要檔名 那段.
//重送N次沒回應,重新連線重新登錄
4.兩端電腦都必須記錄目前狀況,檢查每一步驟是否合乎規定.
5.要資料的那端最好是CLIENT端,因為SERVER端要服務很多CLIENT,不宜加重工作.
6.SERVER端1分鐘沒收到CLIENT傳上來要求的訊息,自動斷線. 四.傳送時資料處理步驟
1.要傳送的資料
2.編碼 0xff 轉成 0xffoxff //最壞的狀況就是你的資料都是0xff,則編碼後會變成2倍大.
3.加命令格式HEAD在資料前面.
4.checksum
5.傳送資料大小
6.前後各加2個bytes的0xff
7.傳送. 五.接收資料處理步驟
1.當收到資料有兩個0xff連在一起,取出中間的資料.
2.檢查資料大小
3.檢查checksum.
4.檢查命令是否合乎規定.
5.將HEAD之後的資料 解碼 0xffoxff 轉成 0xff
6.解碼則為傳送過來的資料. 六.反正就是大工程,加油.
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |