怎么编写一个函数 可以接收到无论什么类型的数据在USART1发送通过串口助手打印出来

STM32F103 怎么编写一个函数 可以接收到无论什么类型的数据在USART1发送通过串口助手打印出来

源代码:
#include “usart.h”

/* USER CODE BEGIN 0 */
#include <string.h>
UART_HANDLE hdl_uart1;
UART_HANDLE hdl_uart2;
UART_HANDLE hdl_uart3;
UART_HANDLE hdl_uart4;

/* USER CODE END 0 */

UART_HandleTypeDef huart4;
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3;

/* USART1 init function */

void MX_USART1_UART_Init(void)
{

huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
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;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler(“UART_Init(&huart1) error. \n”);
}

/* USER CODE BEGIN 0 */

hdl_uart1.huart = &huart1;
strcpy ( hdl_uart1.ID_str, “UART1”);

hdl_uart1.tx_ready = SET;
hdl_uart1.tx_buf.len = 0;
hdl_uart1.tx_data.len = 0;
hdl_uart1.tx_data.msg[0] = NULL;

hdl_uart1.rx_ready = SET;
hdl_uart1.rx_buf.len = MAX_RECEIVE_LEN;
hdl_uart1.rx_data.len = 0;

if(HAL_UART_Receive_IT(&huart1, hdl_uart1.rx_buf.msg, hdl_uart1.rx_buf.len) == HAL_OK) //启动接收中断
{
hdl_uart1.rx_ready = RESET;
}

/* USER CODE END 0 */

}

/* USART2 init function */

void MX_USART2_UART_Init(void)
{

huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler(“UART_Init(&huart2) error. \n”);
}

/* USER CODE BEGIN 0 */

hdl_uart2.huart = &huart2;
strcpy ( hdl_uart2.ID_str, “UART2”);

hdl_uart2.tx_ready = SET;
hdl_uart2.tx_buf.len = 0;
hdl_uart2.tx_data.len = 0;
hdl_uart2.tx_data.msg[0] = NULL;

hdl_uart2.rx_ready = SET;
hdl_uart2.rx_buf.len = MAX_RECEIVE_LEN;
hdl_uart2.rx_data.len = 0;

/*
if(HAL_UART_Receive_IT(&huart2, hdl_uart2.rx_buf.msg, hdl_uart2.rx_buf.len) == HAL_OK) //启动接收中断
{
hdl_uart2.rx_ready = RESET;
}
*/

/* USER CODE END 0 */

}
/* USART3 init function */

void MX_USART3_UART_Init(void)
{

huart3.Instance = USART3;
huart3.Init.BaudRate = 115200;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart3) != HAL_OK)
{
Error_Handler(“UART_Init(&huart3) error. \n”);
}
/* USER CODE BEGIN 0 */

hdl_uart3.huart = &huart3;
strcpy ( hdl_uart3.ID_str, “UART3”);

hdl_uart3.tx_ready = SET;
hdl_uart3.tx_buf.len = 0;
hdl_uart3.tx_data.len = 0;
hdl_uart3.tx_data.msg[0] = NULL;

hdl_uart3.rx_ready = SET;
hdl_uart3.rx_buf.len = MAX_RECEIVE_LEN;
hdl_uart3.rx_data.len = 0;
/*
if(HAL_UART_Receive_IT(&huart3, hdl_uart3.rx_buf.msg, hdl_uart3.rx_buf.len) == HAL_OK) //启动接收中断
{
hdl_uart3.rx_ready = RESET;
}
/
/
USER CODE END 0 */

}

/* UART4 init function */
void MX_UART4_Init(void)
{

huart4.Instance = UART4;
huart4.Init.BaudRate = 9600;
huart4.Init.WordLength = UART_WORDLENGTH_8B;
huart4.Init.StopBits = UART_STOPBITS_1;
huart4.Init.Parity = UART_PARITY_NONE;
huart4.Init.Mode = UART_MODE_TX_RX;
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart4.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart4) != HAL_OK)
{
Error_Handler(“UART_Init(&huart4) error. \n”);
}

}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance==UART4)
{
/* USER CODE BEGIN UART4_MspInit 0 */

/* USER CODE END UART4_MspInit 0 /
/
UART4 clock enable */
__HAL_RCC_UART4_CLK_ENABLE();

__HAL_RCC_GPIOC_CLK_ENABLE();
/**UART4 GPIO Configuration    
PC10     ------> UART4_TX
PC11     ------> UART4_RX 
*/
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

/* UART4 interrupt Init */
HAL_NVIC_SetPriority(UART4_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(UART4_IRQn);

/* USER CODE BEGIN UART4_MspInit 1 */

/* USER CODE END UART4_MspInit 1 /
}
else if(uartHandle->Instance==USART1)
{
/
USER CODE BEGIN USART1_MspInit 0 */

/* USER CODE END USART1_MspInit 0 /
/
USART1 clock enable */
__HAL_RCC_USART1_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 GPIO Configuration    
PA9     ------> USART1_TX
PA10     ------> USART1_RX 
*/
GPIO_InitStruct.Pin = UART1_TX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(UART1_TX_GPIO_Port, &GPIO_InitStruct);

GPIO_InitStruct.Pin = UART1_RX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(UART1_RX_GPIO_Port, &GPIO_InitStruct);

/* USART1 interrupt Init */
HAL_NVIC_SetPriority(USART1_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);

/* USER CODE BEGIN USART1_MspInit 1 */

/* USER CODE END USART1_MspInit 1 /
}
else if(uartHandle->Instance==USART2)
{
/
USER CODE BEGIN USART2_MspInit 0 */

/* USER CODE END USART2_MspInit 0 /
/
USART2 clock enable */
__HAL_RCC_USART2_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART2 GPIO Configuration    
PA2     ------> USART2_TX
PA3     ------> USART2_RX 
*/
GPIO_InitStruct.Pin = UART2_TX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(UART2_TX_GPIO_Port, &GPIO_InitStruct);

GPIO_InitStruct.Pin = UART2_RX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(UART2_RX_GPIO_Port, &GPIO_InitStruct);

/* USART2 interrupt Init */
HAL_NVIC_SetPriority(USART2_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(USART2_IRQn);

/* USER CODE BEGIN USART2_MspInit 1 */

/* USER CODE END USART2_MspInit 1 /
}
else if(uartHandle->Instance==USART3)
{
/
USER CODE BEGIN USART3_MspInit 0 */

/* USER CODE END USART3_MspInit 0 /
/
USART3 clock enable */
__HAL_RCC_USART3_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();
/**USART3 GPIO Configuration    
PB10     ------> USART3_TX
PB11     ------> USART3_RX 
*/
GPIO_InitStruct.Pin = UART3_TX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(UART3_TX_GPIO_Port, &GPIO_InitStruct);

GPIO_InitStruct.Pin = UART3_TXB11_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(UART3_TXB11_GPIO_Port, &GPIO_InitStruct);

/* USART3 interrupt Init */
HAL_NVIC_SetPriority(USART3_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(USART3_IRQn);

/* USER CODE BEGIN USART3_MspInit 1 */

/* USER CODE END USART3_MspInit 1 */
}
}

void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{

if(uartHandle->Instance==UART4)
{
/* USER CODE BEGIN UART4_MspDeInit 0 */

/* USER CODE END UART4_MspDeInit 0 /
/
Peripheral clock disable */
__HAL_RCC_UART4_CLK_DISABLE();

/**UART4 GPIO Configuration    
PC10     ------> UART4_TX
PC11     ------> UART4_RX 
*/
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11);

/* UART4 interrupt Deinit */
HAL_NVIC_DisableIRQ(UART4_IRQn);

/* USER CODE BEGIN UART4_MspDeInit 1 */

/* USER CODE END UART4_MspDeInit 1 /
}
else if(uartHandle->Instance==USART1)
{
/
USER CODE BEGIN USART1_MspDeInit 0 */

/* USER CODE END USART1_MspDeInit 0 /
/
Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();

/**USART1 GPIO Configuration    
PA9     ------> USART1_TX
PA10     ------> USART1_RX 
*/
HAL_GPIO_DeInit(GPIOA, UART1_TX_Pin|UART1_RX_Pin);

/* USART1 interrupt Deinit */
HAL_NVIC_DisableIRQ(USART1_IRQn);

/* USER CODE BEGIN USART1_MspDeInit 1 */

/* USER CODE END USART1_MspDeInit 1 /
}
else if(uartHandle->Instance==USART2)
{
/
USER CODE BEGIN USART2_MspDeInit 0 */

/* USER CODE END USART2_MspDeInit 0 /
/
Peripheral clock disable */
__HAL_RCC_USART2_CLK_DISABLE();

/**USART2 GPIO Configuration    
PA2     ------> USART2_TX
PA3     ------> USART2_RX 
*/
HAL_GPIO_DeInit(GPIOA, UART2_TX_Pin|UART2_RX_Pin);

/* USART2 interrupt Deinit */
HAL_NVIC_DisableIRQ(USART2_IRQn);

/* USER CODE BEGIN USART2_MspDeInit 1 */

/* USER CODE END USART2_MspDeInit 1 /
}
else if(uartHandle->Instance==USART3)
{
/
USER CODE BEGIN USART3_MspDeInit 0 */

/* USER CODE END USART3_MspDeInit 0 /
/
Peripheral clock disable */
__HAL_RCC_USART3_CLK_DISABLE();

/**USART3 GPIO Configuration    
PB10     ------> USART3_TX
PB11     ------> USART3_RX 
*/
HAL_GPIO_DeInit(GPIOB, UART3_TX_Pin|UART3_TXB11_Pin);

/* USART3 interrupt Deinit */
HAL_NVIC_DisableIRQ(USART3_IRQn);

/* USER CODE BEGIN USART3_MspDeInit 1 */

/* USER CODE END USART3_MspDeInit 1 */
}
}

/* USER CODE BEGIN 1 */

void UART_tx(UART_HANDLE *hdl)
{
//UART1 send data
if( hdl->tx_ready == SET ) //发送空闲时,复制发送数据到发送缓存区
{
if (hdl->tx_data.len) //有发送数据
{
hdl->tx_buf.len = hdl->tx_data.len;
memcpy(hdl->tx_buf.msg, hdl->tx_data.msg,hdl->tx_data.len);
hdl->tx_data.len = 0; //清tx_data
hdl->tx_data.msg[0] = NULL;

  if(HAL_UART_Transmit_IT(hdl->huart, hdl->tx_buf.msg, hdl->tx_buf.len)== HAL_OK)  
  {
     hdl->tx_ready = RESET;
  }
}

}

}

void UART_rx( UART_HANDLE *hdl )
{

if ( hdl->rx_ready == SET ) //接收缓冲区满
{
print_str ( hdl->ID_str );
print_str ( " receive buffer full.\n");

if(HAL_UART_Receive_IT( hdl->huart, hdl->rx_buf.msg, hdl->rx_buf.len) == HAL_OK) //重启接收中断 
{
  hdl->rx_ready = RESET;
}

}
else //接收缓冲区未满
{
if ( hdl->huart->RxXferSize > hdl->huart->RxXferCount ) //有接收字符: 转移接收数据
{
/* 转移接收数据过程中,禁止接收中断 */
__HAL_UART_DISABLE_IT( hdl->huart, UART_IT_RXNE);

  for (int i=0; i< (hdl->huart->RxXferSize - hdl->huart->RxXferCount); i++)
  {
    hdl->rx_data.msg[hdl->rx_data.len++] = hdl->rx_buf.msg[i];
  }  
  
  //重置接收缓冲区  
  hdl->huart->pRxBuffPtr  = hdl->rx_buf.msg;
  hdl->huart->RxXferCount = hdl->rx_buf.len;
    
    /* 重启接收中断 */
  __HAL_UART_ENABLE_IT( hdl->huart, UART_IT_RXNE);

 //处理接收数据
  if ( hdl->rx_data.len > (MAX_RECEIVE_LEN - 128) )
  {
    hdl->rx_data.len = 0;
    print_str ( hdl->ID_str );
    print_str(" receive data overflow.\n");
  }  

  //only for test
  hdl->rx_data.msg[hdl->rx_data.len] = NULL;  //补充字符串结束符
  print_str ((char *)hdl->rx_data.msg);
  hdl->rx_data.len = 0;
}

}

}

/**

  • @brief Tx Transfer completed callback
  • @param UartHandle: UART handle.
  • @note This example shows a simple way to report end of IT Tx transfer, and
  •     you can add your own implementation. 
    
  • @retval None
    */
    void HAL_UART_TxCpltCallback(UART_HandleTypeDef UartHandle)
    {
    /
    Set transmission flag: transfer complete */

if(UartHandle->InstanceUSART1)
hdl_uart1.tx_ready = SET;
else if(UartHandle->Instance
USART2)
hdl_uart2.tx_ready = SET;
else if(UartHandle->InstanceUSART3)
hdl_uart3.tx_ready = SET;
else if(UartHandle->Instance
UART4)
hdl_uart4.tx_ready = SET;

}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef UartHandle)
{
/
Set transmission flag: transfer complete */
if(UartHandle->InstanceUSART1)
hdl_uart1.rx_ready = SET;
else if(UartHandle->Instance
USART2)
hdl_uart2.rx_ready = SET;
else if(UartHandle->InstanceUSART3)
hdl_uart3.rx_ready = SET;
else if(UartHandle->Instance
UART4)
hdl_uart4.rx_ready = SET;
}

void UART_send(void)
{
UART_tx(&hdl_uart1);
//UART_tx(&hdl_uart3);
}

void UART_receive(void)
{

UART_rx( &hdl_uart1 );
//UART_rx( &hdl_uart3 );

}

#define DEBUG_UART1

#ifdef DEBUG_UART1
void print_str(char *str) //通过UART1口输出字符串,NULL为结束符
{
char *p_msg = (char *) hdl_uart1.tx_data.msg;

hdl_uart1.tx_data.msg[hdl_uart1.tx_data.len] =NULL; //将tx_data按字符串处理

strcat(p_msg, str);
if ( strlen(p_msg) > (MAX_PRINT_LEN - 128) ) //溢出处理
{
strcpy(p_msg, “UART1 Print buffer overflow.\n”) ;
}

hdl_uart1.tx_data.len = strlen(p_msg);
}
#else
void print_str(char *str) //通过UART1口输出字符串,NULL为结束符
{
char *p_msg = (char *) hdl_uart3.tx_data.msg;

hdl_uart3.tx_data.msg[hdl_uart3.tx_data.len] =NULL; //将tx_data按字符串处理

strcat(p_msg, str);
if ( strlen(p_msg) > (MAX_PRINT_LEN - 128) ) //溢出处理
{
strcpy(p_msg, “UART3 Print buffer overflow.\n”) ;
}

hdl_uart3.tx_data.len = strlen(p_msg);
}
#endif

怎么修该debug1串口1函数 可以让我将接收到的数据无论什么类型都能通过串口1打印出来? 现在只能是打印字符串 遇到0数据会出错,并且现在这个函数我也可以调用它把我想输出的东西通过串口1输出

猜你喜欢

转载自blog.csdn.net/weiwei_lol/article/details/103425397