神奇的串口通信
我们在使用stm32进行一些测试的时候,会经常使用到串口。那么我们可能就会有个疑问,串口到底是个什么?
串口也就是串行接口,是用来进行通信的,通俗来讲,我们可以使用串口实现两个控制器之间,或微控制器与pc端的相互传递数据,也就是实现了通信的一种。
在stm32mini板上,有三个串口,我们经常使用与PC端进行通信的是USART1,下面我们就以USART1为例进行介绍。
板子上的操作:
USART1的TX和RX对应PA9和PA10,在使用的时候只需要用跳线冒将他们连接就可以,因为我们的mini板上面是有Ch340的芯片,所以我们直接使用USB转串口的接口与PC端相连,就可以实现了PC与stm32之间的通信。
“跑起来的”程序
初始化
只有这个硬件相连,肯定是不可以实现的,因此我们需要书写相应的驱动代码,才可以实现通信,简单来说也就是传递互相接受与发送数据。
程序的设计思路在上一个文章里面也已经大致的介绍了,在以后自己编写的时候直接按照那个思想就完全OK了:建立.c和.h的文件、编写.h文件中的声明以及宏定义等、编写.c文件中的驱动程序
建立相应的文件夹是一个很好的习惯,方便以后的移植,大家在练习编程的初期,一定要养成一个良好的习惯,否则到后来的时候,根本不知道自己的程序是哪里出现了问题。
所以我们在初始化的时候,将 TX(PA9)设置为推挽复用输出模式,将 RX(PA10)设置为浮空输入
模式:
PA10的代码,与之类似,大家自行编写练习即可
最为主要的代码就是,接受与发送的程序,我们如实实现程序的收发,这是一个比较困难的问题,因此这就要求我们要看手册,去了解它的工作原理是什么
接收函数
/*这个代码是学习来的!!!*/
void USART1_IRQHander(void)//中断服务函数的名称不能够更改,要按照固定的格式书写
{
int t=0;
if(USART_GetITStaues(USART1,USART_IT_RXNE)!=RESET)//接收到中断,开始进行下面操作
{
USART_RX_BUF[t]=USART_ReceiveData(USART1);//接收到数据,存放到数组当中
t++;
USART_RX_SET=0;//没接收完,还需要继续接收,状态寄存器设置为0
}
if(USART_GetITStaues(USART1,USART_IT_IDEL)!=RESET)//接收这个中断之后,完成了所有数据的接收
{
USART1->SR=0;
USART1->DR=0;
USART1_RX_STA=1;//已经接收完毕了
USART_RX_LEN=t;//将长度赋值出来
}
t=0;//将计数变量归零
}
这个是资料文档中的中断服务函数,但使用了很多的全局变量,我感觉是十分不好理解的,容易在使用的时候出现问题,因此建议大家自己去修改一下这个思路,了解一下他的工作方式就可以了。
在这个接收状态寄存器中,共有16为,其中0-13为数据位,14和15是状态位,所以只要去检验那个状态位,也就是检测到了接收的完成
/*方式1 接收数据*/
void USART1_jieshou(u8 *buffer)//*buffer 用来存放接收到的数据
{
if(USART_RX_STA)//接收完成
{
memcpy(buffer,USART_RX_BUF,USART_RX_LEN);//USART_RX_BUF用来存放接收到的数据,然后赋给buffer,USART_RX_LEN指的是接收道德数据长度
USART_RX_STA=0;//接收完成之后,将接收状态寄存器再赋值为0,再次准备开始接收数据
}
}
USART_RX_BUF,USART_RX_LEN 这些变量在程序中要定义为全局变量,否则会出现错误的。
/*方式2 接收数据*/
void USART1_jieshou2(u8 *buffer)
{
int len;
int i;
if(USART_RX_STA)
{
len=USART_RX_STA&3fff;//计算接收长度
for(i=0;i<len;i++)
{
buffer[i]=USART_RX_BUF[i];
}
}
}
发送函数
发送数据的时候,也可以直接使用USART_SendData(USART1,buf);
但是,不能够实现直接发送多位数组,因此我们自己编写一下程序
void USART1_fasong(u8 *buf)
{
while(*buf)
{
USART_SendData(USART1,buf);//按位发送字符,直到buf为空
}
}
上面所讲只是我的部分所编程序,大家可以复制去实际调试一下,希望可以对大家有所帮助。
如有错误,希望大家批评指正
我是嵌入式爱好者------“一个爱着洋洋的人”