STM32F103C8T6-串口接收数据取反
一、题目
串口(使用USART2,TX为PA2,RX为PA3),发送0x55显示在上位机串口助手上,将接收的上位机数据取反后再发送到串口助手上。(波特率9600)
二、一些知识
1. 同步通信与异步通信
- 同步通信:在同步通信中,数据的发送和接收双方需要在相同的时钟频率下工作。通常,一个设备(一般称为主设备)会产生一个连续的时钟脉冲,这个脉冲信号会通过专用的线路传送给接收设备。接收设备利用这个外部时钟信号来判断每一个数据位的采样时刻,从而实现精确的数据同步和采样。例如,SPI总线中就有一条专门的时钟线(SCLK),它就是用来同步数据传输的。
- 异步通信:在异步通信中,双方没有共同的外部时钟信号,发送方会在数据帧前加上起始位,接收方则依赖预设的波特率在接收到起始位后以这个波特率自我生成内部时钟来采样后续的数据位,直到遇到停止位为止。由于没有独立的外部时钟信号,所以数据传输中会有一定的时序偏差容忍范围。
本题属于异步通信。使用外部晶振(HSE)作为时钟源,频率误差非常低。
注:
- 0x 开头的数据一般是十六进制数据。
uint8_t
是 无符号 8 位整数,它存储的是 0 到 255 之间的数值。
2. 对数据取反
- 格式符
%x
可以自动识别输入是否带有 0x 前缀。 - 运算符
~
是按位取反操作符。
三、CubeMX 配置
打开中断
打开SWD 调试(?)
四、代码
/* USER CODE BEGIN PV */
uint8_t tx_data; uint8_t rx_data;
/* USER CODE END PV */
/* USER CODE BEGIN PFP */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ // 结束接收的回调函数
tx_data = ~rx_data;
HAL_UART_Transmit_IT(&huart2, &tx_data, 1);
HAL_UART_Receive_IT(&huart2, &rx_data, 1); // 重新启动中断接收
}
/* USER CODE END PFP */
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart2, &rx_data, 1); // 启动中断接收
/* USER CODE END 2 */
五、其他一些问题
- 2.15 没有输出,换了一块系统板有输出