什么是奇偶校验?

奇偶校验分为奇校验和偶校验。

在数字电路中8个连续的比特是一个字节(byte),在内存中不带“奇偶校验”的内存中的每个字节只有8位,若它的某一位存储出了错误,就会使其中存储的相应数据发生改变而导致应用程序发生错误。

而带有“奇偶校验”的内存在每一字节(8位)外又额外增加了一位用来进行错误检测。比如一个字节中存储了某一数值(1、0、1、0、1、0、1、1),把这每一位相加起来(1+0+1+0+1+0+1+1=5),5是奇数,如果采用奇校验(即一个字节(8位)加上检错的那1位共9位对应数字的和为奇数),那么检错的那一位就应该是0(5+0=5才是奇数),如果采用偶校验(即一个字节(8位)加上检错的那1位共9位对应数字的和为偶数)那么检错的那一位就应该是1(5+1=6才是偶数)当CPU返回读取存储的数据时,它会再次相加前8位中存储的数据,计算结果是否与校验位相一致。

在 Unix 和类 Unix 系统中,通过 `termios.h` 配置串口通信的奇偶校验可以通过修改 `struct termios` 结构体中的 `c_cflag` 字段来实现。奇偶校验用于检测数据传输过程中是否发生错误,常见的设置包括偶校验(Even Parity)、奇校验(Odd Parity)和无校验(No Parity)。 ### 奇偶校验的配置方法 在 `c_cflag` 中,奇偶校验的设置涉及以下标志: - **PARENB**:启用奇偶校验。 - **PARODD**:选择奇校验;如果不设置该标志,则为偶校验。 - **CSIZE**:用于清除数据位设置,以便重新配置数据位。 配置奇偶校验时,通常需要同时设置数据位为 7 位(`CS7`)或 8 位(`CS8`),并确保与奇偶校验的组合兼容。 ### 代码示例 以下是一个配置偶校验和 8 数据位的示例代码: ```c #include <termios.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> int main() { struct termios tty; int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_SYNC); if (fd < 0) { perror("Error opening serial port"); return 1; } if (tcgetattr(fd, &tty) != 0) { perror("Error from tcgetattr"); return 1; } // 设置偶校验和 8 数据位 tty.c_cflag |= PARENB; // 启用奇偶校验 tty.c_cflag &= ~PARODD; // 偶校验 tty.c_cflag &= ~CSIZE; // 清除数据位设置 tty.c_cflag |= CS8; // 设置数据位为 8 // 应用新的终端配置 if (tcsetattr(fd, TCSANOW, &tty) != 0) { perror("Error from tcsetattr"); return 1; } printf("Serial port configured with even parity and 8 data bits.\n"); close(fd); return 0; } ``` ### 其他配置选项 - **奇校验**:启用奇校验时,需要设置 `PARENB` 并启用 `PARODD`。 - **无校验**:禁用 `PARENB` 即可关闭奇偶校验。 以下是一个配置奇校验和 7 数据位的示例片段: ```c tty.c_cflag |= PARENB; // 启用奇偶校验 tty.c_cflag |= PARODD; // 奇校验 tty.c_cflag &= ~CSIZE; // 清除数据位设置 tty.c_cflag |= CS7; // 设置数据位为 7 ``` ### 注意事项 - 在配置奇偶校验之前,确保串口的波特率、数据位和停止位已正确设置。 - 奇偶校验通常用于异步串口通信,如 RS-232。 - 奇偶校验的设置应与通信对端设备保持一致,否则可能导致数据传输失败[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修车师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值