使用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;
}
}