技术式文章标题:家庭能源网关开发(三):JSY-MK-163串口中断发送接收

37次阅读

共计 2883 个字符,预计需要花费 8 分钟才能阅读完成。

标题:技术式文章:家庭能源网关开发(三):JSY-MK-163 串口中断发送接收

介绍

在前两篇文章中,我们介绍了如何使用 JSY-MK-163 开发家庭能源网关,并学习了如何使用串口和网络通信。在本文章中,我们将学习如何使用串口中断来发送和接收数据。

串口中断

串口中断是一种特殊的中断,它允许我们在串口数据传输过程中进行处理。当串口数据到达时,CPU 会被中断,并执行中断处理程序。在处理程序中,我们可以读取数据并进行处理,或者发送数据。

JSY-MK-163 提供了两种串口中断模式:中断模式和 DMA 模式。在中断模式下,CPU 会被中断并处理数据,在 DMA 模式下,DMA 会自动处理数据,无需 CPU 的干预。

在本文章中,我们将学习如何使用中断模式来发送和接收数据。

发送数据

发送数据通过以下步骤完成:

  1. 初始化串口中断

在初始化串口时,我们需要设置中断模式。在 JSY-MK-163 中,我们可以使用 UART_Init() 函数来初始化串口并设置中断模式。

“`c
void UART_Init(UART_TypeDef *UARTx, uint32_t BaudRate)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;

// 初始化 GPIO
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// 初始化 USART
USART_InitStruct.BaudRate = BaudRate;
USART_InitStruct.WordLength = USART_WORDLENGTH_8B;
USART_InitStruct.StopBits = USART_STOPBITS_1;
USART_InitStruct.Parity = USART_PARITY_NONE;
USART_InitStruct.HwFlowCtl = USART_HWCONTROL_NONE;
USART_InitStruct.Mode = USART_MODE_TX_RX;
HAL_USART_Init(UARTx, &USART_InitStruct);

// 使能串口中断
__HAL_UART_ENABLE_IT(UARTx, UART_IT_RXNE);

}
“`

在上面的代码中,我们初始化了 GPIOA 的 PIN9,并设置了 USART1 的初始化参数。我们还使能了串口接收中断。

  1. 发送数据

发送数据通过以下步骤完成:

a. 将数据写入发送缓冲区

c
uint8_t data[] = "Hello, world!";
HAL_UART_Transmit(&huart1, (uint8_t*)data, sizeof(data), 1000);

b. 等待发送完成

c
while(HAL_UART_GetState(&huart1) != HAL_UART_STATE_READY) {}

  1. 处理串口中断

当串口数据到达时,CPU 会被中断并执行中断处理程序。在处理程序中,我们可以读取数据并进行处理,或者发送数据。

c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
// 处理接收数据
}
}

在上面的代码中,我们定义了串口接收中断处理程序,并检查了串口实例是否为 USART1。

接收数据

接收数据通过以下步骤完成:

  1. 初始化串口中断

在初始化串口时,我们需要设置中断模式。在 JSY-MK-163 中,我们可以使用 UART_Init() 函数来初始化串口并设置中断模式。

“`c
void UART_Init(UART_TypeDef *UARTx, uint32_t BaudRate)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;

// 初始化 GPIO
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// 初始化 USART
USART_InitStruct.BaudRate = BaudRate;
USART_InitStruct.WordLength = USART_WORDLENGTH_8B;
USART_InitStruct.StopBits = USART_STOPBITS_1;
USART_InitStruct.Parity = USART_PARITY_NONE;
USART_InitStruct.HwFlowCtl = USART_HWCONTROL_NONE;
USART_InitStruct.Mode = USART_MODE_TX_RX;
HAL_USART_Init(UARTx, &USART_InitStruct);

// 使能串口中断
__HAL_UART_ENABLE_IT(UARTx, UART_IT_RXNE);

}
“`

在上面的代码中,我们初始化了 GPIOA 的 PIN9,并设置了 USART1 的初始化参数。我们还使能了串口接收中断。

  1. 接收数据

接收数据通过以下步骤完成:

a. 清除接收缓冲区

c
uint8_t data[1024];
HAL_UART_Receive(&huart1, (uint8_t*)data, sizeof(data), 1000);

b. 等待接收完成

c
while(HAL_UART_GetState(&huart1) != HAL_UART_STATE_READY) {}

  1. 处理串口中断

当串口数据到达时,CPU 会被中断并执行中断处理程序。在处理程序中,我们可以读取数据并进行处理,或者发送数据。

c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
// 处理接收数据
}
}

在上面的代码中,我们定义了串口接收中断处理程序,并检查了串口实例是否为 USART1。

总结

在本文章中,我们学习了如何使用串口中断来发送和接收数据。我们初始化了串口并设置了中断模式,并学习了如何发送和接收数据。我们还学习了如何处理串口中断。在下一篇文章中,我们将学习如何使用 DMA 模式来处理数据。

正文完
 0