1.发送函数
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
参数1: UART 处理结构体的指针,该结构体包含了 UART 的所有配置参数。
参数2:要发送的数据指针
参数3:要发送的数据长度(单位:字节)
参数4:超时时间 (单位ms,如果在该时间内没有完成,则直接执行下一条语句,并且返回HAL_timeout)
返回值:
HAL_OK
: 操作成功。HAL_ERROR
: 发生错误
2.接收函数
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
参数:
参数1: UART 处理结构体的指针,该结构体包含了 UART 的所有配置参数。
参数2:要接收数据的变量指针
参数3:要接收的数据长度(单位:字节)
参数4:超时时间 (单位ms,如果在该时间内没有完成,则直接执行下一条语句)
返回值:
HAL_OK
: 操作成功。HAL_ERROR
: 发生错误
以上是HAL库进行数据收发的函数,不过一般使用printf和scanf。因为printf和scanf会调用fputc和fgetc,因此重写fputc和fgetc执行数据收发。在重写之后就可以直接使用printf和scanf函数进行数据的收发。
fgetc重写1:
int fputc(int ch,FILE *f){
HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,10);
return ch;
}
fputc重写2:
int fputc(int ch,FILE *f){
while(!(USART1->ISR&(1<<7)));
USART1->TDR=ch;
return ch;
}
fgetc的重写:
int fgetc(FILE *f){
uint8_t ch;
while(!(USART1->ISR&(1<<5)));
ch=USART1->RDR;
return ch;
}
因为scanf会自动在字符串末尾加上\0(win为\r),因此相较于Hal原生函数,scanf不需要对其他进行关心。
1.当STM32接收到串口助手的命令后,控制马达震动,表示有数据接收
scanf("%s",buffer);
if(!strcmp(buffer,"motor")){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,1);
// HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,1);
}else{
printf("not motor code");
}
2.当STM32收到LED1_ON时,打开LED1收到LED1_OFF时,关闭LED1
scanf("%s",buffer);
if(!strcmp(buffer,"LED1_ON")){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,1);
}else if(!strcmp(buffer,"LED1_OFF")){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_4,0);
}else{
printf("not led1 code");
}
3.当STM32收到LED3_ON时,打开LED3 收到LED3_OFF时,打开LED3
scanf("%s",buffer);
if(!strcmp(buffer,"LED3_ON")){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,1);
}else if(!strcmp(buffer,"LED3_OFF")){
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,0);
}else{
printf("not led3 code");
}
4.当STM32收到STATUS时:将LED1 LED3光电开关的状态,推送到串口助手中
if(!strcmp("STATUS",buffer)){
int a=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4);
int b=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13);
printf("led1 status :%d",a);
printf("led3 status :%d",b);
}else{
printf("not status code");
}