串口重定向和printf的使用

本文介绍了如何在GD32开发板的STM32串口1上使用printf函数打印信息,并通过串口助手发送不定长数据。通过USART1_IRQHandler中断处理接收数据,同时实现数据帧的解析,如使用strstr函数检查特定字符串模式并控制GPIO引脚。
摘要由CSDN通过智能技术生成

使用printf打印信息并在串口助手上显示

printf("Hello World!");内部调用的一个函数fputc,如果没有fputc这个函数,送信息的时候不是送到这个串口上,而是送到其他设备去了。

int fputc(int ch,FILE *f)
{
	uint8_t temp =ch;
	HAL_UART_Transmit(&huart1,&temp,1,10);
	return ch;
}

空闲中断和不定长数据接收实验

实验任务:使用GD32串口0(STM32串口1)接收PC端串口助手发送过来的不定长的数据。

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	uint16_t br = 0;
	uint16_t temp = USART1->SR;//状态寄存器的值
	if(temp & (1<<5))
	{
		if(rxlencnt < LEN)
		{
			rxbuf[rxlencnt] = USART1->DR&0x1ff;
			rxlencnt++;
		}
		else
		{
			rxlencnt = 0;
			memset(rxbuf,0,LEN);
		}
		USART1->SR &= ~(1<<5);//将状态寄存器的值清零
	}else
	if(temp & (1<<4))//检测到了空闲线路
	{
		flag=1;
		br = USART1->DR;
		USART1->SR &= ~(1<<4);
	}
  /* USER CODE END USART1_IRQn 0 */

 // HAL_UART_IRQHandler(&huart1);
}

主函数代码

uint8_t rxbuf[LEN]={0};
uint16_t rxlencnt = 0;
uint8_t flag = 0;	


__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);    //使能串口的接收中断
	
	__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);    //使能串口的空闲中断


while (1)
  {
		if(flag == 1)
		{
			flag = 0;
			HAL_UART_Transmit(&huart1,rxbuf,rxlencnt,rxlencnt);
		
			memset(rxbuf,0,rxlencnt);
			rxlencnt=0;
		}
}

数据帧的接收与解析:

strstr函数:strstr(s1,s2)是s2中是否包含s1中的字符串,如果包含,则返回包含的起始地址,如果没有包含,则返回NULL

void frame_control(void)
{
	if(flag!=1) return;
		flag = 0;
		HAL_UART_Transmit(&huart1,rxbuf,rxlencnt,rxlencnt);
	
		char *pstr1 = NULL,*pstr2=NULL;
		char *str1 = "aa", *str2 = "55";
	
		pstr1 = strstr((char*)rxbuf,str1);
		pstr2 = strstr((char*)rxbuf,str2);
		
		if((pstr1 != NULL)&(pstr2 != NULL))
		{
			if((*pstr1 == 'a')&&(*pstr2 == '5')
				&&(*(pstr1+5) == '5')&&(*(pstr1+6)=='5')
					&&(*(pstr1+2)-0x30)+(*(pstr1+3)-0x30)==(*(pstr1+4)-0x30))
			{
				switch(*(pstr1+2))
				{
					case '1':
					{
							if(*(pstr1+3) == '1') 
								HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_SET);
							else if(*(pstr1+3)=='0')
								HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET);
						break;
					}
					case '2':
					{
						if(*(pstr1+3) == '1') 
								HAL_GPIO_WritePin(GPIOD,GPIO_PIN_7,GPIO_PIN_SET);
							else if(*(pstr1+3)=='0')
								HAL_GPIO_WritePin(GPIOD,GPIO_PIN_7,GPIO_PIN_RESET);
						break;
					}
			}
		
		}
		memset(rxbuf,0,rxlencnt);
		rxlencnt=0;
	}
}

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值