历史上的今天
返回首页

历史上的今天

今天是:2026年01月09日(星期五)

正在发生

2023年01月09日 | 学习STM32单片机,绕不开的串口

2023-01-09 来源:zhihu

串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式......这种太过理论了,看似懂了,但又不懂。还是用我笔者自己的话来说吧。

串口通信就是可以把程序在单片机或者STM32芯片中运行的结果发送到电脑的一种通信方式。






如何使用串口通讯,你需要知道的几个重要的知识点:

波特率,数据传输的速度,如上图设置为9600,那么程序中也要设置为9600

硬件连接,接收、发送交叉连接,如上图TxD->RxD,RxD->TxD

停止位

奇偶校验

硬件数据流

其中,后3项一般不需要改变。

学会串口通信能做什么

学过C语言的人都知道,程序开发需要不断调试不断验证。很多的语言编程软件都有很完整的程序调试功能。使用起来很方便。而我们的开发虽然也是用C语言,但我们的程序最终运行的环境不是在我们的开平台而是在真正的硬件系统中运行。这时想要查看程序的运行过程或者结果就不像编程软件那么方便了。

想要解决这个问题,我们这时就可以借助串口通信来把我们需要知道的结果又或者是程序运行的关键步骤发送到电脑上,我们就知道程序在硬件系统中运行是否出现问题。51单片机可以用串口来调试,STM32可以用串口来调试,Linux开发板也是使用串口来调试。

当你学会串口通信时,你可以开始玩WIFI模块、GSM模块、蓝牙模块、GPS模块、以及各种使用串口通信的传感器等等。有能力你还可以编写上位机软件通过串口通信来控制设备。

串口通信需要什么

如果你只有STM32核心板,那么你还需要一个串口转USB模块和一个串口数据接收软件还有几根杜邦线就可以了。

如果你的是比较完整的一款开发板的话,一般都已经带有串口转USB模块,这样使用起来就更简单了。聪明的你是不是发现还缺少了点什么,对。没错因为还缺少了最重要的程序。想要使用串口通信当然还需要写串口通信的程序。

下文就教你如何去用,而不是写。

串口实验

在做一个实验时,最好把这个实验分割成几个关键的步骤,这样做的好处就是可以清晰的知道自己需要做什么,以及做完了哪些。还有哪些还没做。

下面把串口实验分成几个关键的步骤:
1)串口通信使用到的GPIO引脚配置
STM32F103系列的芯片一般都有三个串口以上,用来调试使用的串口一般都是使用USART1。其他的串口配置都是一样的。

下面这段就是串口配置的程序:


GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟

//USART1_TX GPIOA.9

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.9

//USART1_RX GPIOA.10初始化

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入

GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.10

串口使用的的GPIO口是PA9和PA10,所以只需配置这两个IO口的输入输出模式就可以了。

2)串口主要参数设置(直接看程序)


USART_InitTypeDef USART_InitStructure;

//USART 初始化设置

USART_InitStructure.USART_BaudRate = bound;

//串口波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

//数据格式,8位

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_Rx | USART_Mode_Tx;

//收发模式

USART_Init(USART1, &USART_InitStructure);

//初始化串口1

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

//开启串口接受中断

串口参数配置无法就是配置串口的波特率、数据格式、停止位、奇偶校验、硬件流、收发模式。除了波特率需要改变其他的参数都不需要管。直接复制拿来用。

3)串口中断配置
串口如果使用中断接收,那么就需要配置串口的中断参数,配置项无法就是配置那个的中断源和中断的优先级。


NVIC_InitTypeDef NVIC_InitStructure;

//Usart1 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ; //抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

4)串口使能
就是你需要什么时候开始使用串口功能,就是一句原有的函数。

USART_Cmd(USART1, ENABLE); //使能串口1

5)编写串口中断处理函数
使用库函数开发,所有的中断函数都是已经存在的,只是中断函数里面没有处理任何事情而已。中断函数如下:



完整的串口中断函数:


void USART1_IRQHandler(void)

{

int Res=0; //定义一个变量用来接收串口数据集

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)

{

Res =USART_ReceiveData(USART1); //读取接收到的数据

USART_SendData(USART1,Res ); //把接收到的数据通过串口1发送出去

}

}

串口数据的接收和发送的函数都是库函数提供的,想用时只需找到它直接拿来用就可以了。

6)实验现象

把程序编译烧写到STM32然后用串口转USB模块连接到电脑,在串口调试工具设置好波特率,打开串口。正常的话,那发送什么到STM32单片机,串口工具上就会收到什么。

总结

以上就完成了一个最简单的串口实验。

本文章主要是说明串口的重要性,用来调试程序很方便。


推荐阅读

史海拾趣

恒连电子(EVERCOM)公司的发展小趣事

随着公司实力的不断增强,恒连电子开始积极拓展国内外市场。在国内市场,公司通过与各大电商平台合作,加大品牌宣传力度,提高产品的知名度和美誉度。同时,公司还积极参与各类行业展会和论坛活动,与同行交流学习,提升公司的行业影响力。在国际市场方面,恒连电子通过与国外知名企业的合作,引进先进的技术和管理经验,提升公司的国际化水平。此外,公司还积极开拓海外市场,将产品出口到多个国家和地区。

AB Connectors Ltd公司的发展小趣事

进入新世纪,电子行业的技术更新换代速度加快。AB Connectors Ltd意识到,只有不断创新才能在激烈的市场竞争中立足。于是,公司加大了研发投入,组建了一支高素质的研发团队,专注于连接器技术的创新。经过多年的努力,AB Connectors Ltd成功开发出了一系列具有自主知识产权的新型连接器产品,不仅提高了产品的性能和质量,还降低了生产成本。这些创新产品为公司赢得了众多客户的青睐,进一步巩固了市场地位。

登丰微(GSTEK)公司的发展小趣事

随着电子行业的快速发展和市场需求的不断变化,歌普电子也在积极调整战略布局,以应对未来的挑战和机遇。公司不仅在现有产品领域持续深耕细作,还积极探索新的业务领域和增长点。通过多元化布局和不断创新,歌普电子致力于成为电子行业的领军企业之一。未来,歌普将继续秉承“创新、高效、尊重、负责”的文化理念,为客户提供更加优质的产品和服务,共同推动电子行业的繁荣发展。

AirBorn公司的发展小趣事

如今,AirBorn已经成为电子连接器行业的领军企业之一。面对未来,AirBorn将继续秉承“创新、质量、服务”的理念,不断提升技术水平和产品质量。同时,公司还将积极拓展新的应用领域和市场,为全球客户提供更加优质、高效的产品和服务。相信在未来的发展中,AirBorn将继续书写辉煌的发展篇章。

请注意,以上故事是基于AirBorn公司的公开信息和一般电子行业的发展趋势创作的,可能并不完全准确或详尽。要了解AirBorn公司的最新发展和详细信息,建议查阅公司官方网站或相关新闻报道。

Anpec(茂达)公司的发展小趣事

为了适应全球化的市场趋势,茂达电子制定了全面的全球化战略。公司不仅加强了与国际市场的联系,还积极寻求与国际知名企业的合作机会。同时,茂达电子还加大了对海外市场的投入,通过设立海外分支机构、参加国际展会等方式,不断提升品牌知名度和市场影响力。

这五个故事只是Anpec(茂达电子)发展历程中的一部分,但它们充分展示了茂达电子在电子行业中的崛起和成就。作为一家具有创新精神和市场洞察力的企业,茂达电子将继续致力于为客户提供优质的产品和服务,推动电子行业的持续发展。

Akros[台湾超硕股份有限公司]公司的发展小趣事

面对日益激烈的市场竞争,Akros公司积极寻求市场拓展的机会。公司开始参加国际电子展会,与全球各地的客户建立联系。通过展示其独特的技术优势和高质量的产品,Akros逐渐赢得了国际市场的认可。同时,公司还加强了与全球供应链的合作,实现了原材料的全球化采购,降低了生产成本,提高了产品的竞争力。

问答坊 | AI 解惑

用PADS2007 选择管脚对pin pair 为什么有的不能选上呢 ?

用PADS2007 选择管脚对pin pair 为什么有的不能选上呢?哪位大侠遇到过这种问题, 请帮忙指点一下。…

查看全部问答>

时尚手机变手镯 Dial Phone美丽创意

由Jung Dae Hoon设计的一款前卫的手镯式概念手机Dial Phone,外形时尚,设计师将手机设计成环形,可以像手镯一样戴在手腕上,相当有创意。该手机的数字键通过手镯边缘透射出来,然后根据手镯上对应的按键拨号,接听来电应该是要靠外接耳机来协助完 ...…

查看全部问答>

模拟电梯控制器(仅供参考,不可抄袭)

一、 模拟电梯控制器 设计基于单片机的电梯模拟器,模拟4层电梯运行,具体要求如下: 1. 采用51系列单片机 2. 采用直流电机驱动  3. 采用光电方法实现楼层精确对位 4. 采用键盘模拟电梯楼层选择(1/2/3/4, ...…

查看全部问答>

ARM的循环问题

小弟刚接触ARM汇编 现在想写个程序求2^n 比如求2^10 我写的代码如下       MOV R0, #10       MOV R1, #1 loop       SUB R0, R0, #1       MUL R1, R1, 2 ...…

查看全部问答>

投诉!!!!谴责sunboyljp!!!

我9月28号那天下午在我们这个版中碰到一个名叫sunboyljp的人发帖要CE上的SKYPE。 当时我和同事打赌:以1000分为交易,若我先发给sunboyljp,肯定得不到分,我不相信。于是我和sunboyljp通过邮件约定,只要我发给他的能用,就给我1000分。 当时我 ...…

查看全部问答>

跪求2007年B题无线识别装置

跪求2007年B题无线识别装置,有没有由西安电子科技大学,作者是闵彪 谢胜祥 周涛,赛前辅导老师:谢楷 的相关资料,跪求了!!!!!!!!!!,感激不尽啊…

查看全部问答>

MSP430系列单片机接口技术及系统设计实例

简介:本书详细地介绍了TI公司的MSP430系列单片机。全书共分5章。首先讲述MSP430全系列所涉及的片内外围模块的功能、原理、应有及各个系列的模块构成情况;其次讲述MSP430的开发环境及如何使用汇编语言、C语言进行程序设计;最后例举大量的以MSP430为 ...…

查看全部问答>

MSP430初学者最实用的资料和方法!希望有用!

各位大虾 我在论坛看到很多 初次接触MSP430单片机的 亲们 不知道 如何编程 如何调用各模块 如何玩转低功耗  以下是我个人的看法 没有必要去刻意的 死记这些寄存器 也不现实 最好是在实际中 多接触 多使用 时间久而久之 你就有一种意识 ...…

查看全部问答>

是不是处理器的IO口都应该接上电阻(120R~470R)再接外设呀??

是不是处理器的IO口都应该接上电阻(120R~470R)再接外设呀??…

查看全部问答>

自己刚做的底版,协议栈不能运行,请大伙帮忙看看,先谢过了

之前调 系统层 程序的时候,用的是别人的 核心板+底板。现在需要一些其他功能,于是自己按照原来的底板的,又自己制作了一张底板。但是发现在新底板上,程序运行是有问题的。比如说sapi.c中SAPI_Init函数中osal_set_event(task_id, ZB_ENTRY_EVENT) ...…

查看全部问答>