串口使用校验位

本文介绍了在串口通信中启用校验位后,如何进行初始化设置。通常采用8N1模式,但启用校验位后,字长会增加一位,需要注意这一变化。在实际操作中,作者通过网友的帮助解决了问题,详细讨论见外部链接。

平时都用的8N1的模式,这次使用了校验位,因此串口的初始化工作需要改变

#ifdef RT_USING_UART2
	USART_InitStructure.USART_BaudRate = 9600;
	USART_InitStructure.USART_WordLength = USART_WordLength_9b;
	USART_InitStructure.USART_StopBits = USART_StopBits_2;
	USART_InitStructure.USART_Parity = USART_Parity_Even;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
	USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
	USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
	USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
	USART_Init(USART2, &USART_InitStructure);
	USART_ClockInit(USART2, &USART_ClockInitStructure);

	/* register uart2 */
	rt_hw_serial_register(&uart2_device, "uart2",
		RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM,
		&uart2);

	/* Enable USART2 DMA Rx request */
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
#endif

这里最重要的是
USART_WordLength_9b

这个字段意思是字的长度,没有校验位的时候是8位,有了之后要加一位。因此,这不代表数据的长度……真坑

还要多些网友的帮助,详见

http://www.rt-thread.org/phpBB3/viewtopic.php?f=2&t=2960&p=16419#p16419

<think>好的,用户问的是串口奇偶校验位。首先,我需要回忆串口通信的基本概念。串口通信中,数据帧的结构通常包括起始位、数据位、校验位和停止位。校验位的作用是检测传输过程中的错误。 接下来,奇偶校验位具体是怎么工作的呢?奇偶校验有两种类型:奇校验和偶校验。发送端会根据数据位中1的个数来决定校验位的值。例如,如果是奇校验,数据位加上校验位后,1的总数应该是奇数。如果实际传输中因为干扰导致1的个数不符合预期,接收端就能发现错误。 但用户可能想知道更详细的内容,比如奇偶校验的应用场景和局限性。这时候需要说明,奇偶校验只能检测单数位的错误,如果同时有两位出错,就无法检测到了。因此,在要求高可靠性的场合,可能需要更复杂的校验方法,如CRC或海明码。 另外,用户可能对如何配置串口的奇偶校验位感兴趣。在编程时,设置奇偶校验通常涉及配置相应的寄存器或使用库函数,选择奇校验、偶校验或无校验。这部分可能需要具体例子,比如在C语言中使用termios库设置串口参数。 还要考虑用户可能的误区,比如认为奇偶校验可以纠正错误,但实际上它只能检测错误,不能纠正。接收端检测到错误后,通常会丢弃该数据帧,可能需要重传机制。 最后,总结一下奇偶校验位的优缺点,帮助用户全面理解其适用情况。确保回答结构清晰,分点说明,使用例子来增强理解,同时提醒注意事项,如多位错误的情况和更高可靠性的需求。</think>好的,我来逐步解释串口通信中的奇偶校验位: --- ### 一、基本概念 **奇偶校验位**是串口通信数据帧中的一个附加位,用于检测数据传输过程中是否发生**单比特错误**。其原理是通过统计数据位中"1"的个数,强制使整个数据(数据位+校验位)中"1"的个数满足奇偶性规则。 --- ### 二、数据帧结构 典型串口数据帧格式(以8N1为例): $$ \text{起始位} \quad \underbrace{D_0\ D_1\ D_2\ D_3\ D_4\ D_5\ D_6\ D_7}_{\text{数据位(8位)}} \quad \overbrace{P}^{\text{校验位}} \quad \text{停止位} $$ --- ### 三、校验类型 1. **奇校验 (Odd Parity)** - 规则:数据位+校验位中"1"的总数为奇数 - 例:数据位`1011001`(4个"1")→ 需要补1个"1" → 校验位=`1` 2. **偶校验 (Even Parity)** - 规则:数据位+校验位中"1"的总数为偶数 - 例:数据位`1011001`(4个"1")→ 需要补0个"1" → 校验位=`0` 3. **无校验 (No Parity)** - 不添加校验位 --- ### 四、工作流程 1. **发送端**: - 计算数据位中"1"的数量 - 根据校验类型设置校验位值 2. **接收端**: - 重新计算接收数据的奇偶性 - 对比实际校验位与计算值 - 若不一致则标记校验错误 --- ### 五、优缺点分析 **优点**: - 实现简单,硬件成本低 - 能检测单比特错误和奇数个比特错误 **缺点**: - 无法检测偶数个比特错误 - 不能纠正错误,只能发现错误 - 不适用于高噪声环境 --- ### 六、应用场景 1. 低速串口通信(RS-232, UART) 2. 简单设备控制(传感器、工业PLC) 3. 对可靠性要求不高的短距离传输 --- ### 七、配置示例(C代码片段) ```c struct termios serial; tcgetattr(fd, &serial); serial.c_cflag |= PARENB; // 启用校验 serial.c_cflag &= ~PARODD; // 设置为偶校验(置位PARODD表示奇校验) tcsetattr(fd, TCSANOW, &serial); ``` --- ### 八、注意事项 1. 通信双方必须预先约定校验类型 2. 误码率较高时应配合使用CRC等高级校验 3. 在RS-485等差分信号系统中仍需校验 4. 现代高速串口(如USB)已不再使用奇偶校验 希望这个系统的解释能帮助您理解串口奇偶校验位的工作原理!如果有具体应用问题,欢迎进一步提问。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值