完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
本文主要讲解用keil软件实现USART串口发送及接收数据,默认读者keil环境已经配好,且头文件已正确引入,如出现编译错误以及st-link下载问题,请自行百度解决。 串口发送和接收数据是一件看起来简单,做起来比较繁琐的事情,相信大家对代码的理解都没问题,主要是被一些硬件及软件的操作困住了。不过为了使教程更加明了,还是先讲解一下相关的代码吧! 一、PC发送数据到串口 一、代码部分 1.引入头文件 #include "stm32l1xx_gpio.h" #include "stm32l1xx_rcc.h" #include "stm32l1xx.h" #include "stm32l1xx_usart.h" #include "misc.h" 2.GPIO初始化 这里除了激活USART1两根管脚的复用功能,我们还激活了PA5,PA6,PA7作为七色灯的管脚,七色灯需要用杜邦线在板子上对应的接口连一下,嫌麻烦的同学可以改成激活流水灯的管脚,对于灯的操作大家应该很熟悉了,这里就不再赘述。 void GPIO_Configuration(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_40MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_40MHz; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_Init(GPIOA,&GPIO_InitStructure); } 3.NVIC初始化 void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); } 4.USART1初始化 void USART1_Configuration(void) { USART_InitTypeDef USART_InitStructure; USART_ClockInitTypeDef USART_ClockInitStructure; USART_InitStructure.USART_BaudRate=115200; USART_InitStructure.USART_WordLength=USART_WordLength_8b; USART_InitStructure.USART_StopBits=USART_StopBits_1; USART_InitStructure.USART_Parity=USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; USART_Init(USART1,&USART_InitStructure); USART_Cmd(USART1,ENABLE); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); } 5.main函数 int main(void) { GPIO_Configuration(); USART1_Configuration(); NVIC_Configuration(); while(1) { } } 6.亮灯相关函数(用流水灯的同学可以直接激活流水灯) 不用流水灯的话,打开stm32l1xx_it.c文件,将代码写在其中 #include "stm32l1xx_gpio.h" #define PA5 GPIOA,GPIO_Pin_5 #define PA6 GPIOA,GPIO_Pin_6 #define PA7 GPIOA,GPIO_Pin_7 void light(int i) { switch(i) { case 0:GPIO_SetBits(PA5);break; case 1:GPIO_SetBits(PA6);break; default:GPIO_SetBits(PA7);break; } } void unlight(int i) { switch(i) { case 0:GPIO_ResetBits(PA5);break; case 1:GPIO_ResetBits(PA6);break; default:GPIO_ResetBits(PA7);break; } } void style(int i) { int j; int a[7][3]={ 1,1,1, 1,0,0, 0,1,0, 0,0,1, 1,1,0, 1,0,1, 0,1,1}; for(j=0;j<3;j++) { if(a[j]) light(j); else unlight(j); } } 7.中断响应函数 打开stm32l1xx_it.c文件,将代码写入其中,其中style是亮灯函数,如果用流水灯,请改变相应的判断。这里我们每个字符都能出发亮灯,只不过任意相邻的7个字符所亮的灯不一样,大家也可以改成自己喜欢的亮灯方式。 #include "stm32l1xx_usart.h" void USART1_IRQHandler(void) { int buf1=0; if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { buf1=USART_ReceiveData(USART1); style(buf1%7); USART_ClearITPendingBit(USART1,USART_IT_RXNE); } } 至此,代码部分已经全部完成,这个还是很简单的,大部分同学都已经独立完成,下面让我们看一看硬件连接都有哪些注意事项吧! 二、硬件的连接 首先,我们需要知道哪个是串口模块 1.串口模块 长这个样子 2.串口与开发板连接方式 GND接地,VCCIO接3V(也可以不接),TXD接RX,RXD接TX,这是板子上接串口的位置。 线不要连错,最好使用三四根不同颜色的杜邦线,好区分。 3.串口、开发板与电脑连接 串口的USB接口是要接到电脑上的,在SSCOM发送或接受数据的时候,都是通过串口的USB口发收的。当然开发板的USB也要连电脑,不然没法烧写程序。 注意串口的驱动程序PL2303_Prolific_DriverInstaller_v130需要安装,安装后可能还需要重启一下电脑。可以右击电脑开始按钮找到设备管理器,打开之后找到图示端口 双击打开,之后更新驱动程序,找到串口的驱动程序并更新。 更新可能需要重启,如果更新成功,会显示,如下界面,这时你的驱动程序就没有问题啦! 4.七色灯连接(用流水灯不用连这个) 将七色灯的三个短管脚连在PA5,PA6,PA7上,长管脚接地。如果有四根连在一起其中有两根线反着的杜邦线,就更方便了。 如图所示,黑线和白线是反着的。 长脚为接地管脚,接白线。 通过查看底板原理图可以知道,底板上,GND,PA5,PA6,PA7相邻,接到对应的位置上 七色灯就接好啦! 三、SSCOM的使用 从keil把程序烧写到板子中,连好串口USB之后,打开SSCOM软件,配置如图,选择设备管理器中对应的串口号之后,点击打开串口。 从字符输入框发送一个字符,这时应该会有对应的灯亮,发送另一个字符会改变颜色,如图 四、python的应用 python可以用spyder,也可以用命令行,由于我自己用的是命令行,就讲一下命令行怎么实现吧! 1.官网下载python环境 https://www.python.org/ftp/python/3.8.1/python-3.8.1-amd64.exe 下载后安装。打开安装目录(注意是安装目录不是安装包下载的目录) 2.配置环境 右键属性,复制python.exe的路径 打开设置,查找环境 编辑系统环境变量,找到环境变量(右下角),打开 在下面的系统变量找到PATH,双击 点右边栏的新建,将python.exe的路径粘贴过去,另外,还要添加一个pip.exe的路径,它在Scripts文件夹里。 添加完毕后别忘了挨个点确定。 3.命令行操作 开始键输入cmd,打开命令行操作界面,输入python,回车,应该出现如图提示。如果没有,请再次打开环境设置看看path中的路径是否已经添加,添加之后重新打开命令行。如果有,再退出输入pip检查一下。 4.安装pyserial库 输入pip install pyserial,回车等待安装,注意联网,需要等待一段时间,安装完毕会有文字提示。 5…py文件代码 记事本新建文件,将代码写入文件中 注意第三行的串口名称,不同的电脑可能不一样,要根据设备管理器上看到的串口的名称改一下 import serial try: portx='COM4' bps=115200/2 timex=5 ser=serial.Serial(portx,bps,timeout=timex) x=int(input('输入循环次数:')) for i in range(0,x): ch=input('输入一个字符:') result=ser.write(ch.encode('gbk')) ser.close() except Exception as e: print('error:',e) 保存的时候,注意把文件后缀名保存为.py 6.用命令行运行.py程序 将.py文件保存到桌面,然后打开命令行,输入cd desktop进入到桌面,然后输入python py.py运行程序 运行结果如下 如果报错,有以下可能
二、串口发送数据到PC 1.查询方式发送 只需要在第一个的基础上稍作添加即可。 1.添加发送函数 void USART_SendString(uint8_t * in) { for(uint8_t i=0;in!=' |