0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32串口通信简明知识

jf_pJlTbmA9 来源:STM32嵌入式开发 作者:STM32嵌入式开发 2023-10-25 15:48 次阅读

什么是串口通讯?

串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。

典型的串口通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,所以端口能够在一根线上发送数据同时在另一根线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,这也是能够实现串口通讯的前提。如下是串行通讯示数据传输意图。

poYBAGGSOQCAN5_sAAAbxGV_uUc387.png

串口通讯的通讯协议

最初数据是模拟信号输出简单过程量,后来仪表接口出现了RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能,这就促生了RS485

我们知道串口通信的数据传输都是0和1,在单总线、I2CUART中都是通过一根线的高低电平来判断逻辑1或者逻辑0,但这种信号线的GND再与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。所以差分通信、支持多机通信、抗干扰强的RS485就被广泛的使用了。

RS485通信最大特点就是传输速度可以达到10Mb/s以上,传输距离可以达到3000米左右。大家需要注意的是虽然485最大速度和最大传输距离都很大,但是传输的速度是会随距离的增加而变慢的,所以两者是不可以兼得的。

串口通讯的物理层

串口通讯的物理层有很多标准,例如上面提到的,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。

poYBAGGSOQGAMFhSAACuJnG1VJs266.png

在上面的通讯方式中,两个通讯设备的"DB9接口"之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。

下图为DB9标准串口通讯接口:

pYYBAGGSOQOAVMq2AAE2pgLX83A536.png

DB9引脚说明:

pYYBAGGSOQSAMHGFAACKGKtdHjY166.png

上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用"直通型"的串口线连接起来即可。

wKgZomUDxQ2AApZHAAEPbkrvIaI357.png

串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。

波特率

波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示。

poYBAGGSOQeAWl8CAAA_iOmRihA798.png

比如波特率为9600bps;代表的就是每秒中传输9600bit,也就是相当于每一秒中划分成了9600等份。

因此,那么每1bit的时间就是1/9600秒=104.1666...us。约0.1ms。既然是9600等份,即每1bit紧接着下一个比特,不存在额外的间隔。两台设备要想实现串口通讯,这收发端设置的波特率必须相同,否则是没办法实现通讯的:动图演示常用通信协议原理。

收发波特率一致可以实现通讯:

wKgaomREozyAEC87AAAtrk-E2iI532.jpg

收发波特率不一致,导致RX端不能正常接收:

wKgZomREozyAajfSAAAgToKpNrs333.jpg

串口通讯的数据结构

wKgZomUDxRSAfbwcAABJJSl1aeg272.png

起始位:起始位必须是持续一个比特时间的逻辑0电平,标志传输一个字符的开始,接收方可用起始位使自己的接收时钟与发送方的数据同步。

数据位:数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定。传输数据时先传送字符的低位,后传送字符的高位。

奇偶校验位:奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。

停止位:停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是逻辑1电平,标志着传输一个字符的结束。

空闲位:空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。

单双工通讯

单工:数据传输只支持数据在一个方向上传输;

半双工:允许数据在两个方向上传输,但某一时刻只允许数据在一个方向上传输,实际上是一种切换方向的单工通信,不需要独立的接收端和发送端,两者可合并为一个端口;

全双工:允许数据同时在两个方向上传输,因此全双工通信是两个单工方式的结合,需要独立的接收端和发送端。

poYBAGGSOQqAVGdjAAFsx0MRWn8644.png

STM32中的串口通讯

STM32串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器),对于大容量STM32F10x系列芯片,分别由3个USART和两个UART。

pYYBAGGSOQyAVq_1AABTBMG6eqk130.png

TXD:数据发送引脚;

RXD:数据输入引脚

对于两芯片的间的连接,两个芯片GND共地,同时TXD和RXD交叉连接,这样两个芯片间可进行TTL电平通信。

但如果对于芯片和PC机相连,除了共地条件外,不能使用如上的直接交叉连接,虽然两者都有TXD和RXD引脚,但通常PC机使用的是RS232接口(9针),通常是TXC和RXD经过电平转换得到,故如果要使芯片与PC机的RS232接口直接通信,需要将芯片的输入输出端口也电平转换为RS232类型,再交叉连接。

二者的电平标准不同:

单片机的点评标准(TTL电平):+5V表示1,0V表示0;

RS232电平标准:+15/+13V表示0,-15/-13表示1。

wKgaomUDxRiAAuoQAACKfhmI81U456.png

因此单片机与PC机进行串口通信应该遵循:在单片机串口与上位机给出的RS232口之间,通过电平转换电路实现TTL电平与RS232电平间的转换。如果使用USB转串口也可以实现串口通讯,USB转串口电路图如下所示。

poYBAGGSOQ-AA_RBAAD60Hk8Gss325.png

STM32中串口通讯已经给大家建好了相应的库函数,大家在使用和配置串口的时候直接进行调用库函数和配置就行了

请大家参照一下代码:

1、初始化结构体代码

typedefstruct
{
uint32_tUSART_BaudRate;//波特率
uint16_tUSART_WordLength;//字长
uint16_tUSART_StopBits;//停止位
uint16_tUSART_Parity;//校验位
uint16_tUSART_Mode;//USART模式
uint16_tUSART_HardwareFlowControl;//硬件流控制
}USART_InitTypeDef;

2、NVIC配置中断优先级

NVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;

/*嵌套向量中断控制器组选择*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

/*配置USART为中断源*/
NVIC_InitStructure.NVIC_IRQChannel=DEBUG_USART_IRQ;
/*抢断优先级*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
/*子优先级*/
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
/*使能中断*/
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
/*初始化配置NVIC*/
NVIC_Init( NVIC_InitStructure);
}

3、USART配置函数

voidDEBUG_USART_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
USART_InitTypeDefUSART_InitStructure;
/*第一步:初始化GPIO*/
//打开串口GPIO的时钟
DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK,ENABLE);
//将USARTTx的GPIO配置为推挽复用模式
GPIO_InitStructure.GPIO_Pin=DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, GPIO_InitStructure);

//将USARTRx的GPIO配置为浮空输入模式
GPIO_InitStructure.GPIO_Pin=DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, GPIO_InitStructure);

/*第二步:配置串口的初始化结构体*/
//打开串口外设的时钟
DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK,ENABLE);
//配置串口的工作参数
//配置波特率
USART_InitStructure.USART_BaudRate=DEBUG_USART_BAUDRATE;
//配置针数据字长
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_Rx|USART_Mode_Tx;
//完成串口的初始化配置
USART_Init(DEBUG_USARTx, USART_InitStructure);

/*--------------------------------------------------------*/
//串口中断优先级配置
NVIC_Configuration();

//使能串口接收中断
USART_ITConfig(DEBUG_USARTx,USART_IT_RXNE,ENABLE);
/*--------------------------------------------------------*/

/*第三步:使能串口*/
//使能串口
USART_Cmd(DEBUG_USARTx,ENABLE);
}

来源:STM32嵌入式开发

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354692
  • 端口
    +关注

    关注

    4

    文章

    953

    浏览量

    32008
  • 串口通信
    +关注

    关注

    34

    文章

    1609

    浏览量

    55409
收藏 人收藏

    评论

    相关推荐

    RS232串口通信中常见问题及解决办法

    RS232串口通信中常见问题及解决办法主要包括以下几个方面: 一、物理连接问题 问题 :串口线未插稳或接口松动。 解决办法 :重新插拔串口线,确保连接牢固。同时检查插头和针脚是否损坏,
    的头像 发表于 11-21 09:32 162次阅读

    RS232串口通信协议详解

    在计算机硬件和通信领域,RS-232串口通信协议是一个历史悠久且广泛使用的标准。它允许计算机通过串行接口与各种外部设备进行通信,如调制解调器、鼠标、打印机等。 RS-232的历史和定义
    的头像 发表于 11-21 09:24 139次阅读

    FT232芯片设计的USB转RS232串口原理图

    FT232芯片设计的USB转RS232串口原理图
    发表于 10-21 11:06 0次下载

    快速实现C2000串口程序升级

    电子发烧友网站提供《快速实现C2000串口程序升级.pdf》资料免费下载
    发表于 08-29 10:50 0次下载
    快速实现C2000<b class='flag-5'>串口</b>程序升级

    集特推荐 双网10串口飞腾FT2000商用台式电脑主机

    前段时间为大家分享了国产龙芯、海光、飞腾D2000的商务台式机,它们的共同特点都是单网,1个RS232串口。今天就为大家推荐一款双网、可扩展10串口、14USB接口的飞腾FT200
    的头像 发表于 07-17 16:04 481次阅读
    集特推荐  双网10<b class='flag-5'>串口</b>飞腾FT2000商用台式电脑主机

    STM32串口通信入门!附通信编程示例

    串行通信与并行通信设备之间的通信方式可以分为串行通信和并行通信,这两种通信方式各有优缺点。串行
    的头像 发表于 07-05 08:21 2092次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b>入门!附<b class='flag-5'>通信</b>编程示例

    用esp32的串口Stm32F407串口通讯,通过TJA转CAN,结果esp32串口读到的一直是自己发的数据,为什么?

    我用esp32的串口Stm32F407串口通讯,通过TJA转CAN。结果esp32串口读到的一直是自己发的数据,各位大神给我看看哪里有问题么
    发表于 06-19 07:00

    485串口可以用can协议吗

    一、引言 随着工业自动化和智能控制技术的发展,通信协议在设备间数据传输和控制中扮演着越来越重要的角色。485串口和CAN协议是两种常见的通信协议,它们在不同的应用场景中发挥着重要作用。本文将对这两种
    的头像 发表于 06-16 09:21 1064次阅读

    STM32做以太网转4串口单核能做吗?

    目前要做一个以太网转4串口透传模块,一个STM32能搞定吗?是不是需要什么内核、?求解~~对内核了解不多,裸机100年
    发表于 05-13 07:27

    STM32G031k8t6串口发送为什么会进入硬件中断?

    STM32G031k8t6串口发送进入硬件中断
    发表于 03-13 07:59

    物通博联485转换网关:实现设备485串口数据转换为Modbus TCP协议

    随着工业自动化技术的不断发展,各种通信协议和接口标准在工业设备中的应用越来越广泛。其中,485串口和Modbus TCP协议是两种常见的通信协议,广泛应用于各种工业自动化设备和系统。传统的485
    的头像 发表于 03-04 17:10 1428次阅读
    物通博联485转换网关:实现设备485<b class='flag-5'>串口</b>数据转换为Modbus TCP协议

    ZDP1440串口屏应用开发如何使用虚拟串口调试

    ZDP1440串口屏应用开发如何使用虚拟串口调试呢?本文将详细方法分享给大家。
    的头像 发表于 01-25 11:32 1600次阅读
    ZDP1440<b class='flag-5'>串口</b>屏应用开发如何使用虚拟<b class='flag-5'>串口</b>调试

    stm32串口接收中断触发原理

    配置串口接收中断使能:在初始化串口时,需要设置相应的控制寄存器来使能串口接收中断。这通常可以通过设置相应的标志位或使用特定的寄存器位来完成。
    发表于 01-17 15:42 7850次阅读
    <b class='flag-5'>stm32</b><b class='flag-5'>串口</b>接收中断触发原理

    什么是RS-232串口?消费级电脑通常没有232串口的主要原因

    什么是RS-232串口?消费级电脑通常没有232串口的主要原因  RS-232串口是一种标准的串行通信接口,用于在计算机和外部设备之间传输数据,目的是为计算机和外部设备之间提供可靠的数
    的头像 发表于 01-09 13:52 1049次阅读

    智能车ROS与STM32串口通信代码

    这里以一个智能车代码工程为例,抽取串口通信部分代码 在头文件中,进行串口头文件的包含 # include 在类的定义中,什么一个 serial 类的实例 serial::Serial
    的头像 发表于 11-26 17:47 1128次阅读