奇偶校驗你會用嗎?

2020-12-20 電子產品世界

  在工作中調試通訊時,發現有諸多的幹擾數據出現,想想串口通訊除去外部硬體電路去除幹擾外,還可以通過軟體來濾掉幹擾數據,於是我就想到了串口通訊中的奇偶校驗。印象中,在編寫STM32F030程序初始化串口時,對其配置的時候有一個屬性是否使用奇偶檢驗。我想,只需要簡單修改一下這一個屬性,程序便大功告成了。可是結果真的是我所預料的嗎?請看下文。

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

  我們先來看一下STM32F030的串口初始化程序,程序清單如下:

  USART_InitStructure.USART_BaudRate = 115200; 波特率

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;數據位8位

  USART_InitStructure.USART_StopBits = USART_StopBits_1;停止位1位

  USART_InitStructure.USART_Parity = USART_Parity_No;奇偶校驗位無

  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;無硬體流控制

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;使能發送與接收功能

  USART_Init(USART1, &USART_InitStructure);初始化串口1

  上面這段程序沒有特別之處,廣泛示例於各大論壇,教程,而筆者也只是將上面奇偶校驗位這一行,修改為了USART_InitStructure.USART_Parity = USART_Parity_Odd;即奇校驗。然後,重新編譯,下載,一切正常。可是……

  從圖1可以清楚看到,在未修改之前,串口能正常接收到字符串,但是在修改之後,取而待之的都是亂碼。無論PC機軟體配置為奇校驗,偶檢驗,還是無奇偶校驗均無正確顯示。頓時,整個人的感覺就不好了。555……

  筆者也是藉此機會深入了解了一下奇偶校驗,與STM32F030晶片上的實現。現在將奇偶校驗認識的三大誤區及應用實現分享給大家。

  誤區一:修改一下串口配置參數就可以了嗎?

  這個誤區我覺得應該放在第一位,主要因為筆者首先就這樣認為的。通過上面的實例,也已經充分說明僅修改一個屬性是無法實現的。通過仔細閱讀編程手冊,發現在配置奇偶校驗屬性後,必須要修改數據位為9位,否則PC端無法接收。以下是筆者查詢到的資料(STM32F10xxx參考手冊):

  通過上面的截圖(圖2),我們可以看到,如果將串口配置為了奇校驗,且數據位為8位,那麼數據位的位7將被替換為奇檢驗位——也就是說,原有的數據被破壞了。這也就證明了圖1為什麼會出現亂碼的現象了。

  既然發現了錯誤,那就要解決。通過查詢相關文檔,與詳細閱讀STM32晶片編程手冊,最後通過以下配置即可實現正常發送,與奇偶校驗。程序配置清單如下:

  USART_InitStructure.USART_WordLength = USART_WordLength_9b;

  USART_InitStructure.USART_Parity = USART_Parity_Odd;

  如果將數據位數擴展成9位,那麼奇偶校驗位將佔用新插入的位8,也就不必破壞原數據。通過編譯與下載程序,並在PC機上驗證,此方法確實可行,PC機數據正常接收,再次重現」Hello EEPW」。

  誤區二:PC機串口軟體無法實現奇偶校驗發送?

  筆者在查閱資料的時候發現有好多網友都有這樣的觀念,但是筆者的PC機軟體的確是可以發送奇偶檢驗的。通過多次實驗筆者發現,SScomm串口工具軟體v3.2版本無法實現,但SScomm版本v4.2可以實現。

  雖然說是實現奇偶校驗,但是僅限發送時會發送嚴格按照配置要求發送,即會發送奇偶校驗位,從而下位機將正常接收。但是接收的時候,並不表示奇偶校驗位錯誤,上位機不會接收數據——上位機的具體實現也是這樣的。上位機不管奇偶校驗是否正確,仍然會正常顯示接收的數據,這個並不影響我們實際應用,也只是說明一下而已。

  誤區三:STM32F030配置了奇偶校驗位,就不會接收到錯誤的字節了

  很遺憾,這個也是非常大的誤區。通過在線仿真的數據抓取。STM32F030配置為奇校驗,無論上位配置了哪一項,均能正常接收到數據。但是,還是有不同的地方的。如果奇偶校驗開啟後,當發生奇偶校驗錯誤時,會觸發硬體奇偶校驗失敗事件,如果開啟了奇偶校驗失敗中斷,那麼硬體將進入奇偶校驗中斷。

  以上三個誤區筆者已經全部分析完畢,那麼下面我們將如何針對STM32F030晶片的特性來實現串口通訊奇偶校驗呢?

  在下位機軟體上,通過誤區一的分析,我們需要將下位機STM32F030的串口配置為數據位9位,奇檢驗或偶檢驗,然後開啟奇偶校驗位異常中斷。再通過奇偶校驗異常中斷中將此次接收到的數據丟棄,以實現錯誤字節的濾除。這裡要特別注意,開啟奇偶校驗中斷一定要優先配置,至少要在接收中斷開啟之前,具體原因筆者尚未能查詢到。

  至於硬體做了些什麼,硬體僅僅填充了奇偶校驗位,並提示了錯誤信息,其並不會為我們主動去除接收的數據。

  對於PC機上的串口軟體,我們並不需要設置成為數據位9位,而是必須配置成數據位8位——當然,在筆者下載的幾款串口工具軟體裡均無法配置成數據9位。相應的奇偶校驗位需要與下位機相同即可。

  經過以上的軟體配置,現在基於STM32F030晶片的通訊已經工作正常了,我的經驗也暫時總結到這裡了。

相關焦點

  • 常用校驗碼(奇偶校驗,海明校驗,CRC)學習總結
    因為在數據存取和傳送的過程中,由於元器件或者噪音的幹擾等原因會出現錯誤,這個時候我們就需要採取相應的措施,發現並糾正錯誤,對於錯誤的檢測和校正,大多採取「冗餘校驗」的思想,即除原數據外,額外增加若干位編碼,這些新增的代碼稱為校驗位。二.數據是如何校驗的?
  • 計算機常用的數據信息校驗方式—奇偶校驗、漢明校驗和CRC校驗
    但是在實際數據傳輸中,一位數據出錯的概率比同時多位出錯的概率要高,故而奇偶校驗碼的檢錯能力低,但還是在實際中廣泛應用,經常用於存儲器的讀寫檢查、ASCII字符傳輸過程檢查。奇偶校驗實現原理:在若干有效信息數據位後面,在加上一位二進位位作為校驗位,這樣組成了奇偶校驗碼。
  • 學習串口參數詳解:波特率,數據位,停止位,奇偶校驗位
    如何設置取決於你想傳送的信息。比如,標準的ASCII碼是0~127(7位)。擴展的ASCII碼是0~255(8位)。如果數據使用簡單的文本(標準 ASCII碼),那麼每個數據包使用7位數據。每個包是指一個字節,包括開始/停止位,數據位和奇偶校驗位。由於實際數據位取決於通信協議的選取,術語「包」指任何通信的情況。停止位用於表示單個包的最後一位。典型的值為1,1.5和2位。
  • 奇偶校驗碼,奇偶校驗碼原理是什麼?
    奇偶校驗碼是奇校驗碼和偶校驗碼的統稱,是一種最基本的檢錯碼。它是由n-1位信息元和1位校驗元組成,可以表示成為(n,n-1)。如果是奇校驗碼,在附加上一個校驗元以後,碼長為n的碼字中「1」的個數為奇數個;如果是偶校驗碼,在附加上一個校驗元以後,碼長為n的碼字中「1」的個數為偶數個。
  • CRC校驗你會嗎?計算、校驗、C語言實現,三步教你輕鬆搞定
    常用的校驗算法有奇偶校驗、校驗和、CRC,還有LRC、BCC等不常用的校驗算法。以串口通訊中的奇校驗為例,如果數據中1的個數為奇數,則奇校驗位0,否則為1。CRC校驗計算速度快,檢錯能力強,易於用編碼器等硬體電路實現。從檢錯的正確率與速度、成本等方面,都比奇偶校驗等校驗方式具有優勢。因而,CRC 成為計算機信息通信領域最為普遍的校驗方式。常見應用有乙太網/USB通信,壓縮解壓,視頻編碼,圖像存儲,磁碟讀寫等。
  • 數據校驗及常用校驗算法概述
    2、簡單粗暴地奇偶校驗 最簡單粗暴的方法就是「奇偶校驗」了,即在傳輸字符的各位之外,再傳送一位奇/偶校驗位。可採用的策略分為奇校驗和偶校驗。2.1 奇校驗所有傳送的位數(含字符的個數位和校驗位)中,「1」的個數為奇數,如1 0110,0101;0 0110,0001。
  • CRC 循環冗餘校驗算法
    原理CRC校驗(循環冗餘校驗)是數據通訊中最常採用的校驗方式。在嵌入式軟體開發中,經常要用到CRC 算法對各種數據進行校驗。奇偶校驗奇偶校驗是CRC 校驗的一種(CRC-1)。RS232串行通訊可以設置奇偶校驗位,所謂奇偶校驗就是在發送的每一個字節後都加上一位,使得每個字節中1的個數為奇數個或偶數個。比如我們要發送的字節是0x1a,二進位表示為0001 1010。接收方通過計算數據中1個數是否滿足奇偶性來確定數據是否有錯。奇偶校驗的缺點也很明顯,首先,它對錯誤的檢測概率大約只有50%。也就是只有一半的錯誤它能夠檢測出來。
  • 常用的CRC 循環冗餘校驗算法
    原理CRC校驗(循環冗餘校驗)是數據通訊中最常採用的校驗方式。在嵌入式軟體開發中,經常要用到CRC 算法對各種數據進行校驗。奇偶校驗奇偶校驗是CRC 校驗的一種(CRC-1)。RS232串行通訊可以設置奇偶校驗位,所謂奇偶校驗就是在發送的每一個字節後都加上一位,使得每個字節中1的個數為奇數個或偶數個。
  • 4種常見的校驗算法
    UART有一個奇偶校驗,CAN通信有CRC校驗。Modbus、MAVlink、USB等通信協議也有校驗信息。
  • 累加和校驗
    上節我們講過奇偶校驗,只要數據中的0或1到達按規定的奇或偶校驗相同那麼我們則認為數據正確,但若數據被人修改,則很難找到出錯的數據。
  • 幾種常見的校驗算法
    UART有一個奇偶校驗,CAN通信有CRC校驗。Modbus、MAVlink、USB等通信協議也有校驗信息。
  • 嵌入式程式設計師的循環冗餘校驗(CRC)算法最簡單入門
    得到的餘數作為校驗數據附加到原數據後面。還以上面例子中的數據為例:6、23、4 可以看做一個2進位數: 0000011000010111 00000010假如被除數選9,二進位表示為:1001則除法運算可以表示為:可以看到,最後的餘數為1。
  • 宇宙微波背景輻射可能違反奇偶對稱性,新的物理學呼之欲出
    這時候的宇宙是不透明的,因為光子會和自由電子進行耦合,光無法透射出來。隨著宇宙的膨脹,溫度慢慢下降、能量也慢慢降低,電子最終被原子核捕獲,這時候它透出了宇宙的第一縷光線。137億年之後,這些光被空間膨脹所拉長,成了遍布所有空間中的宇宙微波背景輻射。但是,最近的一項研究顯示,科學家在微波背景輻射身上發現了特殊的東西。
  • 奇偶項數列
    解題過程中,通常要採用奇偶分析法,即對腳標的奇偶分類討論.實慄分析:隔項等差數列看2014年全國高考卷的一道數列題.從(1)問的結論中,我們能判斷數列為等差嗎?顯然不能,因為等差數列要求後項減去前項是同一個常數,而上式中兩項的腳標相差2.
  • 常見image格式(hex/s19)如何校驗?且看Checksum
    今天痞子衡給大家講的是嵌入式裡數據差錯控制技術-和校驗。  在系列前一篇文章裡,痞子衡給大家介紹了比較簡單的校驗法-奇偶校驗,該校驗法主要是針對byte傳輸校驗而言,而在實際應用中我們不僅要保證byte的完整性,還需要校驗由多個byte組成的數據包packet的完整性。今天痞子衡繼續給大家介紹針對packet校驗的最簡單的校驗法-即和校驗法。
  • CRC循環冗餘校驗
    關於CRC循環冗餘校驗的一些知識主要內容:1、了解CRC2、CRC多項式3、模2運算4、CRC值的計算1.介紹循環冗餘校驗(英語:Cyclic redundancy check,通稱「CRC」)是一種根據網絡數據包或計算機文件等數據產生簡短固定位數校驗碼的一種散列函數,主要用來檢測或校驗數據傳輸或者保存後可能出現的錯誤。
  • 只知道RAID 0你就out了 帶你了解12345
    等一會,RAID 0後面的這個數字0是什麼意思,除了0還有12345嗎?這次就為大家講解一下這個012345的故事。  RAID是(redundant array of independent disks)也就是冗餘磁碟陣列的縮寫,記住是RAID,什麼radio什麼都是錯誤的寫法,RAID 0就是將數據均勻的分配到所有的磁碟上進行讀寫。
  • 只知道RAID0你就out了帶你了解12345
    等一會,RAID 0後面的這個數字0是什麼意思,除了0還有12345嗎?這次就為大家講解一下這個012345的故事。RAID是(redundant array of independent disks)也就是冗餘磁碟陣列的縮寫,記住是RAID,什麼radio什麼都是錯誤的寫法,RAID 0就是將數據均勻的分配到所有的磁碟上進行讀寫。
  • [公益時報]福彩七樂彩投注技巧:用奇偶掃蕩獎號
    關注前5-10期的第一位獎號,根據第一位獎號偶數與奇數的轉換走勢,去推斷下期第一位獎號是奇數還是偶數,例如,第2007144-2007153期的第一位獎號是:04-01-07-02-01-02-09-05-07-02,也就是:偶-奇-奇-偶-奇-偶-奇-奇-奇-偶,這樣就可以根據第一位獎號的奇偶走勢來判斷下期獎號的奇、偶。