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

BCB & RS232 ..連續傳送檔案與依序接收

尚未結案
A120238501
一般會員


發表:3
回覆:0
積分:0
註冊:2004-04-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-28 18:00:20 IP:140.123.xxx.xxx 未訂閱
各位大大: 小弟我剛學習BCB,我在利用C Builder 與 RS-232 書中所贈送的Pcomm來做實習,裡用他的lab來做檔案傳送,目前的BaudRate=115200...我在傳送文字沒問題..我線再想要再我的傳送時能選擇5到10個.txt檔....然後按下傳送...在B電腦接收資料..然而當他接收完第一筆資料就給1.txt..同理接收完第二筆資料就給2.txt..以此類推 小弟有疑問.....怎麼判斷他已送完第一筆資料...並給一個檔名作儲存.....希望各位大大給意見..或有現成的範例供小弟使用..感恩啊^^
stanley
一般會員


發表:9
回覆:36
積分:14
註冊:2003-11-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-30 14:29:43 IP:61.219.xxx.xxx 未訂閱
你好: 有個函數  
 
BOOL ClearCommError(
    HANDLE hFile,              // handle to communications device
    LPDWORD lpErrors,  // pointer to variable to receive error codes
    LPCOMSTAT lpStat  // pointer to buffer for communications status  
);        
第三個參數可判斷input buffer的狀態
stanley
一般會員


發表:9
回覆:36
積分:14
註冊:2003-11-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-30 14:41:26 IP:61.219.xxx.xxx 未訂閱
抱歉, 筆誤 也有Output buffer的狀態
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-01 13:51:13 IP:218.160.xxx.xxx 未訂閱
這是個蠻大的問題,非三言兩語可以解決的,首先你要解決幾個問題: 一.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.解碼則為傳送過來的資料. 六.反正就是大工程,加油.
系統時間:2024-05-05 7:59:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!