蓝桥杯嵌入式——USART串口通信

Cubemx配置

引脚选择

PA9 PA10 配置为串口收发管脚UART1_TX

将USART1调为异步模式(Asynchronous)

根据需求配置波特率(Baud Rate)数据位长度、奇偶校验位、停止位和时钟,一般需要改变的就是波特率。 

时钟Clock一般保持默认80MHz即可

还需要在NVIC Settings中使能中断(该操作是为了后续的串口的数据接收)

函数调用

void uart_process()
{
    HAL_UART_Transmit(&huart1,(unsigned char*)"Hello World!\r\n",sizeof("Hello World!\r\n),50);
   
}

 (unsigned char*)用来强制进行数据类型转换
  \r\n 一起表示回车换行

\r表示回车。

\n表示将光标移至行首,两者一起用才起到了回车换行的功能
  sizeof("Hello World!\r\n)表示输出数据的大小

50是最大等待时间。

发送一个中文

u8 tx_buf[]={"你好!\r\n"};
void uart_process()
{
    HAL_UART_Transmit(&huart1,(unsigned char*)buf,sizeof(buf),50);
}

如果需要发送两条及以上信息,需要在sizeof哪一项减一,因为发送句子的最后一位是00(代表停止)

u8 tx_buf[]={"你好!\r\n"};
void uart_process()
{
    HAL_UART_Transmit(&huart1,(unsigned char*)buf,sizeof(buf)-1,50);
   HAL_UART_Transmit(&huart1,(unsigned char*)"Hello World!\r\n",sizeof("Hello World!\r\n")-1,50);
}

串口软件调试

根据要求选择波特率和串口,一般选择无校验位和一位停止位

打开串口,点击发送

重定向printf串口输出

说明:重定向串口输出是为了简化向串口输出信息的函数

在usart.c中编写重定向函数

//重定向printf函数为串口输出
int fputc(int ch,FILE* f)
{
    HAL_UART_Transmit(&huart1,(unsigned char*)&ch,1,50);
    return ch;
}

然后在魔术棒中勾选UseMicro LIB才可以使用

需要注意,该函数需要在USART CODE Begin后写

并且需要在usart.c中#include "stdio.h"

(该函数可以在Help-uVision help 中搜索fput找到)

完成上述操作后在main中调用printf函数即可向串口输出

printf("hello world!\r\n");
printf("N:%d\r\n",123);
printf("N:%f\r\n",1.23);
u8 buff[]={"你好"};
printf("%s\r\n",buff);

接收程序

 在上述cubemx的配置下进行编码

在初始化部分写启动函数

HAL_UART_Receive_IT(&huart1,uart_buf,1);

编写串口回调函数

写在begin4之后即可

void HAL_UART_RxCpltCallback(UART_Handle TypeDef *huart)

{
    LED_Control(uart_buff[0]);
    HAL_UART_Receive_IT(&huart1,uart_buf,1);//能够继续接受
}

上面是一个很基础的例子,将接收到的第一个数用来控制灯,注意,这里接受的不是文本模式

下面给出一个更具体地例子

//串口接收
u8 uart_buf[2];    //用于接收
u8 rx_buf[10];    //用于缓存
u8 rx_cnt = 0;    //计数
u32 uartTick = 0;
void RxIdle_Process()                    //闲时判断函数,放到while(1)里
{
    if(uwTick-uartTick<50)
        uartTick=uwTick;
     //50毫秒执行一次
       rx_cnt = 0;
        memset(rx_buf,'\0',sizeof(rx_buf)); //清空缓存数组
}
//回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    //接受三个字节长度数据
    rx_buf[rx_cnt++]=uart_buf[0];
    if(rx_cnt==3)
    {
    rx_cnt=0;
    LED_Control(rx_buf[1]);    //用第二个字节控制led
    }

    if(uart_buf[0]=='\n')
    {
    rx_cnt=0;
     LED_Control(rx_buf[1]);    //用第二个字节控制led
    }
HAL_UART_Receive_IT(&huart1,uart_buf,1);    //开启下一次串口接收
}

这里解释一下代码内容:
关于闲时判断函数是为了防止上一次输入了错误的信息,占用了缓存空间,影响下一次的信息接收。

回调函数中提供了两种判断方法,一个是根据接收到的字节长度,另一个是根据接是否接受到一句话。

接收到的rx_buf[ ]是字符型,如果想要转化为数字,可以直接在后面加上-'0'

例如rx_buf[2]对应字符5,那么(rx_buf[2]-'0')就对应整型5

  • 13
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值