XModem協議介紹【轉 + 改造】


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 
版權聲明:本文為原博主原創文章,本文僅進行小量改變,轉載請附上博文鏈接;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM