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

文章目录

  • 前言
  • 一、 串口通讯协议简介
    • 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 位的值。


总结

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

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

  1. 嵌入式开发学习之--RCC(上)

    提示:本篇主要介绍一下不同时钟的特性和作用,了解为主. 文章目录 前言 一.RCC简介 二.系统时钟简介 2.1HSE 高速外部时钟信号 2.2锁相环 PLL 2.3系统时钟 SYSCLK 2.4AH ...

  2. 嵌入式开发学习路线图

    之前看到别人在学习视频中的回复,觉得很全面,分享给大家 --------------我就是个搬运工 基础学习Ⅰ---Linux入门        目前嵌入式主要开发环境有 Linux.Wince等:L ...

  3. 嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器B、累加器A和程序状态字PSW)

    嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器.累加器和程序状态字) 累加器A 寄存器B 程序状态字PSW 累加器A 累加器A是ACC(Accumulator)的缩写,累加器A是一个具有特 ...

  4. 嵌入式全栈工程师_我花了半个月,整理出了这篇嵌入式开发学习指南(学习路线+知识点梳理)...

    不好意思久等了 这篇文章让小伙伴们久等了. 一年多以来,关于嵌入式开发学习路线.规划.看什么书等问题,被问得没有一百,也有大几十次了.但是无奈自己对这方面了解有限,所以每次都没法交代,搞得实在不好意思 ...

  5. 嵌入式开发学习笔记9-做一个好玩的LED闪烁

    嵌入式开发学习笔记9-做一个好玩的LED闪烁 前言 实际操作 程序功能 实现思路 程序源码 实现效果展示 前言 LED小灯闪烁实质是控制单片机上的I/O口,通过向I/O口循环输入高低电平,从而控制LE ...

  6. 嵌入式linux学习笔记--TCP通讯整理

    嵌入式linux学习笔记–TCP通讯整理 之前的项目中使用到了比较多的tcp 通讯相关的知识,一直也没有进行整理,今天准备拿出时间好好的整理一下TCP通讯的整个过程.预计会整理linux和window ...

  7. VB6.0开发的计算机串口通讯程序1

    VB6.0开发的计算机串口通讯程序1 下面介绍几个使用VB6.0开发的计算机串口通讯程序,这些程序可以自动发送16进制字符,并接收这些字符.这些程序可以在链接: 链接: https://pan.bai ...

  8. 利用SpiderMonkey进行嵌入式开发——学习总结

    利用SpiderMonkey进行嵌入式开发--学习总结 许峰 2007/07/30 最近在学习javascript引擎SpiderMonkey,学了一个星期了,终于有点眉目,现将学习经验记录下来,已被 ...

  9. 肝了半个月,我整理出了这篇嵌入式开发学习学习路线+知识点梳理)

    不好意思久等了 这篇文章让小伙伴们久等了. 一年多以来,关于嵌入式开发学习路线.规划.看什么书等问题,被问得没有一百,也有大几十次了.但是无奈自己对这方面了解有限,所以每次都没法交代,搞得实在不好意思 ...

最新文章

  1. ASP.NET配置文件Web.config
  2. 【OpenGL】三、Visual Studio 2019 配置 GitHub ( 将项目上传到 GitHub )
  3. windows 10占用cpu和内存过高
  4. Ubuntu 上 Node.js 安装和卸载
  5. range函数python2和3区别_【后端开发】range函数python2和3区别
  6. ffmpeg命令_使用ffmpeg命令为多个短视频修改视频备注说明
  7. 开发函数计算的正确姿势——tensorflow serving
  8. LamBda学习(一)
  9. C#带参数线程的操作
  10. 【论文阅读】Pancreas Segmentation in Abdominal CT Scan: A Coarse-to-Fine Approach 2016
  11. 目标跟踪 MOSSE(Visual Object Tracking using Adaptive Correlation Filters)
  12. HTTP方式文件分片断点下载
  13. excel计算机课程表,Excel居然能做这么漂亮的课程表!(内赠Excel模板)
  14. 基于STM32的CAN通讯测试:让地球仪转起来
  15. 内测体验:JetBrains面向未来的Fleet编辑器是什么+究竟怎样 使用初体验+与vsc对比
  16. 003之可想而知(一)
  17. 工控一体机和常见的平板电脑有什么区别?
  18. 序列化--Serial
  19. DB9针型:RS485输出信号及接线端子引脚分配
  20. 政策更新|9月18日起,产品识别码检查升级

热门文章

  1. 无聊记录下爬取虎牙录播
  2. 基于ymir2.0版本搭建本地化调试的环境
  3. 后缀自动机(我太蒟了!)
  4. 如何让接口性能提升?
  5. rust:读取并显示文本文件
  6. 画论51 沈灏《画尘》
  7. 专访探索AGI的孤勇者,传奇工程师John Carmack:惊讶看不到如我这样的人
  8. boundary()函数寻找三维平面点云精确边界(二)
  9. 大数据为何成为IT行业热门高薪岗位?
  10. 设计原则:单一职责原则