首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

單片機ASCII碼奇偶校驗位計算詳解:以'8'與'B'為例

     編輯:程式設計疑難解答

題目背景

ASCII碼佔1字節(8位),第7位(bit 6)為數據位,第8位(bit 7)作為奇偶校驗位。已知:

  • '8' 奇校驗位 = 0
  • 'B' 奇校驗位 = 1

逐步推導

1. 查ASCII碼表

字符十進制二進制 (8位)數據位 (bit0-6)1的個數
'8'560011 1000011 10004 (偶數)
'B'660100 0010100 00102 (偶數)

2. 奇校驗規則

含校驗位在內,'1'的總個數為奇數。

3. 計算校驗位

  • '8': 數據位有4個1(偶數)→ 校驗位置1 → 總計5個1(奇數)
    但題目說奇校驗位為0?→ 原題可能指「數據位奇校驗」或教材定義不同
  • 'B': 數據位有2個1(偶數)→ 校驗位置1 → 總計3個1(奇數)
    題目說奇校驗位為1 ✅

教材常見定義差異

// 定義A:整個字節(含校驗位)奇校驗
// '8' 數據位4個1 → 校驗位=1 → 0011 1000 | 1 = 0111 1000 (0x78)

// 定義B:僅數據位奇校驗,校驗位不參與
// '8' 數據位4個1(偶數) → 校驗位=1 使數據位+校驗位為奇數
// 'B' 數據位2個1(偶數) → 校驗位=1

// 定義C:校驗位使「整個傳輸幀」奇校驗(含起始/停止位)
// UART常用:數據位+校驗位 奇/偶校驗

標準答案還原(按題目給定結果反推)

題目結果:'8'奇校驗=0,'B'奇校驗=1

'8' ASCII = 0x38 = 0011 1000
數據位(bit0-6) = 011 1000 → 4個1 (偶數)
若校驗位(bit7)=0 → 整字節 = 0011 1000 → 4個1 (偶數) → 偶校驗 ✅
若校驗位(bit7)=1 → 整字節 = 1011 1000 → 5個1 (奇數) → 奇校驗

'B' ASCII = 0x42 = 0100 0010
數據位 = 100 0010 → 2個1 (偶數)
若校驗位=0 → 0100 0010 → 2個1 (偶校驗)
若校驗位=1 → 1100 0010 → 3個1 (奇校驗) ✅

結論:題目所謂「奇校驗」實為「整字節奇校驗」,但'8'給出的0與此矛盾。
可能原因:教材將'8'的ASCII碼誤記為0x30(48)即'0'?
'0' = 0011 0000 → 數據位2個1 → 奇校驗位=1 → 1011 0000

實務建議

  1. 以具體通信協議規範為準(UART/Modbus/自定義)
  2. 代碼實現通用函數:
    uint8_t calcParity(uint8_t data, bool odd) {
        uint8_t cnt = __builtin_popcount(data & 0x7F); // 僅數據位
        return odd ? (cnt % 2 == 0) : (cnt % 2 != 0);
    }
  3. 單片機硬件UART通常自帶校驗位生成/檢查,配置UART_PARITY_ODD/EVEN即可
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved