欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

神奇的串口通信

程序员文章站 2024-02-22 10:13:10
...

我们在使用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为空
	}
}

上面所讲只是我的部分所编程序,大家可以复制去实际调试一下,希望可以对大家有所帮助。
如有错误,希望大家批评指正
我是嵌入式爱好者------“一个爱着洋洋的人”

相关标签: 串口