如何使用一个调试串口发送命令至另一个串口(使用调试串口控制通信模块)
如何使用一个调试串口发送命令至另一个串口(使用调试串口控制通信模块)
需求:使用调试串口发送命令至另一个串口,达到通过调试串口控制通信模组,以及回显通信模组的消息。
环境:
- 硬件环境:stm32+USB转TTL模块
- 软件环境:cubemx+keil
背景假设:这里使用BC28(NB-IoT)通信模组,模组一端连接stm32串口1,调试串口连接至串口4。stm32通过串口1发送和接收AT指令,这里需要串口4去控制串口1达到调试串口调试通信模组的目的
首先在cubemx开启串口1和串口4,配置好相同的波特率(重要)并开启中断,生成之后。我们还需要进行串口重定义,用于printf,切记一定要打开keil配置中的USB Microlib才可以使用printf。这里可以放在文件的任意一个地方。
#include "usart.h"
#include "stdio.h"
int fputc(int ch, FILE *f)
{
while((UART4->ISR & 0x40) == 0); //等待发送缓冲区空
UART4->TDR = (uint8_t)ch;
return ch;
}
接下来开启中断接收,放在main函数内部即可。
uint8_t RxBuffer_1 = 0;
uint8_t RxBuffer_2 = 0;
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
HAL_UART_Receive_IT(&huart1, &RxBuffer_1, 1);
__HAL_UART_ENABLE_IT(&huart4,UART_IT_RXNE);
HAL_UART_Receive_IT(&huart4, &RxBuffer_2, 1);
随后在stm32h7xx_hal.c中找到void USART1_IRQHandler(void)和void UART4_IRQHandler(void)这两个中断服务函数
在串口1和串口4中分别编写,当串口1产生接收中断,检查 串口1 是否有数据可读(RXNE 标志),等待串口4 的发送缓冲区准备好(TXE),将串口1RDR寄存器中的值转发给串口4中的TDR寄存器,从而将串口1的接收数据转发给串口4。同理,串口4一样。
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
{
while((UART4 -> ISR & 0x40) == 0);//0x40表示与
UART4->TDR = USART1->RDR;
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
void UART4_IRQHandler(void)
{
/* USER CODE BEGIN UART4_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart4, UART_FLAG_RXNE) != RESET)
{
while((USART1 -> ISR & 0x40) == 0);
USART1->TDR = UART4->RDR;
}
/* USER CODE END UART4_IRQn 0 */
HAL_UART_IRQHandler(&huart4);
/* USER CODE BEGIN UART4_IRQn 1 */
/* USER CODE END UART4_IRQn 1 */
}
然后再串口助手进行研究,发现可以使用调试串口进行发送命令和命令应答回显。
本文来自博客园,作者:春赏百花冬观雪,转载请注明原文链接:https://www.cnblogs.com/haoxianghuang/p/18882193

浙公网安备 33010602011771号