2021-01-12

前言

基于正点原子的串口通信实验例程,学习通过对串口发送特定字符串,从而控制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]

总结

我个人认为正点原子的串口例程不够直观,仅仅简单的发送返回数据,不能很好的理解数据的收发,希望大家结合我这个例子辅助学习,文章中可能有不明白的地方(我也是初学小白),大家可以在评论区留言,希望与大家共同进步。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值