嵌入式开发学习之--串口通讯(上)

简介: 嵌入式开发学习之--串口通讯(上)

嵌入式开发学习之--串口通讯(上)


提示:本篇开始学习各种通讯方式,重中之重。

文章目录

前言

一、 串口通讯协议简介

1.1 物理层

1.2 协议层

1.2.1 基本组成。

1.2.2 波特率

1.2.3 起始和终止位

1.2.4 有效数据

1.2.5 数据校验

二、USART结构体详解

总结

前言

 作为一个嵌入式的开发者,解析信息、传递信息是十分重要的,前面一篇大致介绍了通讯的概念,这一篇一个很常用的通讯方式——串口通讯。

 提示:以下是本篇文章正文内容,下面案例可供参考

一、 串口通讯协议简介

 首先,对串口通讯协议我们分为物理层和协议层两个层面来理解,物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输,比如有几根线,电压多少等等。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准,比如帧头帧尾校验位等等。

1.1 物理层

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

我们知道常见的电子电路中常使用 TTL 的电平标准,理想状态下,使用 5V 表示二进制逻辑 1,使用 0V 表示逻辑 0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V 表示逻辑 1,+15V 表示逻辑 0。

 因为控制器一般使用 TTL 电平标准,所以常常会使用 MA3232 芯片对 TTL 及 RS-232电平的信号进行互相转换。

 下图是db9接口线序,只需要知道rx,tx,gnd位置就好了。其他的没用。

1.2 协议层

1.2.1 基本组成。

 串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成。

1.2.2 波特率

 异步通讯中由于没有时钟信号(如前面讲解的 DB9接口中是没有时钟信号的),所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码,图 20-6 中用虚线分开的每一格就是代表一个码元。

1.2.3 起始和终止位

 串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停止信号可由 0.5、1、1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。

1.2.4 有效数据

 在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为 5、6、7 或 8 位长。

1.2.5 数据校验

 校验方式主要包含:校验方法有奇校验(odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。

 奇校验:要求有效数据和校验位中“1”的个数为奇数,比如一个 8 位长的有效数据为:01101001,此时总共有 4 个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是 8 位的有效数据加上 1 位的校验位总共 9 位。

 偶校验:与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数,比如

数据帧:11001010,此时数据帧“1”的个数为 4 个,所以偶校验位为“0”。

  0 校验:是不管有效数据中的内容是什么校验位总为“0”,1 校验是校验位总为“1”。

 无校验:的情况下,数据包中不包含校验位。

二、USART结构体详解

 标准库函数对每个外设都建立了初始化结构体,如USART_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如 USART_Init()调用,这些设定参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。

 初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如了。初始化结构体定义在 stm32f4xx_usart.h 文件中,初始化库函数定义在 stm32f4xx_usart.c 文件中,编程时我们可以结合这两个文件内注释使用。

 USART 初始化结构体

1 typedef struct {
2     uint32_t USART_BaudRate;      // 波特率
3     uint16_t USART_WordLength;    // 字长
4     uint16_t USART_StopBits;      // 停止位
5     uint16_t USART_Parity;        // 校验位
6     uint16_t USART_Mode;          // USART 模式
7     uint16_t USART_HardwareFlowControl;    // 硬件流控制
8 } USART_InitTypeDef;

1、USART_BaudRate:波特率设置。一般设置为 2400、9600、19200、115200。

 2、USART_WordLength:数据帧字长,可选 8 位或 9 位。它设定USART

_CR1 寄存器的 M 位的值。如果没有使能奇偶校验控制,一般使用 8 数据位;如果使能了奇偶校验则一般设置为 9 数据位。

 3、USART_StopBits:停止位设置,可选 0.5 个、1 个、1.5 个和 2 个停止位,它设定USART_CR2 寄存器的 STOP[1:0]位的值,一般我们选择 1 个停止位。

 4、USART_Parity : 奇 偶 校 验 控 制 选 择 , 可 选 USART_Parity_No( 无校验 ) 、USART_Parity_Even( 偶校验 ) 以 及 USART_Parity_Odd( 奇 校 验 ) , 它 设 定USART_CR1 寄存器的 PCE 位和 PS 位的值。

 5、USART_Mode:USART 模式选择,有 USART_Mode_Rx 和 USART_ Mode_Tx,允许使用逻辑或运算选择两个,它设定 USART_CR1 寄存器的 RE 位和 TE 位。

 6、 USART_HardwareFlowControl:硬件流控制选择,只有在硬件流控制模式才有效,可选使能 RTS、使能 CTS、同时使能 RTS 和 CTS、不使能硬件流。

 USART 时钟初始化结构体

1 typedef struct {
2     uint16_t USART_Clock;    // 时钟使能控制
3     uint16_t USART_CPOL;     // 时钟极性
4     uint16_t USART_CPHA;     // 时钟相位
5     uint16_t USART_LastBit;  // 最尾位时钟脉冲
6 } USART_ClockInitTypeDef;

1、 USART_Clock:同步模式下 SCLK 引脚上时钟输出使能控制,可选禁止时钟输出(USART_Clock_Disable)或开启时钟输出(USART_Clock_Enable);如果使用同步模式发送,一般都需要开启时钟设定 USART_CR2 寄存器CLKEN 位的值。

 2、USART_CPOL:同步模式下 SCLK 引脚上输出时钟极性设置,可设置在空闲时SCLK 引脚为低电平(USART_CPOL_Low)或高电(USART_CPOL_ High)。它设定 USART_CR2 寄存器的 CPOL 位的值。

 3、 USART_CPHA:同步模式下 SCLK 引脚上输出时钟相位设置,可设置在时钟第一个变化沿捕获数据(USART_CPHA_1Edge)或在时钟第二个变化沿捕获数据。它设定 USART_CR2 寄存器的 CPHA 位的值。USART_CPHA 与 USART_CPOL 配合使用可以获得多种模式时钟关系。

 4、USART_LastBit:选择在发送最后一个数据位的时候时钟脉冲是否在 SCLK 引脚输 出 , 可 以 是 不 输 出 脉 冲 (USART_LastBit_Disable)、 输 出 脉 冲(USART_LastBit_Enable)。它设定 USART_CR2 寄存器的 LBCL 位的值。

总结

 本篇主要从硬件层和协议层了解了串口协议,知道了串口协议大体是个什么东西,最后学习了串口的结构体配置,这个是很重要的,配置串口通信全靠它。下一篇,做一个关于串口的实验。

相关文章
|
Linux API 芯片
POWERLINK协议在stm32单片机+w5500移植成功经验分享
POWERLINK协议在stm32单片机+w5500移植成功经验分享
|
存储 Java 数据安全/隐私保护
嵌入式开发学习之--串口通讯(下)
嵌入式开发学习之--串口通讯(下)
嵌入式开发学习之--串口通讯(下)
|
存储 缓存 内存技术
嵌入式开发学习之--DMA(上)
嵌入式开发学习之--DMA(上)
嵌入式开发学习之--DMA(上)
|
前端开发
嵌入式开发学习之--RCC(下)
嵌入式开发学习之--RCC(下)
嵌入式开发学习之--RCC(下)
嵌入式开发学习之--RCC(上)
嵌入式开发学习之--RCC(上)
嵌入式开发学习之--RCC(上)
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架
199 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架
|
Linux
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十九)驱动进化之路:总线设备驱动模型
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十九)驱动进化之路:总线设备驱动模型
187 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十九)驱动进化之路:总线设备驱动模型
|
Linux 芯片
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十一)驱动进化之路:设备树的引入及简明教程(下)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十一)驱动进化之路:设备树的引入及简明教程
241 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十一)驱动进化之路:设备树的引入及简明教程(下)
|
Ubuntu Linux 程序员
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十一)驱动进化之路:设备树的引入及简明教程(中)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十一)驱动进化之路:设备树的引入及简明教程
782 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十一)驱动进化之路:设备树的引入及简明教程(中)
|
Linux 芯片
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十一)驱动进化之路:设备树的引入及简明教程(上)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十一)驱动进化之路:设备树的引入及简明教程
453 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十一)驱动进化之路:设备树的引入及简明教程(上)