关于串口数据的发送和接收(调试必备)
前言
对于串口的数据发送和接收,大多是都是利用串口中断来进行的,但是这样对于编程方面有一定要求,并且程序也不太好写,比如说,如果让你随意接收一段数据,然后利用串口将它发送出来,第一个需要考虑的问题就是接收数据的长度,怎么才知道一段数据是否结束?或者说如果串口助手上面没有可以在数据末尾加上结束标志的时候,你如何知道数据的结束?,这必然牵涉到一定的编程技巧。但是,之前在接触C语言的时候,我们就利用过printf和Scanf,那么我们能否利用它们?如果能够利用的话,那么就很方便了。
串口接收和发送机理
首先我们要知道的是串口的工作机理,串口是通过数据帧的发送,这里我就不多去牵扯那些基础的知识,假定我们使用的如下设置,波特率为9600,8位数据。其它的什么奇偶校验都不用。那么它与PC机之间的通信流程是怎么样的呢?第一,数据帧的大小是10位,包含起始位和结束位,起始位固定为0,结束位固定为1。比如现在PC机要向单片机传递数据,首先单片机检测到数据开始位0,那么单片机开始接受后面的数据,通过移位寄存器,一位一位将数据送入,当8位后,接收到结束标志,这个时候RI置位,单片机进入中断程序,软件置零RI,在最快的时间将SBUF中的值读取了,然后退出中断,等待下一个数据接收完毕,就这样将数据一个一个的传送进来。那么发送又是怎么样的呢?首先单片机将数据发送,然后在最后一位发送完毕后,TI置位,进入中断服务程序,将TI清零,接着发送下一个字节的数据,并且退出中断,等待发送完毕,就这样将数据一位一位发送出去。
printf函数的使用
了解的串口的收发机理后,就可以思考编程的思路了,首先我们可以利用数组元素来一位一位的发送和接收,当然程序上的功夫是一定要的,既要保证数据完全发送出去,也要保证数据完整的被接受。这样是最复杂,但是却符合中断的机理,在字符间能够去做主程序得到事情。完全不浪费时间。但是,为了我们数据的收发简便,便于调试,我们需要这样的机理,比如需要发送数据的时候,那么一次性发送完,需要接收数据的时候,一次性接收完,在对于时间要求不高的情况下,这样是可行的!那么我们来看一下keil中STDIO.h的头文件里面自带的函数printf是如何工作的。首先printf中的函数是看不到的,其中的源码也没办法知道,但是我知道的是,它调用了一下库中的PUTCHAR的文件,大家可以点击进去看一下。
它最简单的版本就是一下显示的函数
那么,它采用了一种什么思想呢?就是查询发,也就是如果要发送的话,那么这段时间就只做发送这一件事。它在TI为1后,就将TI = 0 , 然后将数据放在SBUF中,然后在函数while( !TI )中等待数据发送完毕( TI就会置位 ),然后利用这个基本的函数,将数据全部发送出去,当然,这个只是它调用的一个函数,那么大部分还有看不到的,我们不用理会,只用知道一件事情就可以了,就是在调用printf这个函数的时候,我们一定要先将TI置位,那么printf才会正常运行,并且在\0的时候结束。所以,要想使用printf的话,就先设置好串口的波特率,不用开启中断,因为用的是查询法。
下面就用程序来说明一下printf的使用方法!
首先设置好一切需要的必须寄存器
设置好寄存器后,就可以包含头文件进来STDIO.h,调用函数printf就可以了,下面是效果图
掌握了这个技巧,就可以随时通过printf的方便性,将程序的寄存值,或者内存变量的值输出出来,人机交互非常方便。今天就暂时写在这里,后面会更新关于数据的接收的程序思路。