首先对STM32MX进行配置,先开启外部时钟。
配置时钟,具体多少M可以按自己喜欢配置(可以直接配置HCLK回车就行,没有标红就说明可以); 开启USART,波特率,IO口啥的默认就行也可以自己修改;
很重要一点,一定要开启接收中断,不然不能接收,我这里把DMA中断也开了,感觉DMA好用一点。
这里添加DMA中断就行ADD;
改一下输出配置;
生产keil代码;
先定义一下参数
uint8_t aRxBuffer[1]; //接收中断缓冲
uint8_t Uart1_RxBuff[256] = {0}; //接收缓冲
uint8_t Uart1_Rx_Cnt = 0; //接收缓冲计数
uint8_t Uart1_RxFlag = 0;
uint8_t cAlmStr[] = "数据溢出(大于256)\r\n";
uint8_t correct[] = {1,2,3,4,5,6};
发送就比较简单,直接调用函数,传入四个参数,串口号,数据,数据长度,应答时长;
HAL_UART_Transmit(&huart1,(uint8_t*)Uart1_RxBuff,Uart1_Rx_Cnt,1000);
//发送的数据
中断发送就不需要应答时长;
HAL_UART_Transmit_IT(&huart1,(uint8_t*)Uart1_RxBuff,Uart1_Rx_Cnt);
//发送的数据
接收数据,需要先开启中断;
HAL_UART_Receive_DMA(&huart1,aRxBuffer,20);
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
编写接收中断函数;
//串口接收,需要发送固定标志位 回车
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function Should not be modified, when the callback is needed,
the HAL_UART_TxCpltCallback could be implemented in the user file
*/
if(huart->Instance==USART1)//如果是串口1
{
if(Uart1_Rx_Cnt >= 255) //溢出判断
{
Uart1_Rx_Cnt = 0;
memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);
}
else
{
Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer[0]; //接收数据转存
if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
{
Uart1_RxFlag = 1; //接收完成标志位
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
}
}
主函数,把接收到的数据发送回去就行。
if(Uart1_RxFlag != 0)
{
HAL_UART_Transmit(&huart1,(uint8_t*)Uart1_RxBuff,Uart1_Rx_Cnt,1000); //发送接收到的数据
while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET); //等待发送结束
printf("\r\n\r\n"); //插入换行;
Uart1_Rx_Cnt = 0;
memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
}
//
想使用printf函数发送的话,得重定义一下,报错的话,加一个stdio.h就行。
///选择串口发送数据的类型
#define HAL_USART 1 ///<HAL阻塞串口发送数据
//#define HAL_USART_DMA 1 ///<HAL_DMA串口发送数据
/**
* @brief 定义printf函数结构体
*
*/
struct FILE {
int handle;
};
/**
* @brief 重定向printf函数到串口
*
*/
int fputc(int ch, FILE * f){
#ifdef HAL_USART
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);///<普通串口发送数据
#elif HAL_USART_DMA
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)&ch,1);///<DMA串口发送数据
#endif
while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) == RESET){}///<等待发送完成
return ch;
}
这是阻塞式接收发送,非阻塞得用DMA发送。