XModem協議介紹:
XModem是一種在串口通信中廣泛使用的異步文件傳輸協議,
分為XModem和1k-XModem協議兩種,前者使用128字節的數據塊,后者使用1024字節即1k字節的數據塊。
一、XModem校驗和協議
1. XModem信息包格式
XModem協議最早由Ward Christensen在20世紀70年代提出並實現的,傳輸數據單位為信息包,信息包格式如下:
2. 校驗和的計算
所有的數據字節都將參與和運算,由於校驗和只占一個字節,如果累加的和超過255將從零開始繼續累加。
3. 字段定義
<SOH> 01H
<EOT> 04H
<ACK> 06H
<NAK> 15H
<CAN> 18H
4. 校驗和方式的XModem傳輸流程
傳輸流程如圖所示:
對於發送方僅僅支持校驗和的傳輸方式,接收方應首先發送NAK信號來發起傳輸,如果發送方沒有數據發送過來,需要超時等待3秒之后再發起NAK信號來進行數據傳輸。
對於數據傳輸正確,接收方需要發送ACK信號來進行確認,如果數據傳輸有誤,則發送NAK信號,發送方在接收到NAK信號之后需要重新發起該次數據傳輸,如果數據已近傳輸完成,發送方需要發送EOT信號,來結束數據傳輸。
5. 如何取消數據傳輸
當接收方發送CAN表示無條件結束本次傳輸過程,發送方收到CAN后,無需發送EOT來確認,直接停止數據的發送。
二、XModem-CRC16協議
1. XModem-CRC16信息包格式
XModem協議在90年代做過一次修改,將132字節處的校驗和改成雙字節的CRC16校驗,CRC16校驗的信息包格式如下:
2. CRC16的計算
以后有時間再研究吧,先給出一份源代碼,來自:
http://web.mit.edu/6.115/www/miscfiles/amulet/amulet-help/xmodem.htm
int calcrc(char *ptr, int count)
{
int crc;
char i;
crc = 0;
while (--count >= 0)
{
crc = crc ^ (int) *ptr++ << 8;
i = 8;
do
{
if (crc & 0x8000)
crc = crc << 1 ^ 0x1021;
else
crc = crc << 1;
} while (--i);
}
return (crc);
}
需要注意的是,在發送方,CRC是高字節在前,低字節在后。
3. CRC16校驗的XModem傳輸流程
傳輸流程如圖所示:
和校驗和方式不同的是,當接收方要求發送方以CRC16校驗方式發送數據時以'C'來請求,發送方對此做出應答,流程就如上圖所示。
當發送方僅僅支持校驗和方式時,則接收方要發送NAK來請求,要求以校驗和方式來發送數據,
如果僅僅支持CRC16校驗方式,則只能發送'C'來請求。如果兩者都支持的話,優先發送'C'來請求,流程如圖所示:
最后,如果信息包中的數據如果不足128字節,剩余的部分要以0x1A(Ctrl-Z)來填充。
三、1k-XModem協議
1k-XModem協議同XModem-CRC16協議差不多,只是數據塊長度變成了1024字節即1k,
同時每個信息報的第一個字節的SOH變成了STX,STX定義為 <STX> 0x02,能有效的加快數據傳輸速率。
---------------------
參考原文:https://blog.csdn.net/mcgrady_tracy/article/details/14522263
版權聲明:本文為原博主原創文章,本文僅進行小量改變,轉載請附上博文鏈接;