基于STM32之UART串口通信协议(一)详解

一、前言

1、简介

  写的这篇博客,是为了简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作,在后面我会以我使用的STM32F429开发板来举例讲解(其他STM32系列芯片大多数都可以按照这些步骤来操作的),如有不足请多多指教。

2、UART简介

  嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)。

3、准备工作

1)Keil5

  链接:点击下载
  提取码:wrt9

2)STMCubeMX5.1.0版本

  链接:点击下载
  提取码:20xs

3)STMF429开发板

  

注:

  只要是stm32的开发板都可以用到的,在STM32CubeMx里选对型号、配置好就行了。

二、UART详解

1、UART简介

  嵌入式开发中,UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输,它能将要传输的资料在串行通信与并行通信之间加以转换,能够灵活地与外部设备进行全双工数据交换。

注:

  在此开发板中,是有USART(Universal Synchronous Asynchronous Receiver and Transmitter通用同步异步收发器)串口的,USART相当于UART的升级版,USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此一般的单片机UART和USART使用方式是一样的,都使用异步模式。因为USART的使用方法上跟UART基本相同,所以在此就以UART来讲该通信协议了。

2、UART通信协议

1)起始位

  当未有数据发送时,数据线处于逻辑“1”状态;先发出一个逻辑“0”信号,表示开始传输字符。

2)数据位

  紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。

3)奇偶校验位

  资料为加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

4)停止位

  它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

5)空闲位或起始位

  处于逻辑“1”状态,表示当前线路上没有资料传送,进入空闲状态。

  处于逻辑“0”状态,表示开始传送下一数据段。

6)波特率

  表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。

  常用的波特率有:9600、115200……

  时间间隔计算:1秒除以波特率得出的时间,例如,波特率为9600的时间间隔为1s / 9600(波特率) = 104us。

3、UART功能说明

  接口通过三个引脚从外部连接到其它设备。任何 USART 双向通信均需要 至少两个引脚:接收数据输入引脚 (RX) 和发送数据引脚输出 (TX):
  RX:接收数据输入引脚就是串行数据输入引脚。过采样技术可区分有效输入数据和噪声,从而用于恢复数据。
  TX:发送数据输出引脚。如果关闭发送器,该输出引脚模式由其 I/O 端口配置决定。如果使 能了发送器但没有待发

  • 12
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
【资源说明】 基于stm32uart串口modbus通讯协议源码+说明文档.zip modbus-RTU协议 **Modbus报文帧结构** 一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据 Modbus协议在串行链路上的报文格式如下所示: ![image](https://github.com/KeyL-SJ/stm32_uart_modbus/assets/78483846/bcec2fe4-3a28-42b3-b2aa-8d75f8fe1f36) | 从机地址 | 功能码 | 数据 | CRC校验 | | :------: | :----: | :-----: | :-----: | | 1 byte | 1 byte | N bytes | 2 bytes | **帧结构 = 从机地址 + 功能吗 + 数据 + 校验** - 从机地址: 每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答) - 功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能. - 数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。 - 校验: 在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确 # Modbus功能码 **Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,也就是指代码。** Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示: | 功能码 | 功能说明 | | :----: | :------------: | | 01H | 读取输出线圈 | | 02H | 读取输入线圈 | | 03H | 读取保持寄存器 | | 04H | 读取输入寄存器 | | 05H | 写入单线圈 | | 06H | 写入单寄存器 | | 0FH | 写入多线圈 | | 10H | 写入多寄存器 | 当然我们用的最多的就是03和06 一个是读取数据,一个是修改数据。 # CRC校验 **错误校验(CRC)域占用两个字节包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。** 例如若主机向从机发送报文`01 03 00 00 00 01 84 0A` 其中, 最后两个字节`84 0A`就是CRC校验位,从机接收到主机发送的报文之后,根据报文的非校验位`01 03 00 00 00 01`计算CRC校验位,若从机计算出的校验位与主机发送的校验位相同,则证明数据在发送的过程中没有发生错误,反之,则代表数据传输发生错误。 ## CRC校验流程 1、预置一个16位寄存器为`0FFFFH`(全1),称之为CRC寄存器。 2 、把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。 3、将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。 4 、如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值`0A001H`进行异或运算。 5、重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。 6 、重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。 7、最终CRC寄存器的值就是CRC的值。 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
# 基于stm32uart串口modbus通讯协议 # modbus-RTU协议 **Modbus报文帧结构** 一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据 Modbus协议在串行链路上的报文格式如下所示: | 从机地址 | 功能码 | 数据 | CRC校验 | | :------: | :----: | :-----: | :-----: | | 1 byte | 1 byte | N bytes | 2 bytes | **帧结构 = 从机地址 + 功能吗 + 数据 + 校验** - 从机地址: 每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答) - 功能码: 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能. - 数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。 - 校验: 在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确 # Modbus功能码 **Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,也就是指代码。** Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示: | 功能码 | 功能说明 | | :----: | :------------: | | 01H | 读取输出线圈 | | 02H | 读取输入线圈 | | 03H | 读取保持寄存器 | | 04H | 读取输入寄存器 | | 05H | 写入单线圈 | | 06H | 写入单寄存器 | | 0FH | 写入多线圈 | | 10H | 写入多寄存器 | 当然我们用的最多的就是03和06 一个是读取数据,一个是修改数据。 # CRC校验 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
UART(Universal Asynchronous Receiver-Transmitter)是一种常见的串口通信协议,常用于将数据从一个设备传输到另一个设备,如将数据从计算机发送到外部设备,或者在嵌入式系统中进行设备之间的通信。下面是UART串口通信协议详解: 1. 物理连接:UART通信使用两根信号线,一根用于传输数据(TX线),一根用于接收数据(RX线)。这两根线连接在两个设备之间,其中TX线与对方的RX线相连,RX线与对方的TX线相连。 2. 数据传输:UART是一种异步通信协议,数据通过一个字节一个字节地传输。每个字节由起始位(Start bit)、数据位(Data bits)、可选的校验位(Parity bit)和停止位(Stop bit)组成。 - 起始位:起始位用于标识一个数据传输的开始,它是一个低电平信号。 - 数据位:数据位用于传输实际的数据,通常有8位或9位数据位可供选择。 - 校验位:校验位用于检测数据传输过程中的错误。常见的校验方式有奇偶校验、偶校验和无校验。 - 停止位:停止位用于标识一个数据传输的结束,它是一个高电平信号。通常有1位或2位停止位可供选择。 3. 波特率:UART通信中的波特率(Baud rate)表示单位时间内传输的比特数。常见的波特率有9600、115200等,波特率越高,传输速率越快。 4. 通信模式:UART通信可以在全双工或半双工模式下进行。在全双工模式下,两个设备可以同时发送和接收数据;在半双工模式下,两个设备交替发送和接收数据。 5. 数据流控制:UART通信中可以使用硬件流控制或软件流控制来控制数据的传输。硬件流控制通过额外的信号线实现,如RTS(Request to Send)和CTS(Clear to Send)信号线;软件流控制通过特定的数据字节来实现,如XON和XOFF字符。 总结起来,UART串口通信协议是一种常见的异步串口通信协议,通过起始位、数据位、校验位和停止位来传输数据。它可以使用不同的波特率和通信模式,并支持硬件或软件流控制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值