單片機通信中的CRC算法原理及程序設計

2021-01-12 電子產品世界

1 引 言

本文引用地址:http://www.eepw.com.cn/article/172509.htm

  在單片機的近、遠程通信中,為了確保傳輸報文(數據和信息)的正確性和加快報文的傳輸速度,採用CRC算法。在信道上傳輸的每一個字節,通過CRC算法校驗,從參數表中獲得其校驗值,使報文無差錯地快速傳輸。

  單片機之間有/無線載波電路進行單播(點對點)通信,或通過專用程控交換機連接單片機組成的有/無線區域網進行單播或廣播(多點對多點)通信,都要實現報文的快速交換。一個最關鍵的問題就是要解決傳輸報文的誤碼問題。常用的方法是設計有效的硬體驅動電路和編制相應的監控軟體。CRC算法不需要設計專門的硬體驅動電路,而是直接依靠設計監控軟體的辦法,對報文進行快速的校驗來提高報文的傳輸速度,並保證報文的可靠傳輸。

  CRC算法能進行單個報文和分組報文傳輸的校驗;在分組報文的傳輸中,對每一個分組報文進行校驗,如果正確接收,則將此組報文存入緩衝區;否則記下此分組報文的組號,等所有的分組報文傳輸完後,再統計接收失敗的組數,將失敗的分組報文的組號傳輸到發送端的單片機,請求重發失敗的分組報文。報文全部接收正確後,在緩衝區中合併所有的分組,形成一個完整的報文,傳輸給接收端的單片機,這樣就能減少傳輸的時間,提高系統的可靠性。

  2 CRC算法的原理

  國際電報電話諮詢委員會推薦的CRC—CCITT生成多項式(G(x))有多種,這裡選取約定的生成多項式G(x)=x16+x12+x5+1 來製造CRC校驗的參數表。CRC約定的校驗規則是:讓需要校驗的報文代碼(M(x))能為G(x)除盡。如果除得盡,表明代碼正確;如果除不盡,餘數(R(x))將指明出錯位所在的位置。在單片機的通信中,一般要在內存中開闢緩衝區存放報文代碼,涉及的單片機發送端/接收端硬體電路框圖見圖1。

  

  在發送端的單片機中,通過對傳輸報文的字節進行CRC編碼,得到一個16進位的編碼值,並將該值存放於傳輸報文的最後,一併傳輸給接收端的單片機。

  接收端單片機收到報文後,採用CRC校驗,也得到一個16進位校驗值,將該校驗值和傳輸來的編碼值進行比較,如果相等,證明傳輸無誤,向發送端發送一個接收正確的應答信號;否則接收到的報文有誤碼,並向發送端發送請求重發的應答信號,也就是ARQ方式。重發的次數由程序設計者來定,但一般最好定為3次重發。重發的次數太多,則此信道長期被佔用,影響別的單位和自身的通信;重發次數太少,在信道幹擾太大及不穩定的情況下不能正確的接收。

  3 CRC算法程序設計

  3.1 CRC算法描述

  校驗一個報文,令不同的變量存放校驗值和中間結果,依次從緩衝區中取報文的每一個字節,經過運算,就可以從參數表中獲得相應的校驗值,直到此報文被校驗完。

  

  3.2 CRC算法C語言程序清單

  CRC參數表如下:

  Const byte crcclar[512]={0x00,0x00,0x89,0x10,0x12,0x21,0x9b,0x31,0x24,0x42,0xad, 0x52,0x36,0x63,0xbf,0x73,0x48,0x84,0xc1,0x94,0x5a,0xa5,0xd3,0xb5,0x6c, 0xc6,0xe5,0xd6,0x7e,0xe7,0xf7,0xf7,0x81,0x00,0x08,0x10,0x93,0x21,0x1a, 0x31,0xa5,0x42,0x2c,0x52,0xb7,0x63,0x3e,0x73,0xc9,0x84,0x40,0x94,0xdb, 0xa5,0x52,0xb5,0xed,0xc6,0x64,0xd6,0xff,0xe7,0x76,0xf7,0x02,0x01,0x8b, 0x11,0x10,0x20,0x99,0x30,0x26,0x43,0xaf,0x53,0x34,0x62,0xbd,0 x72,0x4a,0x85,0xc3,0x95,0x58,0xa4,0xd1,0xb4,0x6e,0xc7,0xe7,0xd7,0x7c, 0xe6,0xf5,0xf6,0x83,0x01,0x0a,0x11,0x91,0x20,0x18,0x30,0 xa7,0x43,0x2e,0x53,0xb5,0x62,0x3c,0x72,0xcb,0x85,0x42,0 x95,0xd9,0xa4,0x50,0xb4,0xef,0xc7,0x66,0xd7,0 xfd,0xe6,0x74,0xf6,0x04,0x02,0x8d,0x12,0x16,0x23,0x9f,0x33,0x20,0x40, 0xa9,0x50,0x32,0x61,0xbb,0x71,0x4c,0x86,0 xc5,0x96,0x5e,0xa7,0xd7,0xb7,0x68,0xc4,0xe1,0xd4,0x7a,0xe5,0xf3,0xf5, 0x85,0x02,0x0c,0x12,0x97,0x23,0x1e,0x33,0xa1,0x40,0 x28,0x50,0xb3,0x61,0x3a,0x71,0xcd,

  0 x86,0 x44,0x96,0xdf,0xa7,0x56,0xb7,0xe9,0xc4,0x60,0xd4,0xfb,0xe5,0x72,0xf5, 0x06,0 x03,0x8f,0x13,0x14,0x22,0x9d,0x32,0x22,0x41,0xab,0x51,0x30,0x60,0xb9,0 x70,0x4e,0x87,0xc7,0x97,0x5c,0xa6,0 xd5,0xb6,0x6a,0xc5,0xe3,0xd5,0x78,  0xe4,0xf1,0xf4,0x87,0x03,0x0e,0x13, 0x95,0x22,0x1c,0x32,0xa3,0x41,0x2a,0 x51,0xb1,0x60,0x38,0x70,0xcf,0x87,0x46,0x97,0xdd,0xa6,0x54,0xb6,0xeb, 0xc5,0x62,0xd5,0xf9,0xe4,0x70,0xf4,0x08,0x04,0x81,0x14,0x1a,0x25,0 x93,0x35,0x2c,0x46,0xa5,0x56,0x3e,0x67,0xb7,0x77,0x40,0x80,0xc9,0x90, 0x52,0xa1,0xdb,0xb1,0x64,0xc2,0xed,0xd2,0x76,0xe3,0xff,0xf3,0x89,0x04, 0x00,0x14,0x9b,0x25,0x12,0x35,0xad,0x46,0x24,0x56,0xbf,0x67,0x36,0x77, 0xc1,0x80,0x48,0x90,0xd3,0xa1,0x5a,0xb1,0xe5,0xc2,0x6c,0xd2,0xf7,0xe3, 0x7e,0xf3,0x0a,0x05,0x83,0x15,0x18,0x24,0x91,0x34,0x2e,0x47,0 xa7,0x57,0x3c,0x66,0xb5,0x76,0x42,0x81,0xcb,0x91,0x50,0xa0,0 xd9,0xb0,0x66,0xc3,0xef,0xd3,0x74,0xe2,0xfd,0xf2,0x8b,0x05,0x02,0x15, 0x99,0x24,0x10,0 x34,0xaf,0x47,0x26,0x57,0xbd,0x66,0x34,0x76,0xc3,0x81,0x4a,0x91,0xd1, 0xa0,0x58,0xb0,0xe7,0xc3,0x6e,0xd3,0xf5,0xe2,0x7c,0xf2,0x0c,0x06,0x85, 0x16,0x1e,0x27,0 x97,0x37,0x28,0 x44,0xa1,0x54,0x3a,0x65,0xb3,0x75,0x44,0x82,0xcd,0x92,0x56,0xa3,0xdf, 0xb3,0 x60,0 xc0,0xe9,0xd0,0x72,0xe1,0xfb,0xf1,0x8d,0x06,0x04,0x16,0x9f,0x27,0x16, 0x37,0xa9,0x44,0 x20,0x54,0xbb,0x65,0x32,0x75,0xc5,0x82,0x4c,0x92,0xd7,0xa3,0x5e,0xb3, 0xe1,0xc0,0x68,0xd0,0 xf3,0xe1,0x7a,0xf1,0x0e,0x07,0x87,0x17,0x1c,0x26,0x95,0x36,0x2a,0x45, 0xa3,0x55,0x38,0x64,0xb1,0x74,0x46,0x83,0xcf,0x93,0x54,0xa2,0xdd,0xb2, 0x62,0xc1,0xeb,0xd1,0x70,0xe0,0xf9,0xf0,0x8f,0x07,0x06,0x17,0x9d,0x26, 0x14,0x36,0xab,0 x45,0x22,0x55,0xb9,0x64,0x30,0x74,0xc7,0x83,0x4e,0x93,0xd5,0xa2,0x5c, 0xb2,0xe3,0xc1,0x6a,0xd1,0xf1,0xe0,0x78,0xf0};

  #define BUFLEN 512  /*--緩衝區大小———*/

  #define ETB (byte)0x20 /*——報文結束符——*/

  byte crc0=0,crc1=0;  /*———字節變量———*/

  void main(void)

  { /*———根據要求編寫主程序,調用crcvalue()子程序———*/ }

  word crcvalue(byte*crcbuf) /*計算報文的CRC值,crcbuf是緩衝區*/

  { word count;

  for(crc0=crc1=0,count=1;crcbuf[count]!=ETB&&count

  <BUFLEN;count++)

  crccount(crcbuf[count]);

  if(count+4>=BUFLEN)return 0;  crccount(crcbuf[count]);

  crcbuf(++count)=crc0;crcbuf(++count)=crc1;crcbuf(++

  count)=crc0;

  crcbuf(++count)=crc1;crcbuf(++count)=crc0;crcbuf(++

  count)=crc1;

  return  ++count;  }

  viod crccount(byte crc100) /*計算一個字節的CRC值*/

  {  byte  crc10,crc11,crc20,crc21;  word crclen;

  crclen=(word)crc100; crclen=(crclen&0xff)<<1; crc10=crcclar

  [crclen++];

  crc11=crcclar[crclen++]; crc11=crc100^crc0^crc11;

  crc10=crc1 ^crc10;

  crclen=(word)crc0; crclen=(crclen&0xff)<<1; crc20=

  crcclar[crclen++];

  crc21=crcclar[crclen++]; crc0=drd^crc20; crc1=crc11^

  crc21;  }

  4 CRC算法的優缺點

  用軟體實現的CRC算法,其主要優點是突出了一個「快」字,為了提高校驗速度,把參數表和應用程式一起寫入單片機的EPROM內,當進行CRC校驗時,對需要發送的每一字節,按上述的方法進行計算,就可得到該字節的校驗值。從而提高了速度,較好地克服了異步傳輸中校驗和發送時間很不匹配的矛盾。

  CRC算法的缺點是由於要存儲512位元組的參數表,需要更多的存儲空間,但是在單片機的應用中,這種以空間換取時間的方法是值得提倡的。

  5 結束語

  CRC算法能很好地解決傳輸報文過程中的校驗問題,在8031,80C196,80188等CPU控制的單片機中,進行了大量的有/無線傳輸報文實驗,在300BPS,600BPS,1200BPS,2400BPS,4800BPS的波特率下,CRC算法都能很好地進行校驗,提高了傳輸速度。

  [參考文獻]

  [1] 白駒珩,等.單片機及其應用[M].電子科技大學出版社,1994.5.

  [2] 劉樂善,等.微型計算機接口技術及應用[M].華中理工大學出版社,1994.3.

  [3] 俸遠禎,等.計算機組成原理[M].電子工業出版社,1996.8.

  [4] Herbert Schildt.最新C語言大全[M].中科院希望高級電腦技術公司,1991.5.

相關焦點

  • CRC校驗碼在單片機中的程序實現及其冗餘碼錶的求取
    由單片機嵌入式系統與微機組成的工業檢測和數據採集系統中,計算機與單片機之間經常需要進行數據通信。在數字通信過程中,幹擾有可能使接收到的二進位數和發送的不一致,造成「0」和「1」互變的差錯。
  • CRC算法及工作原理
    CRC檢驗本文引用地址:http://www.eepw.com.cn/article/151632.htm  CRC校驗實用程序庫 在數據存儲和數據通訊領域,為了保證數據的正確,就不得不採用檢錯的手段。
  • 解讀CRC的校驗原理
    雖然差錯校驗也可以完全由硬體來承擔,但由於單片機和PC都具有很強的軟體編程能力,這就為實施軟體的差錯校驗提供了前提條件,而軟體的差錯校驗有經濟實用並且不增加硬體開銷的優點。   1 CRC法的原理   傳統的差錯檢驗法有:奇偶校驗法,校驗和法,行列冗餘校驗法等。
  • 基於RS485的組態王與單片機多機串口通信設計
    而單片機接口豐富,與A/D轉換模塊組合可以完成相同的工作,並且系統可靠、成本低。2 組態王與單片機的串口通訊方法目前,組態王與單片機的通信多是通過動態數據交換(DDE)或通過自己開發通訊驅動程序完成。DDE是Windows平臺上的一個完整的通信協 議,組態王通過該協議與其他應用程式交換數據。但不可靠和非實時。
  • 51單片機+PID算法水溫控制系統設計
    本系統設計採用基於PID算法的單片機控制來實現水溫的調控。單片機控制部分採用AT89C51單片機為核心,採用軟體編程,實現用PID算法來控制PWM波的產生,繼而控制電爐的加熱來實現溫度控制。通過編程對PID各參數的調整,來達到提高加溫速度,減小超調的目的。
  • AVR單片機CRC校驗碼的查表與直接生成
    AVR高速嵌入式單片機功能強大,在無線數據傳輸應用方面具有很大優勢。本文基於 Atmega128高速嵌入式單片機,實現32位CRC校驗碼的直接生成法和查表生成法;根據實驗結果,分析兩種方法的特點。 關鍵詞:Atmega128 CRC校驗碼 CRC生成表 數據段 引 言   隨著技術的不斷進步,各種數據通信的應用越來越廣泛。
  • 基於單片機與PC通信的數據採集控制系統設計研究
    系統的基本組成  1. 1 系統的基本架構  文中構建的基於單片機與PC 通信的數據採集控制系統基本架構如圖1 所示:    圖1:系統基本架構框圖  如圖1 所示,被控對象通過傳感器的作用,採集到相應的數據,經過電壓轉換以及模擬/數字轉換之後,向單片機發送,單片機端可以根據數據採集的情況以及預先設置的程序
  • CRC校驗原理及其實現
    ,採用一種指定的算法對原始數據進行計算,得出的一個校驗值。常用的校驗算法有奇偶校驗、校驗和、CRC,還有LRC、BCC等不常用的校驗算法。例如乙太網中使用的是CRC-32校驗,曼徹斯特編碼方式。本篇文章介紹CRC校驗的原理和實現方法。
  • 單片機紅外電路設計原理
    空調遙控器其實就是一個紅外信號發射裝置,而空調機身具有紅外接收探頭,可以接收遙控器發出的紅外信號並解析,從而實現遙控的功能,電視遙控器也是同樣的原理。現在有很多手機具有紅外功能,通過匹配通訊協議,就能實現手機遙控電視和空調的作用。下面通過硬體和軟體兩個方面來和大家分享,紅外遙控實現的原理。
  • 基於Modbus通信協議的eView觸控螢幕與51單片機的通信設計
    基於Modbus通信協議的eView觸控螢幕與51單片機的通信設計 電子工程網 發表於 2019-09-27 16:27:48 Modbus協議由於其具有開放性、透明性、成本低、易於開發等特點,已成為當今工業領域通信協議的首選
  • C8051F020單片機的RS485串行通信設計
    第二種方法的優點是通信距離較遠,速率較高,可達10 Mb/s;缺點是需要安裝通訊卡和驅動程序,並進行必要的設置。本文採用第二種方法。  2 總體架構  在某型電子設備研製中,選用美國Cygnal公司生產的一種soc型8位單片機C8051F020,對測控系統進行數據採集。該單片機是C8051F系列的F02X子系列,其性價比在工業控制領域具有較強的競爭力。
  • 6種常見的單片機數字濾波算法
    單片機主要作用是控制外圍的器件,並實現一定的通信和數據處理。但在某些特定場合,不可避免地要用到數學運算,儘管單片機並不擅長實現算法和進行複雜的運算。下面主要是介紹如何用單片機實現數字濾波。
  • PIC單片機程序設計解析
    PIC單片機採用精簡指令集,例如對於PIC16F716單片機,只有35條單字節指令。要用這麼少的指令實現複雜的控制或計算,顯然要在程序設計上多做文章,以下就程序設計需要注意的問題談一些看法。
  • Linux下ARM 和單片機的串口通信設計
    摘要:介紹Linux環境下串口通信的設計方法和步驟,並介紹了ARM9微處理器s3c2440在Linux下和C8051Fxxx系列單片機進行串行通信的設計方法,給出了硬體連接和通信程序流程圖。該方法可靠、實用,適用於大多數LinuxARM和單片機串口通信的場合。
  • 幾種常見的校驗算法
    Modbus、MAVlink、USB等通信協議也有校驗信息。 在自定義數據存儲時,有經驗的工程師都會添加一定校驗信息。 你平時通信,或者數據存儲時,你有用到校驗信息嗎?下面就介紹幾種常見的校驗算法。
  • SPI接口與CRC算法在雙DSP數據通信中的應用
    摘要:提出了一種基於DSP28335片上SPI模塊和CRC校驗算法的數據通信方案。給出了接口電路設計、SPI模塊驅動程序設計和求取CRC校驗碼的具體步驟,重點介紹了通信協議中從機發送請求機制和錯誤幀重發機制的實現,解決了SPI從機不能發起傳輸的問題,並提高了通信雙方的差錯檢測能力。實驗結果表明,該方案數據傳輸速度快,可靠性高,滿足飛控計算機的性能要求。
  • 51單片機系統與標準PC鍵盤的接口模塊設計
    概述 在單片機系統中,當輸入按鍵較多時,在硬體設計和軟體編程之間總存在著矛盾。對於不同的單片機系統需要進行專用的鍵盤硬體設計和編程調試,通用性差,使項目開發複雜化。標準PC鍵盤在工藝與技術上都已相當成熟,而且工作穩定,價格低廉。
  • CRC差錯檢驗法在PC 機與8031單片機串行通訊中的應用
    隨著數據採集系統的功能日益強大,以及微型計算機的普及,在現代工業中,利用微機進行數據通訊的工業控制應用得也越來越廣泛。特別是在大規模高精度數據採集系統中,對數據進行分析和計算將佔用很大一部分單片機的資源,可以將採集到的數據通過串行通訊方式傳送給PC機,由PC機來完成數據的處理工作。
  • 單片機中PWM的原理與控制程序
    PWM 在單片機中的應用是非常廣泛的,它的基本原理很簡單,但往往應用於不同場合上意義也不完全一樣
  • 關於CRC8/CRC16/CRC32,你要找的全部在這
    ▍CRC的實現按照前面章節的「CRC原理」來做C語言實現,就通過數據移位和異或算得。crc <<= 1u; } } } return crc;}這個代碼中有個if ((crc & 0x80u) > 0)要解釋下,因為任意數與0做異或,結果是其本身。