本發(fā)明涉及一種通過串口傳輸文件的方法及系統(tǒng)。
背景技術(shù):
對于高可靠性的應用場景,文件的傳輸不僅要保證傳輸過程中的可靠性,同時在傳輸完成后,還需要保證源文件與目標文件的一致性。目前使用串口進行文件傳輸,往往使用XMODEM協(xié)議進行。該協(xié)議采用128或1024字塊的形式傳輸數(shù)據(jù),如果需要傳輸?shù)臄?shù)據(jù)長度少于128或1024字塊,則會采用SUB字節(jié)(0x1A)填充。該機制下接收的文件總是會包含填充字節(jié),常常導致接收文件與源文件大小不一致。當需要進一步保證源文件和目標文件一致性的時候,如比對源文件與目標文件的MD5校驗碼等,則無法通過。,因此,有必要設(shè)計一種通過串口傳輸文件的方法及系統(tǒng)。
技術(shù)實現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問題是提供一種通過串口傳輸文件的方法及系統(tǒng),該通過串口傳輸文件的方法易于實施,傳輸可靠性高。
發(fā)明的技術(shù)解決方案如下:
一種通過串口傳輸文件的方法,包括以下步驟:
步驟1:文件發(fā)送步驟;
發(fā)送端通過串口向接收端發(fā)送文件數(shù)據(jù)時,還發(fā)送文件長度數(shù)據(jù);
步驟2:文件接收步驟;
接收端接收到文件數(shù)據(jù)以及文件長度數(shù)據(jù)后,根據(jù)接收到的文件長度數(shù)據(jù)截取文件數(shù)據(jù),得到最終的文件。
步驟1中,采用字塊的方式分幀傳輸文件數(shù)據(jù);
每一個字塊的總數(shù)為M;M為整數(shù),M≥64;
每一個字塊預留N個字節(jié)用于存放本幀數(shù)據(jù)中的有效數(shù)據(jù)數(shù);N為整數(shù),N≥2;
步驟2中,接收端對每一個字塊中的有效數(shù)據(jù)進行截取,再將所有字塊的有效數(shù)據(jù)按順序進行組合,形成最終的文件。
所述的預留的N個字節(jié)位于字塊的最前端或最末尾。
作為優(yōu)選,M=128或1024;N=2。如果字塊數(shù)據(jù)量大,可以預留3或4個字節(jié),甚至預留更多字節(jié);如字節(jié)長度為126,則填充0x00,0x7E,字節(jié)長度為1022,則填充0x03,0xFE。其余數(shù)據(jù)長度轉(zhuǎn)換為十六進制數(shù)據(jù)填充此兩字節(jié)即可;
發(fā)送端與接收端使用XMODEM協(xié)議進行通信。
在步驟1之前,發(fā)送端向接收端發(fā)出MD5校驗碼,在步驟2后,接收端進行MD5校驗;校驗通過則表明文件發(fā)送成功。
在步驟1中,在發(fā)送文件數(shù)據(jù)前,單獨發(fā)送文件長度數(shù)據(jù)。
在步驟1中,將標識碼與文件長度數(shù)據(jù)結(jié)合成一個文件長度字段與文件數(shù)據(jù)一并發(fā)送;所述的一并發(fā)送是指:文件長度字段位于文件數(shù)據(jù)的前端、尾端或中部。文件長度字段共占用6字節(jié),標識碼采用RS字符(0x1E),格式為“1E+文件長度(4字節(jié))+1E”。例如,發(fā)送文件長度為50000000字節(jié),文件長度字段為“1E 02 FA F0 80 1E”。
一種通過串口傳輸文件的系統(tǒng),包括發(fā)送端和接收端;發(fā)送端和接收端基于前述的方法通過串口進行文件傳輸。
本方法主要在現(xiàn)有XMODEM協(xié)議基礎(chǔ)上進行改進,發(fā)送方選取每一字塊中最后兩個有效字節(jié)填充長度字段,接收方接收到數(shù)據(jù)后,先解析出該填充字段,再根據(jù)字段截取有效字節(jié),即可過濾掉填充SUB字節(jié)(0x1A)。或者發(fā)送方在文件傳輸?shù)牡谝粋€字塊中填充文件長度字段,接收方接收到該字段后,以該長度拼接后續(xù)接收到的其余字塊數(shù)據(jù),高效截取出最后一個字塊的有效字節(jié),從而達到過濾填充SUB字節(jié)(0x1A)的作用。
有益效果:
本發(fā)明的通過串口傳輸文件的方法及系統(tǒng),該方法具有流程簡單和傳輸可靠的特點,能高效實現(xiàn)串口文件的高可靠性傳輸,既能借助原有XMODEM的串口傳輸協(xié)議保證文件傳輸過程中的可靠性,又能通過添加的協(xié)議字段過濾掉填充字節(jié),使源文件和目標文件能夠進行再一次MD5校驗,同時也為進一步的文件校驗處理提供了條件,可靠性高。
附圖說明
圖1為通過串口傳輸文件的流程圖。
具體實施方式
以下將結(jié)合附圖和具體實施例對本發(fā)明做進一步詳細說明:
實施例1:如圖1,通過串口傳輸文件的方法對應的系統(tǒng)由兩部分組成:發(fā)送端和接收端。
原xmodem協(xié)議幀結(jié)構(gòu):
改進幀結(jié)構(gòu):
發(fā)送端:
由于需要傳輸?shù)奈募赡艽嬖谄渌绦虍惒阶x寫的情況,因此發(fā)送端在文件傳輸前首先發(fā)送文件MD5碼到接收端,以便文件接收完成后進行進一步檢查校驗。避免了文件在傳輸前被改寫的情況,提高了可靠性。
文件傳輸過程中,每一幀最后兩個字節(jié)被用于傳輸數(shù)據(jù)長度,循環(huán)發(fā)送數(shù)據(jù)直至文件內(nèi)容發(fā)送完成。
發(fā)送端在進行XMODEM協(xié)議的數(shù)據(jù)字塊組合期間,由原先的選取128或1024字節(jié),更改成選取126或1022字節(jié)。對于最后一幀未滿126或1022字節(jié)的,則選取實際剩余字節(jié)數(shù)。原數(shù)據(jù)字節(jié)最后兩字節(jié)用于填充字節(jié)長度。如字節(jié)長度為126,則填充0x00,0x7E,字節(jié)長度為1022,則填充0x03,0xFE。其余數(shù)據(jù)長度轉(zhuǎn)換為十六進制數(shù)據(jù)填充此兩字節(jié)即可。
接收端:
接收端在實際接收文件內(nèi)容前,首先接收文件MD5碼并保存到本地。
文件傳輸過程中,依據(jù)XMODEM協(xié)議進行校驗和驗證,對于完整接收的每一幀數(shù)據(jù),先獲取到XMODEM協(xié)議規(guī)定的128或1024字節(jié)數(shù)據(jù)字段,再解析數(shù)據(jù)長度兩個字節(jié),根據(jù)該長度從數(shù)據(jù)字節(jié)中截取有效數(shù)據(jù),并存儲在文件中。
文件完整接收后,進行接收文件MD5碼計算,然后與接收端發(fā)送的文件MD5碼進行比對和校驗,如果完全一致,文件保留,否則予以丟棄。
一種通過串口傳輸文件的系統(tǒng),包括發(fā)送端和接收端;發(fā)送端和接收端基于前述的方法通過串口進行文件傳輸。
實施例2:
步驟1:文件發(fā)送步驟;
發(fā)送端通過串口向接收端發(fā)送文件數(shù)據(jù)時,還發(fā)送文件長度數(shù)據(jù);
步驟2:文件接收步驟;
接收端接收到文件數(shù)據(jù)以及文件長度數(shù)據(jù)后,根據(jù)接收到的文件長度數(shù)據(jù)截取文件數(shù)據(jù),得到最終的文件。
在步驟1中,在發(fā)送文件數(shù)據(jù)前,單獨發(fā)送文件長度數(shù)據(jù)。
實施例3:在步驟1中,將標識碼與文件長度數(shù)據(jù)結(jié)合成一個文件長度字段與文件數(shù)據(jù)一并發(fā)送;所述的一并發(fā)送是指:文件長度字段位于文件數(shù)據(jù)的前端、尾端或中部。如:文件長度字段共占用6字節(jié),標識碼采用RS字符(0x1E),格式為“1E+文件長度(4字節(jié))+1E”。例如,發(fā)送文件長度為50000000字節(jié),文件長度字段為“1E 02 FA F0 80 1E”。