前言
基于正点原子的串口通信实验例程,学习通过对串口发送特定字符串,从而控制LED的亮灭。(大家在看本文前先学习正点原子所提供的串口通信源程序,便于比较不同点)
一、功能
打开串口调试助手,发送ledon,打开LED1;发送ledoff,熄灭LED1。
二、程序分析
1.先看usart.c文件,此文件主要是串口的初始化以及中断服务函数的编写,中断服务函数不需要做改动(这里我没有做改动,看不太懂…)
2.重点是主函数的修改。既然需要发送特定的字符串,首先就要定义两个字符数组(你想用什么命令控制,就定义什么样的数组),如下:
u16 buff1[] = {'l','e','d','o','n'};
u16 buff2[] = {'l','e','d','o','f','f'};
3.上面就是我们需要发送给串口的数据(也即串口接收的数据),下面我们要修改程序中串口接收数据的部分(源程序大家对照正点的例程,是一模一样的,这里我就不贴源程序了)。这里直接上代码。
while(1)
{
if(USART_RX_STA&0x8000) // 串口有接收到数据 u16 USART_RX_STA=0 接收状态标记
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n");
for(t=0;t<len;t++)
{
if(USART_RX_BUF[t] == buff1[t])//接收到的字符每一位与已知的字符数组进行比较
{
flagon++;
}
if(USART_RX_BUF[t] == buff2[t])//接收到的字符每一位与已知的字符数组进行比较
{
flagoff++;
}
USART_SendData(USART1,USART_RX_BUF[t]); //这是库函数发送数据的方法,也可以替换为后面的操作寄存器的方法:USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束,这也是直接操作寄存器
}
if(flagon == 5) //说明接收到特定指令
{
LED1 = 0;
}
if(flagoff == 6) //与上同理
{
LED1 = 1;
}
printf("\r\n\r\n");//插入换行
flagon = 0;
flagoff = 0;
USART_RX_STA=0;
}
以下简要分析几个关键点:
1.字符串比较
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
for(t=0;t<len;t++)
{
if(USART_RX_BUF[t] == buff1[t])//接收到的字符每一位与已知的字符数组进行比较
{
flagon++;
}
if(USART_RX_BUF[t] == buff2[t])//接收到的字符每一位与已知的字符数组进行比较
{
flagoff++;
}
这里的len是接收数据的长度,然后用一个for循环与定义的数组一个字符一个字符进行比较,接收的字符会存在USART_RX_BUF[]中,这个数组的定义可在usart.c中查看到。每接收到一个指定字符,标志量就+1(flagon是控制灯亮的,同理flagoff是控制灯灭的)。只有flagon = 5时才说明接收的字符串与指定的完全一样(flagoff = 6同理)。
注意:无论两个if是否执行,在接收完以后都必须将标志量清零,同时串口接收数据标志量(USART_RX_STA)也必须清零。
USART_SendData(USART1,USART_RX_BUF[t]); //这是库函数发送数据的方法,也可以替换为后面的操作寄存器的方法:USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束,这也是直接操作寄存器
USART_SendData(USART1,USART_RX_BUF[t]); //这是库函数发送数据的方法,也可以替换为后面的操作寄存器的方法:USART1->DR=USART_RX_BUF[t];
while((USART1->SR&0X40)==0);//等待发送结束,这也是直接操作寄存器
这两句其实是将数据发送返回至PC端,这样可以在串口调试助手中看到你发送的数据,如果删去并不影响功能,只是不会返回你发送的指令。而且例程中这里是直接操作寄存器,也可以用库函数的方法,如可以用USART_SendData(USART1,USART_RX_BUF[t])函数代替USART1->DR=USART_RX_BUF[t]
总结
我个人认为正点原子的串口例程不够直观,仅仅简单的发送返回数据,不能很好的理解数据的收发,希望大家结合我这个例子辅助学习,文章中可能有不明白的地方(我也是初学小白),大家可以在评论区留言,希望与大家共同进步。