共计 2883 个字符,预计需要花费 8 分钟才能阅读完成。
标题:技术式文章:家庭能源网关开发(三):JSY-MK-163 串口中断发送接收
介绍
在前两篇文章中,我们介绍了如何使用 JSY-MK-163 开发家庭能源网关,并学习了如何使用串口和网络通信。在本文章中,我们将学习如何使用串口中断来发送和接收数据。
串口中断
串口中断是一种特殊的中断,它允许我们在串口数据传输过程中进行处理。当串口数据到达时,CPU 会被中断,并执行中断处理程序。在处理程序中,我们可以读取数据并进行处理,或者发送数据。
JSY-MK-163 提供了两种串口中断模式:中断模式和 DMA 模式。在中断模式下,CPU 会被中断并处理数据,在 DMA 模式下,DMA 会自动处理数据,无需 CPU 的干预。
在本文章中,我们将学习如何使用中断模式来发送和接收数据。
发送数据
发送数据通过以下步骤完成:
- 初始化串口中断
在初始化串口时,我们需要设置中断模式。在 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 的初始化参数。我们还使能了串口接收中断。
- 发送数据
发送数据通过以下步骤完成:
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) {}
- 处理串口中断
当串口数据到达时,CPU 会被中断并执行中断处理程序。在处理程序中,我们可以读取数据并进行处理,或者发送数据。
c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
// 处理接收数据
}
}
在上面的代码中,我们定义了串口接收中断处理程序,并检查了串口实例是否为 USART1。
接收数据
接收数据通过以下步骤完成:
- 初始化串口中断
在初始化串口时,我们需要设置中断模式。在 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 的初始化参数。我们还使能了串口接收中断。
- 接收数据
接收数据通过以下步骤完成:
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) {}
- 处理串口中断
当串口数据到达时,CPU 会被中断并执行中断处理程序。在处理程序中,我们可以读取数据并进行处理,或者发送数据。
c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
// 处理接收数据
}
}
在上面的代码中,我们定义了串口接收中断处理程序,并检查了串口实例是否为 USART1。
总结
在本文章中,我们学习了如何使用串口中断来发送和接收数据。我们初始化了串口并设置了中断模式,并学习了如何发送和接收数据。我们还学习了如何处理串口中断。在下一篇文章中,我们将学习如何使用 DMA 模式来处理数据。