本文主要讲解用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[i][j])light(j);elseunlight(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/2timex=5ser=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运行程序

运行结果如下

如果报错,有以下可能

  1. 串口没有插好
  2. 该端口被其他应用(如sscom)占用,需要先关掉应用之后再运行程序。
  3. 端口名称错误,需要根据设备管理器端口名称修改

    另附pyserial网源代码【Python的串口通信(pyserial) - _樛木 - 博客园】https://www.cnblogs.com/Zhengnengjin/p/10684960.html

PC发送数据到串口点灯部分到此结束

二、串口发送数据到PC

1.查询方式发送

只需要在第一个的基础上稍作添加即可。

1.添加发送函数
void USART_SendString(uint8_t * in)
{for(uint8_t i=0;in[i]!='\0';i++){while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);USART_SendData(USART1,in[i]);}
}
2.修改main函数
int main(void)
{unsigned char str[]="ABCDEFG";GPIO_Configuration();USART1_Configuration();USART_SendString(str);while(1);
}

即可

2.中断方式发送

1.修改USART初始化函数
void USART1_Configuration(void)
{USART_InitTypeDef USART_InitStructure;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_TXE,ENABLE);
}
2.修改主函数
int main(void)
{GPIO_Configuration();NVIC_Configuration();USART1_Configuration();while(1);
}
3.写中断服务函数

打开stm32l1xx_it.c文件,写入

uint8_t CmdBuffer[3]={'a','b','c'};
uint8_t TxIndex=0;
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1,USART_IT_TXE)==SET){USART_SendData(USART1,CmdBuffer[TxIndex++]);if(TxIndex==0x03)USART_ITConfig(USART1,USART_IT_TXE,DISABLE);}}

3.相关操作

先打开sscom软件,打开相应串口之后,再从keil将程序烧入开发板,烧入之后立即看到sscom的屏幕上出现接收的字母。

至此,用串口发送和接收数据就都实现啦!如果大家对具体步骤有疑问,欢迎批评指出

STM32L152RE实现串口发送及接收数据相关推荐

  1. python串口通信的接收与发送_31.用python中的serial向串口发送和接收数据(案例一)...

    代码功能说明:1.向串口助手发送十六进制数据:0X01,0X03,0X00,0X00,0X00,0X01,0X84,0X0A: 2.用串口助手向代码发送数据,并将发送过来的数据保存在数据库中,按数据和 ...

  2. 单片机原理与应用实验——串口(C语言),使用串口发送或接收数据,定时器1作为波特率发生器

    (基于51核的STC12C5A60S2,keil uvision5 mdk 5.25 编译) 1. 定时发送1字节数据给电脑,波特率9600 #include <STC12C5A60S2.h&g ...

  3. hal 双串口同时接收丢失数据_【STM32Cube_06】使用USART发送和接收数据(查询模式)...

    寻求更简洁舒适的阅读体验,请移步Mculover666的个人博客: [STM32Cube_06]使用USART发送和接收数据(查询模式)​www.mculover666.cn 本篇文章主要介绍如何使用 ...

  4. 手把手教你Android手机与BLE终端通信--连接,发送和接收数据

    假设你还没有看上一篇 手把手教你Android手机与BLE终端通信--搜索,你就先看看吧,由于这一篇要接着讲搜索到蓝牙后的连接.和连接后的发送和接收数据. 评论里有非常多人问假设一条信息特别长,怎么不 ...

  5. USART串口协议和USART串口外设(USART串口发送串口发送和接收)

    1.通信接口 A.基本概念 • 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 • 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发  异步:需要双方约定一个频率 B.数据通信方 ...

  6. C#解决串口通信中接收数据时延迟处理与缓存处理的方法

    转载连接: http://blog.csdn.net/yaoliang11/article/details/6885768 C#解决串口通信中接收数据时延迟处理与缓存处理的方法 时间:2011-1-2 ...

  7. 【转】QT 串口QSerialPort + 解决接收数据不完整问题

    [转]QT 串口QSerialPort + 解决接收数据不完整问题 参考文章: (1)[转]QT 串口QSerialPort + 解决接收数据不完整问题 (2)https://www.cnblogs. ...

  8. 使用DatagramSocket发送、接收数据(Socket之UDP套接字)

    2019独角兽企业重金招聘Python工程师标准>>> 创建一个DatagramSocket实例,并将该对象绑定到指定IP地址.指定端口. 通过上面三个构造器中的任意一个构造器即可创 ...

  9. 网络——在网络上发送,接收数据

    问题 创建并加入一个网络会话是一回事,但如果不能发送或接收任何数据那么网络会话有什么用呢? 解决方案 当玩家连接到会话时,你可以在一个PacketWriter流中存储所有想要发送的数据.完成这个操作后 ...

最新文章

  1. 开源要“开”得安全高效:开源云计算的五大发展趋势
  2. 32位数据源中没有mysql_如何在.NET中连接到MySQL数据库
  3. 第1章 认识jQuery
  4. SpringCloud系列之服务消费Ribbon和Feign区别
  5. 花5分钟时间来了解一下高性能网关Kong会有意外收获
  6. PHP笔记-连接MySQL数据库及查询数据
  7. 深圳美景品牌策划机构:美景推动国际品牌MASHIMARO闪电招商,3天签约211家
  8. servlet到底是什么
  9. 理解Liang-Barsky裁剪算法的算法原理
  10. 洗碗机,加速中国化才能更适合中国厨房
  11. RapidASR项目(语音转文本):更快、更容易部署、开箱即用
  12. foxmail怎么设置服务器才能登陆网易企业邮箱
  13. 如何查看自己的电脑是32位机器还是64位机器
  14. 阿拉伯数字转中文 JAVA
  15. Spring中的IOC介绍
  16. 使用HttpClient下载网页
  17. MySQL8免安装版下载安装与配置(windows)
  18. MacOS VSCode 突然打开黑屏的解决办法
  19. 48亿卖给苏宁!又一全球巨头败走中国
  20. 高数等价无穷小替换公式

热门文章

  1. Python + PIL + Tkinter: 图片原比例缩放
  2. Swiper4.3.3 制作轮播图
  3. 《操作系统》期末考试试卷2
  4. python dingding --- 钉钉机器人API
  5. 经典的“外行管内行”案例
  6. 速算24点java_HDU-1427-速算24点
  7. C++小魔术-读心术
  8. 六、Django-Registration-Redux的基本使用
  9. C++处理 中英字混合截断乱码[中码GBK,英码ASCII]
  10. 火山视窗文本数组类增删查改操作