为什么利用串口发送和接受字符串时,会是这样一个过程?
下面是相关代码
UART_HandleTypeDef huart1;
void MX_USART1_UART_Init(void){
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
HAL_UART_Receive_IT(&huart1, (uint8_t*)receive_buffer, 3);
}
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle){
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance == USART1){
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
}
void USART1_IRQHandler(void){
HAL_UART_IRQHandler(&huart1);
HAL_UART_Receive_IT(&huart1, (uint8_t*)receive_buffer, 3);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance == USART1){
uart_flag = 1;
}
}
int main(void){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
if(uart_flag == 1){
HAL_UART_Transmit(&huart1, (uint8_t*)receive_buffer, 3, 10);
while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) != 1);
num1 = receive_buffer[0] - 48;
num2 = receive_buffer[2] - 48;
printf("\n");
for(int i = 0; i < 10; i++){
printf("%d ", receive_buffer[i]);
}
printf("\n");
if(receive_buffer[1] == 43){
printf("result: %d\n", num1 + num2);
}
else if(receive_buffer[1] == 45){
printf("result: %d\n", num1 - num2);
}
else if(receive_buffer[1] == 42){
printf("result: %d\n", num1 * num2);
}
else{
printf("Error!\n");
}
uart_flag = 0;
}
else{
HAL_Delay(10);
}
}
}
中断服务函数怎么没有呢?这是用软件生成的?
【以下回答由 GPT 生成】
在上述代码中,USART1被配置为同时发送和接收数据。发送字符串的过程是,将要发送的字符串放入发送缓冲区(send_buffer),然后使用HAL_UART_Transmit函数发送数据。接收字符串的过程是,当USART1接收到数据时,数据将存储在接收缓冲区(receive_buffer)中。当完成接收的数据长度达到指定长度(在代码中是3)时,将触发USART1接收完成的回调函数HAL_UART_RxCpltCallback。
该函数用于初始化USART1串口的配置。配置包括波特率、字长、停止位、校验位、工作模式和硬件流控制等。在上述代码中,波特率为115200,字长为8位,停止位为1位,无校验位,工作模式为同时发送和接收数据,无硬件流控制。
该函数用于初始化USART1引脚的配置和中断。在上述代码中,首先使能USART1的时钟。然后配置GPIO引脚,将UART的Tx引脚配置为复用推挽输出模式,速度为高频率;将Rx引脚配置为输入模式,上拉模式。接着,设置USART1的中断优先级为0,并使能USART1的中断。
该函数处理USART1接收中断并重新启动接收过程。在上述代码中,首先调用HAL_UART_IRQHandler函数来处理USART1的中断。然后再次调用HAL_UART_Receive_IT函数来启动接收过程,这样可以连续不断地接收串口数据。
该函数是USART1接收完成时的回调函数。在上述代码中,当USART1接收完成时,将触发此回调函数。在回调函数中,设置uart_flag为1,表示接收完成。
在main函数中,通过while循环来处理串口数据的发送。当uart_flag等于1时,表示接收完成,可以调用HAL_UART_Transmit函数将send_buffer中的数据发送出去。发送完成之后,将uart_flag重置为0。
请参考以下代码来说明发送和接收字符串的过程: - void MX_USART1_UART_Init(void)函数初始化USART1串口的配置。 - void HAL_UART_MspInit(UART_HandleTypeDef uartHandle)函数初始化USART1引脚的配置和中断。 - USART1_IRQHandler()函数处理USART1接收中断并重新启动接收过程。 - HAL_UART_RxCpltCallback(UART_HandleTypeDef huart)函数处理USART1接收完成时的回调。 - 在main函数中,当uart_flag等于1时,调用HAL_UART_Transmit函数发送数据。
【相关推荐】