串口参数设置解析
串口作为单片机开发中重要的调试通道和通信手段,在单片机开发中出现频次很高。但最近在用串口时,发现一个以前没有意识到的参数配置问题。一直以为串口接收两端的配置一样,就可以正确的通信,并在此之前一直没有碰到问题,所以一直没有深入去了解过串口。
串口作为单片机开发中重要的调试通道和通信手段,在单片机开发中出现频次很高。但最近在用串口时,发现一个以前没有意识到的参数配置问题。
一直以为串口接收两端的配置一样,就可以正确的通信,并在此之前一直没有碰到问题,所以一直没有深入去了解过串口。
串口配置选项
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位字长。
更多推荐



所有评论(0)