神奇的串口通信

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

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值