串口通信

2023-05-16

1、什么是串口通信?

  串口通信(Serial CommunicaTIon),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。

  串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。

  2、串口通信协议

  在串口通信中,常用的协议包括RS-232、RS-422和RS-485。

  •RS-232:标准串口,最常用的一种串行通讯接口。有三种类型(A,B和C),它们分别采用不同的电压来表示on和off。最被广泛使用的是RS-232C,它将mark(on)比特的电压定义为-3V到-12V之间,而将space(off)的电压定义到+3V到+12V之间。传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。

  •RS-422:最大传输距离为1219米,最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。

  •RS-485:从RS-422基础上发展而来的,最大传输距离约为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mb/s。

  3、同步通信?异步通信?

  同步通信:是一种比特同步通信技术,要求发收双方具有同频同相的同步时钟信号,只需在传送报文的最前面附加特定的同步字符,使发收双方建立同步,此后便在同步时钟的控制下逐位发送/接收。如:SPI总线,I2C总线。

  异步通信:指两个互不同步的设备通过计时机制或其他技术进行数据传输。也就是说,双方不需要共同的时钟。发送方可以随时传输数据,而接收方必须在信息到达时准备好接收。如:串口(USART)

  4、通信方式

  •单工模式(Simplex CommunicaTIon):单向的数据传输。通信双方中,一方为发送端,一方则为接收端。信息只能沿一个方向传输,使用一根传输线。双方是固定的。

  •半双工模式(Half Duplex):通信使用同一根传输线,既可以发送数据又可以接收数据,但不能同时进行发送和接收。数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。

  •全双工模式(Full Duplex)通信允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。在全双工模式中,每一端都有发送器和接收器,有两条传输线,信息传输效率高。

  5、数据格式

  (1)起始位:起始位必须是持续一个比特时间的“0”,标志传输一个字符的开始。

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

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

  (4)停止位:停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是“1”,标志着传输一个字符的结束。

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

  了解了串口通信的基础知识之后,我们再来看看STM32开发板上是如何实现串口通信的,我以实现printf重定向为例来进行分析!

  先看代码:

  main.c:

什么是串口通信?基于STM32的printf打印输出

  printf.c:

什么是串口通信?基于STM32的printf打印输出

 

什么是串口通信?基于STM32的printf打印输出

  printf.h:

什么是串口通信?基于STM32的printf打印输出

  代码分析:

  1.串口初始化配置

  学了STM串口通信之后,我们知道配置串口通信至少要配置:字长(一次传送的数据长度),波特率(每秒传输的数据位数),奇偶校验位,还有停止位。当然我在

  配置过程中把他们分别设为8,115200,No ,1。

  串口的配置主要与USART_InitTypeDef这个结构体有关,里面存放了控制参数成员:

  

什么是串口通信?基于STM32的printf打印输出

  其实在学习32的时候,一般如果要用到32的内设或者外设,都要进行相应的初始化,也就是相应的结构体成员进行配置,而我们本次要实现的printf重定向,也

  就用到了串口,所以也要对串口进行初始化!而我是用的USART2,所以要对其进行相应的配置。

  查看STM32硬件原理图:

  

什么是串口通信?基于STM32的printf打印输出

  由原理图可知,这个串口是支持TTL电平的,接收数据RX是接在PA3管脚上的,发送数据是接在PA2上的。由于我是要输出到PC上的串口终端,所以PA2要

  设为复用推挽输出模式,PA3设为复用开漏输入模式。

  查看stm32f10x_it.c这个代码可知USART2是挂接在APB1总线上的,GPIO是挂在APB2总线上的,如下所示:

什么是串口通信?基于STM32的printf打印输出

  所以我们在进行时钟初始化的时候要特别注意。

  2.printf重定向

  其实printf重定向就是我们将printf重新定向到串口,也就是我们可以自己重写C的库函数,当连接器检查到用户编写了与C库函数相同的名字,优先采用

  用户编写的函数这样用户就可以实现对库的修改了。

  printf函数实际是一个宏,最终调用的是 fputc(int ch,FILE *f)这个函数,所以我们需要修改这个函数。

  下面我们着重分析一下fputc函数:

  这个库函数调用了两个ST库函数,分别是:USART_GetFlagStatus()与USART_SendData(),形参ch表示串口将要发送的数据,也就是说。当使用printf()时,它先调用fpuc()函数,然后使用ST库的串口发送函数USART_SendData(),把数据转移到发送数据寄存器TDR.触发我们的串口向PC发送一个相应的数据,调用完USART_SendData()之后,

  使用 while(USART_GetFlagStatus(USART2,USART_FLAG_TC) != SET)语句不停的检查串口的数据是否发送完成的标志位TC,一直检查到标志为“完成”,才进行下一步操作,

  要注意的是USART_SendData()每次只发送一个字节的数据!

  注意:由于fputc()函数的形参调用了C库的FILE,所以在程序中加入stdio.h这个头文件,便且在keil的编译器的设置中勾选Use MicroLIB(使用微库)

  3.硬件连接

  首先硬件上我们将USB转串口线的TXD,RXD,GND,分别接在32开发板USART2上的RXD,TXD,GND。

  由于USART2是TTL电平,所以我们用的usb转串口线一定要是支持TTL电平的,否则串口通信不上!

  4.效果图

  串口调试助手显示:

 

什么是串口通信?基于STM32的printf打印输出

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串口通信 的相关文章

  • TMS320F28377X芯片SCI模块RS485通信,数据末尾被0xFF替换的问题解决

    SCI串口通信 用RS232方式 SCI模块 用如下的 直接这样 就可以发送 void Write SCIC Uint8 pBuf Uint16 len rs232 Uint16 i for i 0 i lt len i while Sci
  • 一款linux系统下的串口调试工具 - COMTransmit

    最近在调试linux下的串口的时候找到了一款好用且功能齐全的串口调试工具 跟大家分享一下 COMTransmit的安装 安装包下载地址 64位 链接 https pan baidu com s 1rxGhMtXYNApjhXquPtiW0w
  • C51单片机串口工作的四种方式总结

    方式0 同步移位寄存器输入输出方式 1 利用移位寄存器实现串行 并行的转换 功能 2 波特率 fosc 12 3 RXD P3 0 用于串行数据的输入和输出 TXD P3 1 充当输出的移位时钟 4 数据大小 8位 5 方式0发送 串口接口
  • stm32 串口发数据 0x00 变 0x80

    stm32 串口发数据 0x00 变 0x80 一般配置奇校验odd和偶校验even的时候 会出现这个问题 根本原因是stm32在计算长度的时候 会把校验位也计算进去 所以你之前设置的数据位8要改成数据位9才能正常运行 USART Init
  • Qt5下串口对高频率自发性数据的接收及处理方法

    在项目中需要用Qt5 9采集仪表中的数据 仪表是以200Hz的频率主动向外连续发送数据 发送频率很高 而且主动发送 不需要软件发送一次 再读取一次 而是软件直接读取 这种直接连续读取 有两个关键点 1 如何从接收buffer里面查找出所需的
  • 单片机实现 printf 打印输出,和电脑端一样用

    在学C语言时 printf 很好用 到了单片机 ARM时却不能用 那因为库中的 printf 是定向打印到显示屏的 所以我们把 printf 重新定向打印到串口就可以了 串口助手中就可以显示打印的内容 这样我们在单片机 ARM中就可以 像电
  • 可靠传输的基本概念

    可靠传输的基本概念 使用差错检错技术 接受方的数据链路层就可以检测出真在传输过程中是否出现误码 这取决于数据链路层向上层提供的服务类型 不可靠传输 仅仅丢弃有误码的帧 其他的什么也不做 可靠传输 想方法实现发送端发送什么 接收端就收到什么
  • 一、利用AT指令配置esp8266——esp8266WIFI模块初探&STM32串口通信再探

    文章目录 一 esp8266初探 1 esp8266简介 2 esp8266使用方式 什么是AT指令 通过何种方式发送AT指令 二 STM32串口通信再探 1 printf 函数与串口中断函数 2 例子 小试牛刀 3 例子 再进一步 三 局
  • 组态王和plc之间如何建立通讯?

    这两者之间可以有很多种通讯方式 比如 PROFIBUS MPI 以太网 DDE OPC MODBUS 自由口等 主要还是要看你的PLC选型 以及组网方式 现在最常见 也最常用的大概要数RS485 MODBUS协议下的无线通讯方式了 我们假定
  • STM32串口溢出中断问题

    之前调试程序 遇到了串口溢出中断的问题 导致主程序被卡死 这里总结分享一下经验 希望对读者有用 对于STM32F103系列单片机 使能接收中断后 溢出中断就会自动被使能 那什么时候会发生溢出中断呢 在RXNE 1 的的条件下 也就是上次数据
  • STM32F1应用DMA——串口收发不定长数据

    STM32F1应用DMA 串口收发不定长数据 使用STM32自带DMA传输数据 可以减轻CPU负担 只需设置一些参数即可发送想要发送的数据 以下是STM32F1系列芯片测试过的部分代码 可实现DMA串口收发数据 下图来自STM32官网的手册
  • Python实现串口通信(pyserial)

    Python实现串口通信 pyserial pyserial模块封装了对串口的访问 兼容各种平台 安装 pip insatll pyserial 初始化 简单初始化示例 import serial ser serial Serial com
  • ESP-NOW无线通信

    本文由铁熊与默联合创作 在学习 Arduino 开发的过程中 无线通讯是我们学习道路上一道必过的坎 无线通讯摆脱了线材的束缚 使用更加灵活且通讯距离根据不同无线模块可达几十米甚至是数公里 常见的无线通讯方式有蓝牙 WiFi LoRa NB
  • 获取windows中活跃的Com口

    获取windows中活跃的Com口 记录于2021年11月9日 今天对我来说是个很特殊的一天 母胎SOLO二十一周年 无奈 Orz 闲暇之余写下此文章 记录一下我的日常 文章目录 获取windows中活跃的Com口 前言 一 如何寻找活跃C
  • Arduino基础篇(五)-- 如何快速上手串口通信(Serial)

    文章目录 1 基础篇 1 1 通信基础 2 串口通信 2 1 Arduino串口的硬件结构 2 2 串口工作原理 2 3 硬件串口通信 2 4 软件模拟串口通信 1 基础篇 1 1 通信基础 1 并行通信 通过输入 输出端口在 Arduin
  • LInux下串口编程详解细节

    LInux下串口设置详解 日期 2011 04 01 来源 Linux社区 作者 huang879135 字体 大 中 小 串口的设置主要是设置struct termios结构体的各个成员值 include
  • 基于STM32F103RB的模拟液位检测告警系统(已实现)

    这次先看一下老朋友STM32 有关Zigbee的内容 Z stack协议栈和基于Zigbee的环境温湿度 烟雾传感器的环境监测系统 等有时间再更 基于STM32的模拟液位检测告警系统 记得好像是某一届蓝桥杯省赛题 基于STM32告警系统介绍
  • FPGA笔记8——串口通信(回环实验)

    目录 串口通信原理 串行通信基础知识 处理器与外部设备通信的两种方式 串行通信的通信方式 串行通信的传输方向 常见的串行通信接口 异步串口通信UART基础知识 数据格式 传输速率 接口标准 RS232接口 串口通信实验RS 232 实验任务
  • QT开发遇到的问题(1)——程序循环执行的问题

    我之前一直直接用C 开发工程 有需求需要跨平台开发 前期使用时候感觉还可以 转到工程应用时候 就遇到好多坑 今天就遇到个大坑 在开发时候需要不断循环一块代码来实现某种功能 QT不像C 那种 这个更加专业 下面我对这个问题进行详细说明分析 问
  • 【Python】PyCharm中调用另一个文件的函数或类

    欢迎来到Python专栏 PyCharm中调用另一个文件的函数或类 o o 嗨 我是小夏与酒 博客主页 小夏与酒的博客 该系列文章专栏 Python学习专栏 文章作者技术和水平有限 如果文中出现错误 希望大家能指正 欢迎大家关注 目录 Py

随机推荐

  • 深入浅出C语言:(十)C预处理

    目录 一 C 语言 include 的用法 xff08 文件包含命令 xff09 二 C 语言宏定义 xff08 define 的用法 xff09 1 define 的基础用法 2 C 语言带参数的宏定义 3 对带参宏定义的说明 4 用宏参
  • STM32串口——5个串口的使用方法

    串口是我们常用的一个数据传输接口 xff0c STM32F103系列单片机共有5个串口 xff0c 其中1 3是 通用同步 异步串行接口 USART Universal Synchronous Asynchronous Receiver T
  • Ubuntu18.04 —— 安装环境及运行Vins_mono(2022年)

    Ubuntu18 04 安装环境及运行Vins mono 一 环境安装1 检查安装版本openCVEigenPangolin 二 ubunt18 04使用国内源安装ros及问题解决1 添加国内中科大源2 软件库更新3 安装全功能版本的ROS
  • Ubuntu 18.04 ———(Intel RealSense D435i)运行VINS-Mono

    Intel RealSense D435i 一 准备工作二 修改参数rs camera launchrealsense color config yaml 参考文献 一 准备工作 1 Intel Realsense D435i Ubuntu
  • RPLIDAR全面兼容ROS系统,赋能Mini款无人驾驶汽车

    从技术角度来说 xff0c 无人驾驶系统可分为环境感知 智能规划和决策 自适应控制和车辆底层线控四部分 感知系统主要是通过激光雷达 视觉 惯导等传感器获取 xff0c 并通过数据处理 xff0c 形成决策 目前 xff0c 单线激光雷达用在
  • 激光雷达在机器人中的避障方案

    如今 xff0c 在各种商用场景中服务机器人已屡见不鲜 xff0c 对于一些在餐厅 酒店等地的服务机器人来说 xff0c 往往会面临应用环境复杂多变的情况 xff0c 这就对机器人的避障能力提出了很大的挑战 xff0c 避障是指移动机器人根
  • 单片机的查询和中断两种方式怎么从程序里面看出来

    查询方式就是对某一标志位的不停检测 xff0c 直到发生变化 xff0c 例如 xff0c 汇编 xff1a LOOP JBC TF1 L 查询计数器是否溢出 xff0c 若溢出转L SJMP LOOP xff1b 无溢出转LOOP xff
  • 【STM32】SPI的基本原理、库函数(SPI一般步骤)

    STM32F1xx官方资料 xff1a STM32中文参考手册V10 第23章 串行外设接口SPI SPI的基本介绍 SPI的简介 SPI xff0c 是英语Serial Peripheral interface的缩写 xff0c 顾名思义
  • win10下安装emqx

    下载 进入官网EMQ 点击下载 xff08 这是我所选择的一个版本 xff09 装解压EMQ 1 把下载的EMQ解压到D盘 xff0c 得到一个emqx文件夹 2 启动EMQ step1 Win10 系统的 开始 右键 进入win10 系统
  • Apollo ROS原理(一)

    一 背景介绍 为什么选择ROS 高效的开发支持 1 具有完整的包管理和工程结构 2 庞大的基础库 3 多语言接口支持 模块灵活配置 1 消息驱动的异步运行模型 2 抽象的P2P通信接口 3 自定义的消息格式 丰富的调试工具 1 具有可视化的
  • Java 模板变量替换(字符串、占位符替换)

    1 org apache commons text 变量默认前缀是 xff0c 后缀是 lt dependency gt lt groupId gt org apache pdfbox lt groupId gt lt artifactId
  • Ubuntu16.04——推荐几个Ubuntu16.04镜像下载链接

    ubuntu16 04下载地址 xff1a 中科大源 xff1a http mirrors ustc edu cn ubuntu releases 16 04 阿里云开源镜像站 xff1a http mirrors aliyun com u
  • Matlab中计算程序运行时间的三种方法

    经常我们需要计算我们程序到底运行多长时间 xff0c 这样可以比较程序的执行效率 当然这个对于只有几秒钟的小程序没有什么意义 xff0c 但是对于大程序就有很重要的意义了 下面我们就说说MATLAB中计算程序运行时间的三种常用方法吧 xff
  • 经典力学(动力学)——刚体的转动

    目录 刚体的定轴转动 力矩刚体刚体转动的角速度和角加速度匀变速转动公式角量与线量的关系力矩 转动惯量 转动定律质点的转动惯量 角动量 角动量守恒定律角动量刚体定轴转动的角动量 力矩做功 刚体定轴转动的动能定理力矩做功刚体绕定轴转动的动能定理
  • 转动惯量到底是个什么物理量

    转动惯量 xff0c 对于大多数人可能都很难理解 xff0c 这个问题也困惑博主很久 xff0c 最近本人需要用到建模知识 xff0c 在回顾大学物理时重新学习了什么是转动惯量 xff0c 同时也是参考了几篇博文和知乎文章才基本理解 本人秉
  • ubuntu常见问题及解决方案——yr 不在 sudoers 文件中,此事将被报告,同时,su无法验证的解决办法

    昨晚因为改编译错误 xff0c 修改了sudoers里的内容 xff0c 导致 xff08 1 xff09 用户名 不在sudoers文件中 xff0c 同时 xff0c xff08 2 xff09 su无法验证的解决办法 对于问题 1 网
  • ROS1——ROS自定义消息格式配置相关

    在使用ROS时 xff0c 其自带的消息格式已经使开发人员很方便 xff0c 但是仍然避免不了会有一些特别的消息需要自己去定义 xff0c 此时 xff0c 就需要了解ROS中如何编写配置自定义消息格式 1 新建filename msg文件
  • 百度Apollo规划算法——轨迹拼接

    百度Apollo规划算法 轨迹拼接 引言轨迹拼接1 什么是轨迹拼接 xff1f 2 为什么要进行轨迹拼接 xff1f 3 结合Apollo代码为例理解轨迹拼接的细节 参考 引言 在apollo的规划算法中 xff0c 在每一帧规划开始时会调
  • Ubuntu16.0 ——安装串口驱动

    Ubuntu16 0 安装串口驱动 步骤一 在终端输入sudo apt get install minicom安装串口驱动 步骤二 在终端输入sudo minicom s打开串口配置窗口如下图 使用方向键 选择 Serial port se
  • 串口通信

    1 什么是串口通信 xff1f 串口通信 xff08 Serial CommunicaTIon xff09 xff0c 是指外设和计算机间 xff0c 通过数据信号线 地线等 xff0c 按位进行传输数据的一种通讯方式 串口是一种接口标准