stm32串口接收字符串函数.docx
《stm32串口接收字符串函数.docx》由会员分享,可在线阅读,更多相关《stm32串口接收字符串函数.docx(11页珍藏版)》请在冰豆网上搜索。
stm32串口接收字符串函数
竭诚为您提供优质文档/双击可除
stm32串口接收字符串函数
篇一:
sTm32串口库函数版例程
sTm32串口库函数版例程
定义:
TxD1-----pA9-us1-Tx
RxD1-----pA10-us1-Rx
速率:
115200,n,8,1
[cpp]viewplaincopyprint?
1./*Includes------------------------------------------------------------------*/
2.#include"stm32f10x.h"
3.#include"platform_config.h"
4.#include"stm32f10x_usart.h"
5.#include"misc.h"
6.#include"stdarg.h"
7.
8.
9.
10./*privatevariables---------------------------------------------------------*/
11.usART_InitTypeDefusART_Initstructure;
12.uint8_tTxbuffer1[]="usARTInterruptexample:
ThisisusART1Demo";
13.uint8_tRxbuffer1[],rec_f,tx_flag;
14.__Iouint8_tTxcounter1=0x00;
15.__Iouint8_tRxcounter1=0x00;
16.
17.uint32_tRec_Len;
18.
19.
20./*privatefunctionprototypes-----------------------------------------------*/
21.voidRcc_configuration(void);
22.voidgpIo_configuration(void);
23.voidnVIc_configuration(void);
24.
25.voidDelay(__Iouint32_tncount);
26.voidusART_ouT(usART_TypeDef*usARTx,uint8_t*Data,...);
27.char*itoa(intvalue,char*string,intradix);
28.voidusART_config(usART_TypeDef*usARTx);
29.
30.
31.gpIo_InitTypeDefgpIo_Initstructure;
32.usART_InitTypeDefusART_Initstruct;
33.usART_clockInitTypeDefusART_clockInitstruct;
34.
35./****************************************************************************
36.*名称:
voidili9325_Drawpicture(u16startx,u16startY,u8Dir,u8*pic)
37.*功能:
在指定座标范围显示一副图片
38.*入口参数:
startx行起始座标
39.*startY列起始座标
40.*Dir图像显示方向
41.*pic图片头指针
42.*出口参数:
无
43.*说明:
图片取模格式为水平扫描,16位颜色模式取模软件img2LcD
44.*调用方法:
ili9325_Drawpicture(0,0,0,(u16*)demo);
45.****************************************************************************/
46.voidusART_config(usART_TypeDef*usARTx){
47.usART_Initstructure.usART_baudRate=115200;//速率
115200bps
48.usART_Initstructure.usART_wordLength=usART_wordLength_8b;//
数据位8位
49.usART_Initstructure.usART_stopbits=usART_stopbits_1;//停止
位1位
50.usART_Initstructure.usART_parity=usART_parity_no;//无校验
位
51.usART_Initstructure.usART_hardwareFlowcontrol=usART_hardwareFlo
wcontrol_none;//无硬件流控
52.usART_Initstructure.usART_mode=usART_mode_Rx|usART_mode_T
x;//收发模式
53.
54./*configureusART1*/
55.usART_Init(usARTx,//配置串口参
数函数
56.
57.
58./*enableusART1ReceiveandTransmitinterrupts*/
59.usART_ITconfig(usART1,usART_IT_Rxne,enAbLe);//使能
接收中断
60.usART_ITconfig(usART1,usART_IT_Txe,enAbLe);//使能
发送缓冲空中断
61.
62./*enabletheusART1*/
63.usART_cmd(usART1,enAbLe);
64.}
65./****************************************************************************
66.*名称:
intmain(void)
67.*功能:
主函数
68.*入口参数:
无
69.*出口参数:
无
70.*说明:
71.*调用方法:
无
72.****************************************************************************/
73.intmain(void)
74.{
75.
76.uint8_ta=0;
77./*systemclocksconfiguration*/
78.Rcc_configuration();//系统时钟设置
79.
80./*嵌套向量中断控制器
81.说明了usART1抢占优先级级别0(最多1位),和子优先级级别0(最多
7位)*/
82.nVIc_configuration();//中断源配置
83.
84./*对控制LeD指示灯的Io口进行了初始化,将端口配置为推挽上拉输出,口
线速度为50mhz。
pA9,pA10端口复用为串口1的Tx,Rx。
85.在配置某个口线时,首先应对它所在的端口的时钟进行使能。
否则无法配置成
功,由于用到了端口b,因此要对这个端口的时钟
86.进行使能,同时由于用到复用Io口功能用于配置串口。
因此还要使能AFIo(复
用功能Io)时钟。
*/
87.gpIo_configuration();//端口初始化
88.
89.usART_config(usART1);//串口1初始化90.
91.usART_ouT(usART1,"****测试串口*******\r\n");//向串口1发送开机字
符。
92.
93.usART_ouT(usART1,"***************************************************\r\n");
94.usART_ouT(usART1,"\r\n");
95.usART_ouT(usART1,"\r\n");
96.while
(1)
97.{
98.if(rec_f==1){//判断是否收到一帧有效数据
99.rec_f=0;
100.usART_ouT(usART1,"\r\n您发送的信息为:
\r\n");
101.usART_ouT(usART1,
102.if(a==0){gpIo_setbits(gpIob,gpIo_pin_5);a=1;}//LeD1V6
(V3板)V2(mInI板)明暗闪烁
103.else{gpIo_Resetbits(gpIob,gpIo_pin_5);a=0;}
104.}
105.}
106.}
107.
108./****************************************************************************109.*名称:
voidDelay(__Iouint32_tncount)
110.*功能:
延时函数
111.*入口参数:
无
112.*出口参数:
无
113.*说明:
114.*调用方法:
无
115.****************************************************************************/116.voidDelay(__Iouint32_tncount)
117.{
118.for(;ncount!
=0;ncount--);
119.}
120.
121./****************************************************************************
122.*名称:
voidusART_ouT(usART_TypeDef*usARTx,uint8_t*Data,...)123.*功能:
格式化串口输出函数
124.*入口参数:
usARTx:
指定串口
125.Data:
发送数组
126....:
不定参数
127.*出口参数:
无
128.*说明:
格式化串口输出函数
129."\r"回车符usART_ouT(usART1,"abcdefg\r")
130."\n"换行符usART_ouT(usART1,"abcdefg\r\n")
131."%s"字符串usART_ouT(usART1,"字符串是:
%s","abcdefg")132."%d"十进制usART_ouT(usART1,"a=%d",10)
133.*调用方法:
无
134.****************************************************************************/135.voidusART_ouT(usART_TypeDef*usARTx,uint8_t*Data,...){136.constchar*s;
137.intd;
138.charbuf[16];
139.va_listap;
140.va_start(ap,Data);
141.
142.while(*Data!
=0){//判断是否到达字符串结束
符
143.if(*Data==0x5c){//\
144.switch(*++Data){
145.caser:
//回车符
146.usART_sendData(usARTx,0x0d);
147.
148.Data++;
149.break;
150.casen:
//换行符
151.usART_sendData(usARTx,0x0a);
篇二:
sTm32学习之串口usART
sTm32学习之串口usART
sTm32的串口是相当丰富的。
最多可提供5路串口,有分数波特率
发生器、支持单线光通信和半双工单线通讯、支持LIn、智能卡协议
和IrDAsIRenDec规范(仅串口3支持)、具有DmA等。
串口最
基本的设置,就是波特率的设置。
sTm32的串口使用起来还是蛮简
单的,只要你开启了串口时钟,并设置相应Io口的模式,然后配置
一下波特率,数据位长度,奇偶校验位等信息,就可以使用了。
1、串口时钟使能。
串口作为sTm32的一个外设,其时钟由外设始
终使能寄存器控制,这里我们使用的串口1是在Apb2enR寄存器
的第14位。
除了串口1的时钟使能在Apb2enR寄存器,其他串
口的时钟使能位都在Apb1enR。
1、串口的作用:
用在sTm32板子和pc机通信的。
我们调试的时候,
无法知道是否正确,就可以用sTm32的cpu,给串口输出一些信息
给pc,我们通过屏幕(实际上是终端串口软件),可以看到这些信息,
从而知道当前程序的错误可能出现的位置。
当然,也可以在pc的键
盘敲打命令,让串口帮传递给sTm32板子,来执行这些命令。
2、串口的工作模式一般有两种方式:
查询和中断
(1)查询:
串口程序不断地循环查询,看看当前有没有数据要它传,
如果有,就帮助传送(可以从pc到sTm32板子,也可以从sTm32板子到pc)。
(2)中断:
平时串口只要打开中断即可。
如果发现有一个中断来,
则意味着要它帮助传输数据——它就马上进行数据的传送。
同样,可
以从pc到sTm32板子,也可以从sTm32板子到pc。
步骤一从硬件开始学习。
大家先打开芯达sTm32开发板附带的
原理图。
找到串口部分。
笔者把它截图如下。
我们发现,串口模块的
电路是这样的:
sTm32的cpu引脚,通过两个pA端口的引脚pA10
和pA9(此两个引脚复用usART),连接到一个sp3232芯片,或者
mAx232芯片。
然后再连接到Db9串口座上。
由于232芯片可以允
许走两路信号,因此,我们扩展了一个串口com2,请注意,如无特
别说明,我们都将使用com1。
sp3232een芯片能帮助把数据信号转换成电脑232接口能识别
的信号。
其转换是自动进行的。
因此,我们只需要把要发送的数据送
给引脚pA9,然后再串口座的引脚3上去接收数据即可。
反之,接收
数据也是一样。
步骤二初始化串口。
打开《sTm32F103xxx参考手册》与《sTm32固件库使用手册》。
我
们的思路和之前一样,根据固件库使用手册中给出的步骤来配置串
口。
1、要声明一个结构:
gpIo_InitTypeDefgpIo_Initstructure;
usART_InitTypeDefusART_Initstructure;这里顺便也声明了gpIo的结构。
原因是:
串口是需要使用Io口来
进行发送和接收的。
2、设置该结构中的成员:
串口的结构成员设置如下:
usART_structInit(
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_mode=usART_mode_Rx|usART_mod
e_Tx;
usART_Initstructure.usART_hardwareFlowcontrol
=usART_hardwareFlowcontrol_none;
gpIo结构的成员设置如下:
gpIo_structInit(
gpIo_Initstructure.gpIo_pin=gpIo_pin_9;
gpIo_Initstructure.gpIo_mode=gpIo_mode_AF_pp;
gpIo_Init(gpIoA,
gpIo_Initstructure.gpIo_pin=gpIo_pin_10;
gpIo_Initstructure.gpIo_mode=gpIo_mode_In_FLoATIng;
gpIo_Init(gpIoA,
3、调用函数xxx_Init()来初始化外设(包括Io和usART):
usART的初始化函:
usART_Init(usART1,
由于gpIo的外设初始化已经放在成员设置后面,因此这里没有列出
来。
4、调用xxx_cmd(xxx,enAbLe);函数来使能外设。
这里只需要使能usART即可。
gpIo的固件中,没有使能即可使
用。
usART_cmd(usART1,enAbLe);由于本文档使用的是中断方式
来触发串口收发数据,因此,我们在使能串口之前,也把发送和接收
的中断使能打开:
usART_ITconfig(usART1,usART_IT_Rxne,enAbLe);
usART_ITconfig(usART1,usART_IT_Txe,enAbLe);
5、别忘了加上外设的时钟使能哈~
gpIoA和usART都在Apb2上。
因此我们调用的函数如下:
Rcc_Apb2periphclockcmd(Rcc_Apb2periph_usART1|Rcc_Apb2
periph_gpIoA|Rcc_Apb2periph_gpIob|Rcc_Apb2periph_gpIoc|R
cc_Apb2periph_gpIoD|Rcc_Apb2periph_gpIoe,enAbLe);
步骤三操作串口收发数据
芯达sTm32的思路是:
首先让sTm32的cpu发送一些欢迎信
息,从串口打印出来。
然后接收中断,该中断来自键盘输入。
只要键
盘输入一个字符,即打印出该字符,从而验证串口编程是否成功。
固件库的函数如何让串口发送和接收数据呢?
它给我们提供了
两个函数:
usART_sendData();——省略函数参数
usART_ReceiveData();
先来看发送。
我们的程序在初始化串口之后,马上就会打印欢迎
信息。
也就是从sTm32的cpu发送信息,在电脑屏幕上显示出来,
只要如下操作即可:
/*============usART打印欢迎信息==============*/
for(i=0;Txbuf1[i]!
=\0;i++){
usART_sendData(usART1,Txbuf1[i]);
while(usART_getFlagstatus(usART1,usART_FLAg_Tc)==ReseT);
}
Txbuf1是一个发送缓存。
我们事先把数据放在这个数组里了:
unsignedcharTxbuf1[100]="这里可以自定义需要输出到串口的字符";
这里要注意的是,当我们发送一个字符后,必须查看状态标志,这里
是发送是否完成的标志:
usART_FLAg_Tc,如果发送完成了,则才
可以发送下一个数据。
函数usART_getFlagstatus();就是用来做这个
判断的。
下面开始另外一个操作:
键盘输入什么字符,就得显示什么字符。
我
们的代码如下:
while
(1)
{
gpIo_setbits(gpIoe,gpIo_pin_1);
Rx_status=usART_getFlagstatus(usART1,usART_FLAg_Rxne);if(Rx_status==seT)
{
usART_sendData(usART1,usART_ReceiveData(usART1));
while(usART_getFlagstatus(usART1,usART_FLAg_Tc)==ReseT);gpIo_Resetbits(gpIoe,gpIo_pin_1);
Delay(0xFFFFF);
}
}
先判断接收的状态标志usART_FLAg_Rxne,如果接收的寄存器非
空,说明已经接收到键盘发送来的数据,于是就把这个数据从接收缓
存中取出来,发送给电脑。
这样电脑就可以看到刚才敲入的字符了。
usART_ReceiveData(usART1);这个函数是从接收缓存取出数据。
我们在这个while中,还加入了gpIo的函数:
gpIo_setbits(gpIoc,gpIo_pin_0);
gpIo_Resetbits(gpIoc,gpIo_pin_0);这两个函数,setbits,表示对gpIoc端口的第0个引脚置1。
Resetbits,
清零。
由于芯达sTm32开发板上,gpIoc端口上的第0引脚连着一
个LeD灯,所以,我们可以通过观察LeD灯是否闪烁来判断串口是
否正在发送。
篇三:
sTm32F103_usART输入输出
usART输入输出讲解
今天总结sTm32F103串口,以工程实例来讲述。
工程现象:
1.间断发送字符
2.接收中断(接收字符,并发送该字符)
软件工程下载地址(360云盘):
访问密码ee52
讲述分如下几点:
一、串口时钟
这里的“时钟配置”函数在bsp.c文件下面;使能串口1(Rcc_Apb2periph_usART1)时钟。
二、usART1引脚配置
这里的“usART1引脚配置”函数在usart.c文件下面;
初始化串口使用引脚,包含端口引脚、频率、输出类型。
三、串口配置
这里的“串口配置”函数在usart.c文件下面;详见每一句后面都有注释。
四、串口中断配置
这里的“nVIc配置”函数在bsp.c文件下面;主要分配中断控制、中断优先级。
五、主函数应用
这里的“主函数”函数在main.c文件下面;间隔跳变LeD、打印(发送)字符串。
六、中断函数
函数在stm32f10x_it.c文件下面;
功能:
接收一个字符串,并发送。
想掌握更多精彩内容,请欢迎关注我的微信公众号。
微信搜索“embeddDeveloper”,或扫描下面二维码关注