uart通信与编程

串口、com口、uart、TTL、RS232、RS485的区别

串口、com口、uart、TTL、RS232、RS485的区别
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

典型RS485通讯电路(带隔离)

https://blog.csdn.net/zhenxing2000/article/details/50545394/
在这里插入图片描述
图中虚线左侧为单片机的电源网络,右侧为RS485的电源网络,两者通过光耦和双通道数字隔离芯片ADuM1201实现隔离。电平转换芯片采用MAX3082实现,电阻R61将总线A上拉到电源,电阻R62将总线B下拉到地,因为RS485得A,B之间的电平只有0.3V-0.4V之间的差别,上下拉电阻可以保证在通信的过程中A,B线不会因电平差别太小而出现乱码的情况。

RS485只要A、B差分线,为什么有三根线?
答:第三根线是地线

UART协议详解

UART协议详解

RS485与RS232编程区别

https://blog.csdn.net/weixin_34104341/article/details/92792896
RS485与RS232的区别:

RS232是全双工通信的,在数据进行发送的时候,也可以进行接收数据,只是你可能你会觉得不清楚,比如在应用程序,你去操作串口写的同时,你并没有感觉到能读到串口的数据,因为CPU如果是单核的,CPU只有一个大脑,只有一个人在进行工作,所以你会感觉到你去操作串口写的时候,你读取不到串口来的数据,因为指令是一条一条运行的,只有一个人在工作。但是RS232又是全双工的,在数据发的时候,是可以接收数据的,这一点可以体现在硬件上,如果你在应用程序中感觉不出来的话,在应用程序中你去操作串口进行发数据,同时这个时刻对方也像你进行发数据了,你虽然在同一时刻在应用程序中读取不到这个数据,但是在硬件中,对方发来的数据已经被读取到了硬件的串口的读缓存区中。当应用程序串口发操作结束后,去读取串口数据的时候,就会从硬件串口的缓存区中将你发的同时对方发过来的数据,与对方后续发过来的数据,读取到。这就是RS232.全双工的体现,在应用程序中与硬件中的体现。

RS485是半双工通信的,在数据进行发送的时候,是读取不了数据的,在数据进行读数据的时候,是发送不了数据的,这一点体现在软件上,就是当你发送数据的时候,在你发送数据之前要将表示RS485能发数据的那个引脚给拉高或拉低,来切换状态到发数据状态,因为RS485是半双工,所以读状态和发状态要分清,所以有了表示RS485发送与接收状态的引脚,用拉高或拉低表示。当你发送数据之前,给这个引脚拉高或拉低,然后你调用写函数去进行将数据发串口,掉用完这个函数后,你要记得去延时一段时间后,在去将引脚拉高或拉低来切换成RS485读状态,因为如果你的数据还没有全部通过串口发送完毕,你就在硬件的写缓存区中,数据还在发送呢,但是在应用程序中,你的写函数已经返回了,但你却将RS485引脚切换成读状态了,这时在硬件层,发现485为读状态,就会切换成485读模式,而你的数据在硬件缓存区中即使没有发送完毕也发送不了了,因为硬件上已经给堵住了这条路。所以当你调用完串口写函数时,一定要延时一段时间后在去将引脚拉高或拉低来切换到485读状态,这个延时的时间,是根据你要发送多少数据,也就是数据的长度和串口的波特率与这个数据在介质中传输的时候是否包含校验位与停止位,因为如果包含了停止位于校验位,你的数据长度要将上这两位,因为你在发送的时候发送的只是数据区,长度是你发送的数据区的长度,但是在介质中传输的时候,还有可能有其他位的存在,你要考虑进去。之后根据发送的实际长度与当前串口的波特率,来算出这个要延时的时间。再每次调用完写串口函数后都要去延时这个时间后,在去将引脚拉高或拉低来切换到读状态。防止数据没有发送,你就不让他发送了,同时这个延时的时间也不能随意的给长,因为可能你在延时了那么长时间的间隔中,对方已经将数据发送给你了,但是你还是为发状态,并读不了他此时给你发过来的数据,这也就是为什么,这个延时的时间要拿发送的实际数据包括是否考虑停止位校验位,与波特率去进行计算的缘由了。

总之:在工程上,如果一个串口,是RS232/RS485共用的话,你在程序上要按照RS485的方式去进行操作,因为RS485的程序跑在RS232上市没有问题的,但是RS232的方式操作串口的程序,用在RS485的情况下是不合适的。

串口的单线半双工模式(stm32f10x系列)—有硬件连接与代码

stm32串口编程(rs232全双工模式)

STM32F103 USART1串口重映射功能的实现

STM32 ——端口复用和重映射

首先来说下什么是端口复用。

STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。
其实说白了,简单易懂的说,就是某些普通的外设引脚也可以用来其它功能。比如说那我使用的正点原子哥的板子来说吧,串口1 的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作普通的GPIO口,而用做复用功能串口1的发送接收引脚的时候,叫端口复用。

uart复用配置步骤
打开时钟(RCC配置)
由于UART对应的GPIO都挂在APB2桥上,因此采用固件库函数RCC_APB2PeriphClockCmd()进行初始化。UARTx需要分情况讨论,如果是UART1,则挂在APB2桥上,因此采用RCC_APB2PeriphClockCmd()进行初始化,其余的UART2~5均挂在APB1上。
GPIO配置
GPIO的属性包含在结构体GPIO_InitTypeDef,其中对于TX引脚,GPIO_Mode字段设置为GPIO_Mode_AF_PP(复用推挽输出),GPIO_Speed切换速率设置为GPIO_Speed_50MHz;对于RX引脚,GPIO_Mode字段设置为GPIO_Mode_IN_FLOATING(浮空输入),不需要设置切换速率。最后通过GPIO_Init()使能IO口。
NVIC配置
STM32在只有一个中断的情况下,仍然需要配置优先级,其作用是使能某条中断的触发通道。STM32的中断有至多两个层次,分别是抢占优先级(主优先级)和子优先级(从优先级),而整个优先级设置参数的长度为4位,因此需要首先划分抢占优先级位数和子优先级位数,通过NVIC_PriorityGroupConfig()实现;
特定设备的中断优先级NVIC的属性包含在结构体NVIC_InitTypeDef中,其中字段NVIC_IRQChannel包含了设备的中断向量,保存在启动代码中;字段NVIC_IRQChannelPreemptionPriority为主优先级NVIC_IRQChannelSubPriority为从优先级,取值的范围应根据位数划分的情况而定;最后NVIC_IRQChannelCmd字段是是否使能,一般置为ENABLE。最后通过NVIC_Init()来使能这一中断向量。
USART配置
通过结构体USART_InitTypeDef来确定。UART模式下的字段如下:
USART_BaudRate:波特率(每秒能传输的数据位),缺省值为9600。
USART_WordLength:字长
USART_StopBits:停止位
USART_Parity:校验方式(奇偶校验)
USART_HardwareFlowControl:硬件流控制
USART_Mode:单/双工,即收发状态。
最后通过USART_Init()来设置。

接下来说下什么是重映射。

每个内置外设都有若干个输入输出引脚,一般这些引脚的输出端口都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。
为了使不同器件封装的外设IO功能数量达到最优,可以把一些复用功能重新映射到其他一些引脚上。STM32中有很多内置外设的输入输出引脚都具有重映射(remap)的功能。
打个比方说,串口1的TX,RX引脚是在PA9,和PA10端口,但是同时它有两个映射端口PB6,PB7。开启重映射,PB6和PB7同样可以使用串口1。

stm32的UART编程与串口配置

串口配置

第十章:STM32串口USART1的使用方法和程序

由于UART对应的GPIO都挂在APB2桥上,因此采用固件库函数RCC_APB2PeriphClockCmd()进行初始化。UARTx需要分情况讨论,如果是UART1,则挂在APB2桥上,因此采用RCC_APB2PeriphClockCmd()进行初始化,其余的UART2~5均挂在APB1上。

uart复用配置步骤
打开时钟(RCC配置)
由于UART对应的GPIO都挂在APB2桥上,因此采用固件库函数RCC_APB2PeriphClockCmd()进行初始化。UARTx需要分情况讨论,如果是UART1,则挂在APB2桥上,因此采用RCC_APB2PeriphClockCmd()进行初始化,其余的UART2~5均挂在APB1上。
GPIO配置
GPIO的属性包含在结构体GPIO_InitTypeDef,其中对于TX引脚,GPIO_Mode字段设置为GPIO_Mode_AF_PP(复用推挽输出),GPIO_Speed切换速率设置为GPIO_Speed_50MHz;对于RX引脚,GPIO_Mode字段设置为GPIO_Mode_IN_FLOATING(浮空输入),不需要设置切换速率。最后通过GPIO_Init()使能IO口。
NVIC配置
STM32在只有一个中断的情况下,仍然需要配置优先级,其作用是使能某条中断的触发通道。STM32的中断有至多两个层次,分别是抢占优先级(主优先级)和子优先级(从优先级),而整个优先级设置参数的长度为4位,因此需要首先划分抢占优先级位数和子优先级位数,通过NVIC_PriorityGroupConfig()实现;
特定设备的中断优先级NVIC的属性包含在结构体NVIC_InitTypeDef中,其中字段NVIC_IRQChannel包含了设备的中断向量,保存在启动代码中;字段NVIC_IRQChannelPreemptionPriority为主优先级NVIC_IRQChannelSubPriority为从优先级,取值的范围应根据位数划分的情况而定;最后NVIC_IRQChannelCmd字段是是否使能,一般置为ENABLE。最后通过NVIC_Init()来使能这一中断向量。
USART配置
通过结构体USART_InitTypeDef来确定。UART模式下的字段如下:
USART_BaudRate:波特率(每秒能传输的数据位),缺省值为9600。
USART_WordLength:字长
USART_StopBits:停止位
USART_Parity:校验方式(奇偶校验)
USART_HardwareFlowControl:硬件流控制
USART_Mode:单/双工,即收发状态。
最后通过USART_Init()来设置。

STM32串口通信配置(USART1+USART2+USART3+UART4)

UART学习之路(三)基于STM32F103的USART实验

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值