串口通信是指通过串行接口进行数据传输的一种通信方式。串口通信原理如下:
-
串口硬件连接:串口通信需要将数据线和控制线连接到两个设备之间的串行接口。通常,串口包括两个数据线(发送线和接收线)和多个控制线(如时钟线、使能线、数据位线、校验位线和停止位线)。
-
串口通信协议:在串口通信中,通常需要使用一种特定的通信协议,如RS-232、RS-485、UART等。这些协议规定了数据的传输格式、时钟速率、数据位数、校验方式等。
-
数据传输过程:在串口通信中,数据是以数据包的形式传输的。发送方首先将数据包按照通信协议的规定格式封装,并通过发送线发送给接收方。接收方则通过接收线接收数据包,并解析数据包中的数据。在传输过程中,发送方和接收方需要保持一致的通信协议和参数设置。
-
错误校验:为了保证数据的传输准确性,通常会在数据包中添加一些校验位,如奇偶校验位、循环冗余校验(CRC)等。接收方在接收到数据包后会验证校验位,如果校验错误,则表示数据包有误,需要重新传输。
-
通信控制:串口通信中,通常需要一种通信控制方式来确保发送方和接收方的数据传输同步。常见的通信控制方式有硬件握手和软件握手。硬件握手是通过控制线来进行数据传输的控制,而软件握手则是通过发送特定的控制字符来进行控制。
总的来说,串口通信通过串行接口进行数据传输,需要一种通信协议进行数据的封装和解析,同时通过校验和通信控制来保证数据的准确传输。
接下来,我们配置UART
选择USART1,设置mode 为Asynchronous(异步通信),Baud Rate(波特率)为9600(根据题目设置,我一般为9600.)
选择串口中断(给大家一个建议,如果程序中有多个中断,我们最好把串口中断优先级设置最高,避免误识别),接下来就生成文件。
介绍三个函数:
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)接收字符串;
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)发送字符串
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)打开接收的串口中断。
在UART.c文件添加下面代码重定义printf,这样发送信息可用printf
/* USER CODE BEGIN 1 */
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/* USER CODE END 1 */
在main.c中:
/* USER CODE BEGIN 0 */
char UART_Res[15];
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)UART_Res, 15);//15是字符串长度
/* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
printf("%s",UART_Res);
HAL_UART_Receive_IT(&huart1, (uint8_t *)UART_Res, 15);//20ÊǶ¨ÒåÊÕÈ¡µÄ×Ö·ûÊýÁ¿
}
/* USER CODE END 4 */
字符串长度根据题目而定,以第五届字符串为例