首先关于cubmx配置:
链接: 串口配置.
以及我觉得比较好的串口讲解
HAL串口讲解
基础操作
上位机发送数据给单片机,单片机收到数据后,又发送给上位机。
这整个通信过程在串口助手中体现出来:
while (1)
{
/* USER CODE END WHILE */
if( HAL_UART_Receive(&huart1,RecBuf,5,100) == HAL_OK )
{
HAL_UART_Transmit (&huart1 ,RecBuf,5,100); //把接收到的字符原样返回
}
/* USER CODE BEGIN 3 */
}
进阶操作1
重定向printf
链接: 重定向printf的原理.
/* USER CODE BEGIN 4 */
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
//采用轮询方式发送一个字节的数据,没有发送成功就一直等待
return ch;
}
int fgetc(FILE *f)
//int fgetc(int ch, FILE *F)
{
uint8_t ch;
HAL_UART_Receive (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
return ch;
}
/* USER CODE END 4 */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#define RXBUFFERSIZE 256
char RxBuffer[RXBUFFERSIZE];
/* USER CODE END PTD */
while (1)
{
printf ("123 %d",c); //就可以像c语言那样通过串口打印出数据啦
HAL_Delay(1000);
}
链接: scanf()连续接收多个字符出现的问题.
当我们输入y,串口会接收到如下的数据:
而如果去掉上面的两行getchar()代码,就会
原因在链接里说的很清楚啦,我这里就提供一个思路,不必多言。
进阶操作2(可忽略)
GUJIANKU
链接: USART_SendData的使用
大家可以关注下stm32固件库的使用,里面又很多封装好的函数的介绍,当我们想写哪方面的程序时,就可以去查阅一下相关函数。
中断回调函数
这个写出来,接收中断就没有成功过
这里LED0也没有亮
害
下面是核心代码,有没有大佬帮忙看看什么问题qwq感激不尽
/* USER CODE BEGIN 2 */
printf("发送信息ing\r\n\r\n");
printf("发送信息ing\n请输入10个字符\r\n\n");
HAL_UART_Receive_IT (&huart1 ,RxBuffer ,LENGTH);
while (1)
{
//printf ("666%d %d \r",c,a);
//HAL_Delay(1000);
if(RxFlag )
{
RxFlag = 0;
printf("接收成功");
HAL_UART_Transmit (&huart1 ,RxBuffer ,LENGTH,0xff);
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
}
}
/* USER CODE BEGIN 4 */
void HAL_UART_Rxcpltcallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1 )
{
HAL_GPIO_TogglePin (GPIOB ,GPIO_PIN_5);
HAL_Delay (300);
HAL_GPIO_TogglePin (GPIOB ,GPIO_PIN_5);
RxFlag = 1;
HAL_UART_Receive_IT (&huart1 ,(uint8_t *)RxBuffer ,LENGTH );//使能接收中断
}
}