串口作为单片机开发中重要的调试通道和通信手段,在单片机开发中出现频次很高。但最近在用串口时,发现一个以前没有意识到的参数配置问题。

一直以为串口接收两端的配置一样,就可以正确的通信,并在此之前一直没有碰到问题,所以一直没有深入去了解过串口。

串口配置选项

1、波特率:每秒传输的符号数
2、数据位:每个帧中有效数据的位数
3、校验位:检测单比特错误,可选无校验、奇校验、偶校验等
4、停止位:帧结束标志,固定为高电平
以上是串口使用中需要配置的选项,当然还有其他的,但这是我的问题只涉及上述参数。
帧格式

起始位 数据位 校验位 停止位

现象:
使用串口传输数据,程序配置为:

huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_EVEN ;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

上述配置:波特率:115200、字长:8位、停止位:1位、奇偶校验:偶校验

这个串口配置之前一直传输数据,

uint8_t aTxEndMessage[] = "\n\r Example Finished\n\r";


HAL_UART_Transmit(&huart1, (uint8_t*)&aTxEndMessage,TXENDMESSAGESIZE, 100);

能够成功接收到数据:可以看出接收到的数据和发送的数据一致,没有问题。

问题现象

但是

我突然有一个需求,串口不发送字符串,而是希望在接收端接收16进制数

我需要发送数据:0xAA,

uint8_t U_test = 0XAA;


HAL_UART_Transmit(&huart1, (uint8_t*)&U_test, 1, 100);

但接收到的是:0x2A在这里插入图片描述这个串口配置没有改变,但接收到的数据和我发送的完全不一样。

原因

上面设置了字长为:8位,加上偶校验,所以数据位设置为了7位。

0xAA 10101010
0x2A 00101010

发现两者只有最高位不一样,所以原因就是:开启校验位后,硬件需要占用1位作为校验位,硬件将“8位字长”解释为“7位数据 + 1位校验位”,
硬件只去数据的低7位:0101010。

虽然这种配置不会影响字符串的接收,但在需要收发自己配置的格式帧的时候,这个串口配置方法就会影响数据的传输。

如果在传输数据帧时,想开启奇偶校验来传输16进制数,可以使用9位字长。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐