Bootstrap

STM32CubeMX【串口收发USART】

第一步,配置cubemx

配置好点右上角生成

第二步,串口方式

阻塞式发送

英文、中文正常、浮点有口

/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();//配置完自动生成的

发送到串口助手上 

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //等想发的数据都发完了才会结束
        //5为字符串长度,0xFFFF为超时时间超过这个时间其余的数据就不发了
		HAL_UART_Transmit(&huart1,(uint8_t*)"Hello",5,0xFFFF);
		//&huart1是串口句柄 huart1存了串口的所有数据
		//(uint8_t*)"Hello"【字符串常量】需要传uint8_t*
		HAL_Delay(1000);
    }

从串口助手上发到单片机,再发回串口助手 

while(1){
uint8_t buf[5];//缓存一下

//接收数据,并返回到串口助手
HAL_UART_Receive(&huart1,(uint8_t*)buf,3,0xFFFF);
HAL_UART_Transmit(&huart1,(uint8_t*)buf,3,0xFFFF);
}

 printf函数进行串口发送

#include <stdio.h>//引入标准库头文件
//重写fputc,printf內部是通过它调用的
int fputc(int c,FILE*stream)
{
    uint8_t ch[1]={c};
    HAL_UART_Transmit(&huart1,ch,5,0xFFFF);
    return c;
}
//重写fgetc,scanf內部是通过它调用的
int fputc(FILE*stream)
{
    uint8_t ch[1];
    HAL_UART_Receive(&huart1,ch,1,0xFFFF);
    return ch[0];
}
while(1){
int val=0;
scanf("%d",&val);
printf("%d\r\n",val);//回车并换行

}

使用中断方式(每个字节都会进入一次中断)

不需要等待就能发送完毕

先去NVIC使能中断,调优先级(编号越大优先级越低)

uint8_t buffer[5];//定义成全局变量防止被销毁

int main()
{
//第一次触发中断接收语句
HAL_UART_Receive_IT(&huart1,buffer,3);

while(1){

}
return 0;
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
       //当完成了所有数据的发送时就会进入这个回调
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    //每发一个字节都会进入中断
    HAL_UART_Transmit_IT(&huart1,(uint8_t*)buffer,3);//不需要等待就能发送完毕
    //接收数据,并返回到串口助手

    HAL_UART_Receive_IT(&huart1,buffer,3);
}

DMA(搬运数据)方式(固定数据够了才发)

固定长度数据

uint8_t buffer[5];//定义成全局变量防止被销毁

int main()
{
//第一次触发中断接收语句,dma与中断不同是会接收完固定长的数据
HAL_UART_Receive_DMA(&huart1,buffer,3);

while(1){

}
return 0;
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
       //当完成了所有数据的发送时就会进入这个回调
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    //不用每发一个字节都会进入中断
    HAL_UART_Transmit_DMA(&huart1,(uint8_t*)buffer,3);//不需要等待就能发送完毕
    //接收数据,并返回到串口助手

    HAL_UART_Receive_DMA(&huart1,buffer,3);
}

空闲中断*

不定长接收,基于DMA的修改

uint8_t buffer[5];//定义成全局变量防止被销毁

int main()
{
//第一次触发中断接收语句,dma与中断不同是会接收完固定长的数据
HAL_UART_Receive_DMA(&huart1,buffer,3);

__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);

while(1){

}
return 0;
}

若不是0就是空闲中断了

extern uint8_t buffer[5];//it.c文件里得声明一下

 

3-用来获取DMA计数值

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{//当完成了所有数据的发送时就会进入这个回调
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    //不用每发一个字节都会进入中断
    HAL_UART_Transmit_DMA(&huart1,(uint8_t*)buffer,3);//不需要等待就能发送完毕
    //接收数据,并返回到串口助手

    HAL_UART_Receive_DMA(&huart1,buffer,3);
}

第三步,串口调试助手 

串口接线A10RX接TX,A9TX接RX

需要下USB转TTL的串口驱动,下正点原子的XCOM

保证波特率、数据位....都一致,(该串口助手是GB2312编码

keil中应该也得设置成GB2312编码才能正常传输中文

;