济宁网站建设第一品牌,中国物流网站,免费培训网站,wordpress 更改插件目录USART收发字符串及串口中断前言字符串的收发发送一个字符串接收字符串需求利用串口实现printf中断中断是什么前言
上一篇中#xff0c;介绍了串口收发相关的寄存器#xff0c;通过代码实现了一个字节的收发#xff0c;本文接着上面的内容#xff0c;通过功能函数实现字符串…
USART收发字符串及串口中断前言字符串的收发发送一个字符串接收字符串需求利用串口实现printf中断中断是什么前言
上一篇中介绍了串口收发相关的寄存器通过代码实现了一个字节的收发本文接着上面的内容通过功能函数实现字符串的收发然后引入中断解决收发过程中while()死等的问题。
字符串的收发
发送一个字符串
根据昨天的字符发送函数只需要稍作修改即可实现发送函数了一个字符串的结尾会有一个’\0’作为结束符所以再发送过程中只需要判断当前发送的字符是不是结束符即可如果不是结束符就将该位发送至电脑的串口调试助手如果是结束符那就意味着一个字符串发送完毕了。具体代码如下
/*******************************************
*函数名 :Usart1_Send_Str
*函数功能 :串口1发送一个字符串函数
*函数参数 :u8 *str
*函数返回值:无
*函数描述 :
*********************************************/
void Usart1_Send_Str(u8 *str)
{while(*str ! \0){Usart1_Send_Byte(*str);str;}
}
接收字符串
发送字符串相对容易接收这边就需要借用C语言中的数组来帮忙了因为数据是一个字符一个字符的发送过来的每一次只能接收一个字符所以需要使用一个数组来存接收到的位而且串口助手在发送字符串的时候是不会给单片机发送结束符所以还需要编程者自己规定结束符当然后面引入空闲中断之后就不需要这样操作了。这里笔者使用的是‘#’作为结束标志。具体实现代码如下 /*******************************************
*函数名 :Usart1_Receive_Str
*函数功能 :串口1接收一个字节函数
*函数参数 :void
*函数返回值:u8 str
*函数描述 :
*********************************************/
void Usart1_Receive_Str(void)
{static u8 i0;//等待接收完成while(!(USART1-SR (15)));//将数据寄存器的数据读取到数组Str_Buff[i] USART1-DR;i;if(Str_Buff[i-1]#)//如果检测到结束标志‘#’{Str_Buff[i-1] \0;//手动给字符串添加‘\0’结束符i0;Usart1_Receive_Str_Flag1;//接收完成的标志位置一Usart1_Send_Str(Str_Buff);//将接受的数组再发回串口助手}
}需求
使用串口调试助手发送11打开1号小灯10关闭一号小灯21打开二号小灯20关闭二号小灯。效果如下 主函数代码
利用串口实现printf
在C语言的学习中使用频率最高的输出函数就是printf了这个函数在单片机上也同样适用只是要改一下输出的方向所以也叫重定向。 在C中printf函数-----输出函数 输出方向PC机------屏幕 在单片机中printf-------输出函数 输出方向 单片机----PC机 关于具体的修改其实KEIL已经帮我们做好了需要我们修改的只有一个就是将“stdio.h”内的fputc也就是字符输出函数修改到和我们的字符串输出函数关联即可。具体代码如下 //printf的重定向函数
//fputc-----专门发送字符的函数h
int fputc(int c, FILE * stream)
{Usart1_Send_Byte(c);return c;
}将此代码放到USART1.c中即可不需要调用也不需要声明。 然后就是勾选KEIL的库如下图所示依次选择魔法棒、Target、然后将3所在位置的复选框锁定。 然后再在USART1.h中添加stdio.h。 最后在主函数中调用printf即可printf主要是方便我们的后期调试实用语法与C一致。 实际输出效果 到这里已经实现了字符串的收发但是存在两个问题 1是上位机发送数据到板子上必须要设置结束符类似笔者此处的‘#’ 2是此代码在接收时会阻塞在等待接受完毕的while,这会导致其他的模块工作不正常在while(1)内一定要尽力避免死等的出现。 很明显现在这个代码还不太令人满意那么要怎么修改呢在修改代码之前需要先去了解一个新的东西——中断。
中断
首先需要知道中断是个什么东西它有什么作用具体怎么使用下面一一来进行介绍。
中断是什么
中断嘛按照名字的第一反应是终止一件事打断某些东西的感觉实际上也差不多是这个意思它终止和打断的就是前面我们编写的main函数里面的东西。 也就是说在程序正常运行过程中出现了不正常的事件异常CPU会去处理这个异常处理完之后再回到正常的程序中。这个异常事件就是中断。 中断的目的由外设或者CPU创造一个异常事件紧急事件 紧急事件发生的时间和地点未知 紧急事件是实时响应的紧急事件不能执行太久里面不能有延时 循环 阻塞程序 下面我们来看一张图 代码正常运行的时候是如下图所示的蓝色箭头方向首先会依次向下执行初始化代码然后进入while循环 如果我们在初始化中初始化了中断就会有一个对应的中断服务函数当中断的条件满足了程序就会暂时终止main函数里面的内容去八中断服务函数里面的内容执行完毕了再回来运行main里面的内容。 同时从上图可以看出当中断被初始化后任何时刻都可能满足中断的条件也就是在任何位置都可能会跳出main里面的内容去执行中断服务函数里面的内容。因此说它产生的时间和地点是未知的。